Email: Takayama Fumihiko <tekezo@pqrs.org>

Emacs のあらゆるモードで有効なキーバインドの設定方法 my-keyjack-mode

Emacs のあらゆるモードで有効なキーバインドの設定方法 my-keyjack-mode

Emacs では global-set-key で自由にキーボードショートカットを設定することが出来ます。

有名なものだと C-h を backspace として動かすものですね。

(global-set-key "\C-h" 'backward-delete-char)

よく使う機能にスグに押せるキーを設定しておくと Emacs を使うのが便利になります。

こうして登録していくと問題が

僕は M-q に lookup-pattern をアサインしているのですが、 この M-q の動作が c-mode では fill-paragraph に上書きされてしまいます。

このように、global-set-key による設定はモードによって上書きされてしまって、 あまり使い勝手が良くありません。

そこで

専用のマイナーモードを作り、そのキーバインドの優先度を最大に設定することで あらゆるモードで有効なキーボードショートカットを設定できるようにします。

具体的には以下のような内容を .emacs.el に加えます。 \C-\M-b 〜 meta backspace までの部分は各自好きなように書き替えましょう。

(setq my-keyjack-mode-map (make-sparse-keymap))

(mapcar (lambda (x)
          (define-key my-keyjack-mode-map (car x) (cdr x))
          (global-set-key (car x) (cdr x)))
        '(("\C-\M-b" . iswitchb-buffer)
          ("\C-\M-f" . find-file)
          ("\C-\M-g" . grep-find)
          ("\C-\M-h" . backward-kill-word)
          ("\C-\M-k" . kill-buffer)
          ("\C-\M-m" . man)
          ("\C-\M-w" . my-window-map)
          ("\M-q" . lookup-pattern) ; in c-mode, M-q works special key
          ("\M-s" . delete-horizontal-space)
          ("\C-z" . scroll-down) ; in HTML-mode, C-z works special key
          ("\C-b" . backward-char) ; for liece
          ("\C-u" . (lambda ()
                      (interactive)
                      (let ((pos (point)))
                        (beginning-of-line)
                        (kill-region (point) pos))))
          ([(super o)] . other-window)
          ([?\C-=] . browse-url-generic)
          ([(home)] . beginning-of-buffer)
          ([(end)] . end-of-buffer)
          ([(meta backspace)] . (lambda (arg)
                                  (interactive "p")
                                  (delete-region (point) (progn (forward-word (- arg)) (point)))))
          ))

(easy-mmode-define-minor-mode my-keyjack-mode "Grab keys"
                              t " Keyjack" my-keyjack-mode-map)

Comments for This Page.
Date: 2007-07-22 19:30 (JST)