Last edit
Sammanfattning: Update
Ändrad:
< Doi is a mode that *D*o command *O*r *I*nsert self, this mode for buffer that mix *read-only* area and *edit* area.
till
> Doi is a mode that *Do* command *Or* *Insert* self, this mode for buffer that mix *read-only* area and *edit* area.
Doi is a mode that Do command Or Insert self, this mode for buffer that mix read-only area and edit area.
Example, if current cursor at read-only area, you can do speical command, if current cursor at edit area, it insert character.
It’s very handy for some mode, such as custom-mode-map, erc-mode-map.
Put Lisp:doi.el in your load-path, add
(require 'doi)
in ~/.emacs
Below have example about erc-mode-map:
(define-key erc-mode-map (kbd "SPC") 'doi-scroll-up)
(define-key erc-mode-map (kbd "e") 'doi-scroll-down)
(define-key erc-mode-map (kbd "k") 'doi-previous-line)
(define-key erc-mode-map (kbd "j") 'doi-next-line)
(define-key erc-mode-map (kbd "h") 'doi-backward-char)
(define-key erc-mode-map (kbd "l") 'doi-forward-char)
(define-key erc-mode-map (kbd "J") 'doi-scroll-up-one-line)
(define-key erc-mode-map (kbd "K") 'doi-scroll-down-one-line)
(define-key erc-mode-map (kbd "H") 'doi-backward-word)
(define-key erc-mode-map (kbd "L") 'doi-forward-word)
(define-key erc-mode-map (kbd "y") 'doi-sdcv-search-pointer+)
(define-key erc-mode-map (kbd "s") 'doi-isearch-forward)
(define-key erc-mode-map (kbd "r") 'doi-isearch-backward)
(define-key erc-mode-map (kbd "A") 'doi-move-beginning-of-line)
(define-key erc-mode-map (kbd "E") 'doi-move-end-of-line)
(define-key erc-mode-map (kbd ",") 'doi-end-of-buffer)
(define-key erc-mode-map (kbd ".") 'doi-beginning-of-buffer)
Then you can move cursor move read-only area, and type SPACE to executive scroll up; if cursor is at edit area, you just insert SPACE.
Alike you can setup custom-mode-map similar with above.
(defun doi-setup-my-keys (map)
(dolist (x '(("b" . doi-scroll-down)
(" " . doi-scroll-up)
("j" . doi-next-line)
("k" . doi-previous-line)
("h" . doi-backward-char)
("l" . doi-forward-char)))
(define-key map (car x) (cdr x))))
(setq doi-my-minor-mode-map (make-sparse-keymap))
(doi-setup-my-keys doi-my-minor-mode-map)
(define-minor-mode doi-my-minor-mode
"minor-mode for `doi'.
It is defined AFTER `skk'.")
(add-hook 'rcirc-mode-hook
(lambda () (doi-my-minor-mode 1)))
I prefer minor-mode. – rubikitch
‘doi-key-alist’ for binding many mode with doi commands, you can search ‘doi-key-alist’ in Lisp:LazyCatKeystoke.el – AndyStewartI use SkkMode?, minor-mode for Japanese input. doi-my-minor-mode is defined AFTER SkkMode?. It needs some hack to use Doi with SkkMode?.
(defadvice doi (around skk activate)
(if (not skk-mode)
ad-do-it
(condition-case nil
(progn
(self-insert-command (or arg 1)) ; write a char
(backward-delete-char 1) ; UNDO
(let (doi-my-minor-mode)
;; use skk input
(call-interactively (key-binding (char-to-string last-command-event)))))
(text-read-only
(funcall command)))))
‘doi-insert-function’, you can customize insert function. (defun doi-insert-update (arg)
"The default insert function for `doi'.
ARG is prefix argument."
(if (and (require 'completion-ui nil t)
(member 'auto-completion-mode minor-mode-list))
;; Do `completion-self-insert' when
;; `auto-completion-mode' turn on.
(completion-self-insert)
;; Otherwise do `self-insert-command'.
(self-insert-command (or arg 1)) ; write a char
(backward-delete-char (or arg 1)) ; UNDO
(let (doi-my-minor-mode)
;; use skk input
(call-interactively (key-binding (char-to-string last-command-event))))))
