123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- (require 'erc)
- (require 'comint)
- (require 'ring)
- (define-erc-module ring nil
- "Stores input in a ring so that previous commands and messages can
- be recalled using M-p and M-n."
- ((add-hook 'erc-send-pre-hook 'erc-add-to-input-ring)
- (define-key erc-mode-map "\M-p" 'erc-previous-command)
- (define-key erc-mode-map "\M-n" 'erc-next-command))
- ((remove-hook 'erc-send-pre-hook 'erc-add-to-input-ring)
- (define-key erc-mode-map "\M-p" 'undefined)
- (define-key erc-mode-map "\M-n" 'undefined)))
- (defvar erc-input-ring nil "Input ring for erc.")
- (make-variable-buffer-local 'erc-input-ring)
- (defvar erc-input-ring-index nil
- "Position in the input ring for erc.
- If nil, the input line is blank and the user is conceptually 'after'
- the most recently added item in the ring. If an integer, the input
- line is non-blank and displays the item from the ring indexed by this
- variable.")
- (make-variable-buffer-local 'erc-input-ring-index)
- (defun erc-input-ring-setup ()
- "Do the setup required so that we can use comint style input rings.
- Call this function when setting up the mode."
- (setq erc-input-ring (make-ring comint-input-ring-size))
- (setq erc-input-ring-index nil))
- (defun erc-add-to-input-ring (s)
- "Add string S to the input ring and reset history position."
- (unless erc-input-ring (erc-input-ring-setup))
- (ring-insert erc-input-ring s)
- (setq erc-input-ring-index nil))
- (defun erc-clear-input-ring ()
- "Remove all entries from the input ring, then call garbage-collect.
- You might use this for security purposes if you have typed a command
- containing a password."
- (interactive)
- (setq erc-input-ring (make-ring comint-input-ring-size)
- erc-input-ring-index nil)
- (garbage-collect)
- (message "ERC input ring cleared."))
- (defun erc-previous-command ()
- "Replace current command with the previous one from the history."
- (interactive)
- (unless erc-input-ring (erc-input-ring-setup))
-
- (when (> (ring-length erc-input-ring) 0)
- (if (and erc-input-ring-index
- (= (ring-length erc-input-ring) (1+ erc-input-ring-index)))
- (progn
- (erc-replace-current-command "")
- (setq erc-input-ring-index nil))
-
-
-
-
- (if (null erc-input-ring-index)
- (when (> (point-max) erc-input-marker)
- (erc-add-to-input-ring (buffer-substring erc-input-marker
- (point-max)))
- (setq erc-input-ring-index 0)))
- (setq erc-input-ring-index (if erc-input-ring-index
- (ring-plus1 erc-input-ring-index
- (ring-length erc-input-ring))
- 0))
- (erc-replace-current-command (ring-ref erc-input-ring
- erc-input-ring-index)))))
- (defun erc-next-command ()
- "Replace current command with the next one from the history."
- (interactive)
- (unless erc-input-ring (erc-input-ring-setup))
-
- (when (> (ring-length erc-input-ring) 0)
- (if (and erc-input-ring-index
- (= 0 erc-input-ring-index))
- (progn
- (erc-replace-current-command "")
- (setq erc-input-ring-index nil))
- (setq erc-input-ring-index (ring-minus1 (or erc-input-ring-index 0)
- (ring-length erc-input-ring)))
- (erc-replace-current-command (ring-ref erc-input-ring
- erc-input-ring-index)))))
- (defun erc-replace-current-command (s)
- "Replace current command with string S."
-
- (let ((inhibit-read-only t))
- (delete-region
- (progn (goto-char erc-insert-marker) (erc-bol))
- (goto-char (point-max)))
- (insert s)))
- (provide 'erc-ring)
|