私の Emacs キーバインドの紹介
Emacs のデフォルトのキーバインドって非常に押しづらい上に覚えづらいです。
でも、それって大した問題ではありません。
Emacs は自分好みにキー設定をいじれるところに醍醐味があります。
しかも、他のエディタでは設定できないようなトリッキーな設定も可能です。
そこで、今回は私が使っている Emacs のキー設定を紹介したいと思います。
誰でも気に入るようなものではありませんが、ハマると Emacs 以外のエディターでは満足できなくなるのは請け合いです。
特徴
私のキー設定の最大の特徴は使わない文字を一つつぶし、それを使ったストロークでコマンドを実行することです。使わないキーとしては "@" にしています。 メールアドレスなどでは使われますが、メールアドレスも 「使われてない文字」というのが選ばれた理由です。
この @ の後の組み合わせでコマンドを実行します。 例えば、 @ k で kill-line(C-k)、 @ s で「保存」 save-buffer(C-x C-s) という感じです。
Emacs ではほとんどのキーが割り当て済みですが、これだと既存の割り当てはほぼそのままで、 自分がわかりやすいように設定することができます。
また、 Ctrl キーなどと組み合わせる必要もないため、 個人的にはモードの変更無しで、 Vim のような操作性を実現できているのではないかと思います。
ただ、これはカーソル移動のように続けて押す必要があるものには向いていないため、 基本的に「保存」のように一回で終わるコマンドに割り当てています。
設定ファイル
私のキーバンドを使ってみたいという場合は以下のファイルを load-path の通ったところにおいて、 ロードしてください。(load "my-keyset-light")キーバインドを結構いじっていると、よその Emacs を使うと異常に使いづらくなります。 私が本当に普段使っている設定はインストールしたパッケージや自作の関数などもあり、実はもっと複雑になっています。
このファイルは短期的に使う場合などにファイル 1 つ持ってくるだけで、ある程度キー設定を近づけるために作成したものです。 私の普段のキー設定からデフォルトで使える基本的なコマンドだけ抜き出しています。
Windows における Emacs 外部でのキー設定
Windows 環境では Emacs のキー設定だけでなく、定番のキー設定アプリを使った変更も行っています。- ChgKey
- 左 [Ctrl] <--> [Caps Lock]
- [Esc] <--> [半角]
- [無変換] -> [Back Space]
- AltIME
- [変換] キーでの IME の ON/OFF
ただ、この 2 つだけだったら、 AltIME だけでもできるのですが、 ポイントは [無変換] を [Back Space] にしている点です。 [無変換] は押しやすい場所にあるわりにほとんど使ってません。 そこでよく使う割に遠い [Back Space] にしています。
AltIME の方は何に使っているかというと [変換] で IME を OFF にするためです。 [変換] で ON にはできますが、 OFF にするのが Alt + [半角] って めんどくさいです。 AltIME を使って簡単に切り替えられるようにしています。
カーソル移動
矢印キーはホームポジションから遠いところにあり、当然そんなキーは押しません。 とはいえ、 デフォルトの Emacs のカーソル移動のコマンドの割り当てもわかりづらいです。デフォルト:
前の行 ↑ C-p : : 前の文字 ← C-b .... 現在のカーソル位置 .... 次の文字 → C-f : : 次の行 ↓ C-n
p,n,f,b のキーが、上下左右を表すこともあるので、あまり変えるのもよくありません。
そこで、カーソル移動では、上下は C-p、C-n のままにしておいて、 特にわかりづらい 左右の移動は C-k、C-lにしています。
以下のように記述すると C-k、C-l を押すとそれぞれ C-b、C-f が押されたことになります。
;; 上下は C-p, C-n (そのまま) ;; 左右は C-k, C-l (global-set-key "\C-l" "\C-f") (global-set-key "\C-k" "\C-b")これでダイヤモンドキー配列とまで行きませんが、なんとなくイメージしやすい形になっています。
変更後:
前の行 ↑ C-p : : 前の文字 ← C-k .... 現在のカーソル位置 .... 次の文字 → C-l : : 次の行 ↓ C-n
あまり使わないコマンドの割り当て
「キーバインディング」の記事でも書いていますが、あまり使わないコマンドに割り当てられているキーと Function キーの割り当てです。;; あまり使ってないキーの割り当て (global-set-key "\C-o" 'dabbrev-expand) (global-set-key "\C-z" 'undo)
;; F7 コンパイル ;; F8 eshell (global-set-key (kbd "<f7>") 'compile) (global-set-key (kbd "<f8>") 'eshell)
あまり使用しない文字(@)との組み合わせ
ここから @ キーとの組み合わせによる設定について記述します。まず、変更などをやり易いようにキーマップを作って、@ キーに割り当てています。
(defvar my-atkey-prefix (kbd "@")) (setq my-atkey-map (make-keymap)) (define-key global-map my-atkey-prefix my-atkey-map) (defun my-set-key-atkey-map () (local-set-key my-atkey-prefix my-atkey-map)) (add-hook `hexl-mode-hook 'my-set-key-atkey-map) (add-hook `view-mode-hook 'my-set-key-atkey-map) (add-hook `ediff-keymap-setup-hook '(lambda () (define-key ediff-mode-map my-atkey-prefix my-atkey-map)))global-map に割り当てるだけだとモードによっては割り当てられないので、特殊なモードには個別に割り当てています。
個別の設定をしないようにするには C-t などに割り当てた後、 keyboard-translate で入れ替えるといった方法もあります。 ただ、今回はキーを 2 つもつぶすのはどうかなと思ってやめています。
作成したキーマップに対してコマンドをずらずらっと割り当てています。
どんなキーに割り当てられているコマンドが良く分からない方は、 以前に書いた記事で紹介したコマンドと順番がだいたい同じなので、そちらを参考にしてください。
;; ヘルプ (define-key my-atkey-map "h" 'help-command) ;; カーソル移動 (define-key my-atkey-map "a" 'beginning-of-line) (define-key my-atkey-map "e" 'end-of-line) (define-key my-atkey-map "p" 'beginning-of-buffer) (define-key my-atkey-map "n" 'end-of-buffer) (define-key my-atkey-map "l" 'recenter) (define-key my-atkey-map "j" 'goto-line) ;; コマンド呼び出し (define-key my-atkey-map " " 'execute-extended-command) ;; ファイル (define-key my-atkey-map "f" 'find-file) (define-key my-atkey-map "s" 'save-buffer) (define-key my-atkey-map "w" 'write-file) (define-key my-atkey-map "F" 'set-buffer-file-coding-system) ;; バッファー (define-key my-atkey-map "d" 'kill-buffer) (define-key my-atkey-map "b" 'switch-to-buffer) (define-key my-atkey-map "\C-b" 'list-buffers) ;; Window (define-key my-atkey-map "o" 'other-window) (define-key my-atkey-map "2" 'split-window-vertically) (define-key my-atkey-map "1" 'delete-other-windows) (define-key my-atkey-map "." 'delete-other-windows) (define-key my-atkey-map "0" 'delete-window) ;; クリップボード (define-key my-atkey-map "c" 'kill-ring-save) (define-key my-atkey-map "x" 'kill-region) (define-key my-atkey-map "k" 'kill-line) ;; Ctrl-x r (define-key my-atkey-map "r" ctl-x-r-map) (define-key my-atkey-map "C" 'copy-to-register) (define-key my-atkey-map "y" 'insert-register) ;; 検索、置換 (define-key my-atkey-map "m" 'isearch-forward) (define-key my-atkey-map "u" 'isearch-backward) (define-key my-atkey-map "q" 'query-replace) (define-key my-atkey-map "5" 'query-replace-regexp) ;; プログラミング (define-key my-atkey-map "\t" "\M-\t") (define-key my-atkey-map "t" 'indent-region) (define-key my-atkey-map ";" 'comment-region) ;; キーボードマクロ (define-key my-atkey-map "8" 'kmacro-start-macro) (define-key my-atkey-map "9" 'kmacro-end-macro) (define-key my-atkey-map "7" 'kmacro-end-and-call-macro) ;; その他 (define-key my-atkey-map "+" 'make-directory) (define-key my-atkey-map "z" 'suspend-frame) ;; 占有したキーの代替 (define-key my-atkey-map my-atkey-prefix '(lambda () (interactive) (insert "@")))最後の割り当てで、"@" の文字を入力したい場合は 2 回押すことで入力できるようになっています。
- 関連記事
Facebook コメント
コメント