Emacsはインストールした段階で、既に多くのキーバインドがデフォルトで割り当てられている。それこそカーソルを動かすためのキーバインドであるC-f
やC-b
からファイルを開くC-x C-f
などなど。
パッケージをインストールすると、新たなキーバインドが上書きされたり、加えられたする。
ところで、デフォルトキーバインディングはよほどの猛者でもない限り全てを把握し、利用している人はいないだろう。私自身もよく使うデフォルトキーバインドは全体の10分の1くらいである。ましてや<f1> C-a (about-emacs)
みたいな誰が使うとも知らないショートカットは、この記事を書いていて、初めて知ったし、今後2度と利用する事もないだろうなと思った。
そんな誰が使うかも分からんデフォルトバインディングがEmacsには無数にある。
デフォルトバインディングの憂鬱
デフォルトバインディングの良さはEmacsの操作方法を他のユーザーと共有できることだと思う。もしもカーソルを動かすキーバインドを全てユーザーに委ねてしまったら、人によってカーソルを前に進めるがC-f
だったりC-j
だったりC-g
みたいになってしまう。これでは何かと情報を共有する時に不便である。そう言った意味で、デフォルトバインドがあるのは良いと思う。
以下に私が気がかりしている点をまとめる。
パッケージのキーバインドが上書きする
Emacsの魅力は何と言ってもその拡張性であり、パッケージをインストールしてより使いやすくしていくことにある。例えば、入力補完パッケージのcompanyなんかは多くのユーザーがインストールしているだろう。
パッケージを入れた時、出てくる問題がある。それが新しくどこにキーバーインディングを割り当てるかである。そのパッケージが内部でキーバインドを定義していたり、自分で定義して割り振る場合がそれである。
よく使うショートカットであればあるほど、キー入力は短く、分かりやすくしたいものだ。そうするとだいたいデフォルトキーバインドと重複することが多くなる。もちろん、上書きしても問題ないのだけど、ちょっと気になる。
風になってない感
そんで、自分が設定してないキーバインドがあるのはなんか風に成りきれてない感ある。普段使わない機能をEmacsに与えながら作業しているというのが、それとなく野暮ったいというかなんというか。10得ナイフで使わないツールがあるけど持ち運んでいるようななんとも言えない感じがある。
それなら、一度全部アンバインドして自分が使うものだけ記述して利用しようと思った。
アンバインドする
MacのEmacs27.1のGUI版を利用して設定していく。他のパッケージの影響を極力減らすために空の~/.emacs.d
フォルダを作り、そこに空っぽのinit.el
を用意した。このファイルにアンバインドの設定を記述していく。
まずは一発でデフォルトバインディングをアンバインドする方法を調べた。
How to truly unbind ALL global keybinds?
このコードを記述すると、全てのキーがアンバインドして入力すらできなくなる。
(use-global-map (make-sparse-keymap))
Is there a quick way to unbind keys in Emacs?
なので、ここで紹介されているようにglobal-unset-key
を使って1つ1つアンバインドする。
こんな感じのコードになる。
(dolist (key '(
"アンバインドしたいキーをここに" ;; コメント
...
))
(global-unset-key (kbd key)))
アンバインドする対象
アンバインドする対象はトップの*GUN Emacs*
バッファのFundametalモードでC-h b (describe-bindings)
を実行したときに現れるGlobal Bindings:
だけをアンバインドする。
アンバインドしている順番はC-h b
で表示される順番である。コメントは何をアンバインドしたのかを書いている。普段自分が使っていないコマンドもあったので解説が間違っている箇所もあると思う。
下のコードを~/.emacs.d/init.el
に記述すると、よく使うもの以外のデフォルトキーバインドをアンバインドできるようになっている。
(dolist (key '(
;; C- は Controllキーを押すことで入力できる
"C-@" ;; set-mark-command 選択モードを起動する
;; "C-a" ;; move-beginning-of-line 行の先頭に移動する
;;"C-b" ;; backward-char カーソルを1つ戻る
"C-c" ;; mode-specific-command-prefix 主にユーザが好きにバインドを設定できるキー空間
;; "C-d" ;; delete-char カーソルの下の文字を消す
;; "C-e" ;; move-end-of-line カーソルを行末に移動
;; "C-f" ;; forward-char カーソルを1つ進める
;; "C-g" ;; keyboard-quit キー入力を無効化し初期状態にする
;; "C-h" ;; help-command ヘルプコマンドのプレフィックス
"C-j" ;; electric-newline-and-maybe-indent カーソルのある場所から改行する
"C-k" ;; kill-line 行を削除
;; "C-l" ;; recenter-top-bottom カーソルのある行を画面中央、上部、下部に移動させる
;; "RET" ;; newline 改行
;; "C-n" ;; next-line カーソルを次の行に移動
"C-o" ;; open-line カーソルの下に行を挿入
;; "C-p" ;; previous-line カーソルを上の行に移動
"C-q" ;; quoted-insert キー入力を文字にして挿入
"C-r" ;; isearch-backward カーソルより前を検索
"C-s" ;; isearch-forward カーソルより先を検索
"C-t" ;; transpose-chars カーソル下の文字の前後を交換
"C-u" ;; universal-argument 数の引数を受け取り次の関数に渡す
;; "C-v" ;; scroll-up-command 下へスクロールして進む
;; "C-w" ;; kill-region 選択中の範囲を切り取る
;; "C-x" ;; Control-X-prefix 主にシステムが利用するキー空間
"C-y" ;; yank 切り取り、コピーした内容を貼り付ける
"C-z" ;; suspend-frame Emacs製品によるが基本は終了する
;;"ESC" ;; ESC-prefix 「M-」コマンドのプレフィックス
"C-\\" ;; toggle-input-method Emacs上でタイプする自然言語を切り替える。例えば日本語
"C-]" ;; abort-recursive-edit 再帰的編集やミニバッファ入力を要求したコマンドを中止する
"C-_" ;; undo 操作のやり直し
;; s- はMacならCommandキーまたは C-x @ s で入力できる。例 s-& => C-x @ s-&
"s-&" ;; kill-current-buffer 現在のバッファを破棄する
"s-'" ;; next-window-any-frame ウィンドウがあればそこへ、無ければ次のフレームへ移動する
"s-+" ;; text-scale-adjust 文字を拡大
"s-," ;; customize カスタマイズ画面の起動
"s--" ;; text-scale-adjust 文字を縮小
"s-0" ;; text-scale-adjust 文字のサイズをデフォルトに戻す
"s-:" ;; ispell テキストのスペルチェック、デフォルトでは辞書が無いので動かない
"s-=" ;; text-scale-adjust 文字サイズを拡大?
"s-?" ;; info インフォ画面の起動
"s-C" ;; ns-popup-color-panel カラーピックツールの起動
"s-D" ;; dired ディレクトリ探索編集モードの起動
"s-E" ;; edit-abbrevs 使用するabbrevsの編集
"s-H" ;; ns-do-hide-others OSで動く別のアプリケーションウィンドウを隠す
"s-L" ;; shell-command Linuxコマンドをminiバッファで実行できる
"s-M" ;; manual-entry Linuxコマンドのmanヘルプを参照する
"s-S" ;; ns-write-file-using-panel OSのファイル保存ウィンドウを開きバッファを保存する
"s-^" ;; kill-some-buffers 開いている全てのバッファに対して破棄するかyes noで決める
"s-`" ;; other-frame Emacsフレームを複数開いている場合、別のフレームに移動する
"s-a" ;; mark-whole-buffer バッファ全体を選択
"s-c" ;; ns-copy-including-secondary 標準とサブのkill-ringにもコピーを保存
"s-d" ;; isearch-repeat-backward 1つ前に検索したワードでカーソルより前を検索する
"s-e" ;; isearch-yank-kill コピー切り取りしたyankのワードから検索する
"s-f" ;; isearch-forward カーソルの先の文字を検索する
"s-g" ;; isearch-repeat-forward 検索後、複数の候補の次へカーソルを移動。C-s連打と同じ?
"s-h" ;; ns-do-hide-emacs Emacsフレームを隠す
"s-j" ;; exchange-point-and-mark 前に居たカーソルの場所に移動しその範囲を選択する?
"s-k" ;; kill-current-buffer 現在のバッファを破棄する
"s-l" ;; goto-line 入力した行数に移動する
"s-m" ;; iconify-frame Emacsフレームを最小化ししまう。
"s-n" ;; make-frame 新規Emacsフレームを開く
"s-o" ;; ns-open-file-using-panel ファイルをOSのファイルウィンドウを使って開く
"s-p" ;; ns-print-buffer バッファをプリントする?
"s-q" ;; save-buffers-kill-emacs 未保存のバッファを保存するか確認し、その後Emacsを終了する
"s-s" ;; save-buffer バッファを保存する
"s-t" ;; ns-popup-font-panel フォントパネルを表示しサイズやファミリの変更ができる
"s-u" ;; revert-buffer 開いているバッファの対象ファイルの情報を再読み込みする
"s-v" ;; yank 切り取り、コピーした内容を貼り付ける
"s-w" ;; delete-frame Emacsフレームを閉じる
"s-x" ;; kill-region 選択範囲を切り取る
"s-y" ;; ns-paste-secondary サブのkill-ringに保存された内容を貼り付ける
"s-z" ;; undo 操作のやり直し
"s-|" ;; shell-command-on-region 選択範囲をLinuxコマンドの引数として渡し実行
"s-~" ;; ns-prev-frame 複数Emacsのフレームがある場合1つ前のフレームに移動する
;; C-(特殊キー) Controlキープラス特殊キーのバインド
"C-SPC" ;; set-mark-command 選択モードを起動する
"C--" ;; negative-argument 実行後数字をタイプでマイナス引数をコマンドに渡せる
"C-/" ;; undo 操作のやり直し
"C-0" "C-1" "C-2" "C-3" "C-4" "C-5" "C-6" "C-7" "C-8" "C-9" ;; digit-argument 数を引数としてコマンドに渡す
"C-s-SPC" ;; ns-do-show-character-palette 特殊文字を挿入できるパレットを表示
"<C-M-down>" ;; down-list 1つ下の階層の括弧に移動する
"<C-M-down-mouse-1>" ;; mouse-drag-region-rectangle C-Mを押しながらマウスをクリックしドラッグするとその範囲が選択領域になる
"<C-M-drag-mouse-1>" ;; ignore マウスをドラッグしても何もしない
"<C-M-end>" ;; end-of-defun 関数の終わりまでカーソルを移動
"<C-M-home>" ;; beginning-of-defun 関数の始めまでカーソルを移動
"<C-M-left>" ;; backward-sexp ある整ったレベルで後ろにカーソルを移動
"<C-M-mouse-1>" ;; mouse-set-point クリックした所にカーソルを移動
"<C-M-right>" ;; forward-sexp ある整ったレベルで前にカーソルを移動
"<C-M-up>" ;; backward-up-list 1つ上の階層の開き括弧に移動する
"<C-S-backspace>" ;; kill-whole-line カーソルのある行を削除する
"<C-backspace>" ;; backward-kill-word 単語単位で文字を削除
"<C-delete>" ;; kill-word カーソルのある位置から前に1単語分削除
"<C-down>" ;; forward-paragraph 次の空行までカーソルを移動
"<C-down-mouse-1>" ;; mouse-buffer-menu トップのメニューを表示
"<C-down-mouse-2>" ;; facemenu-menu 標準でこれプラス複雑な操作で多くのコマンドがバインドされている
"<C-end>" ;; end-of-buffer バッファの末尾まで移動
"<C-f10>" ;; buffer-menu-open バッファの簡易メニューを表示
"<C-home>" ;; beginning-of-buffer バッファ先頭に移動
"<C-insert>" ;; kill-ring-save kill-ringに選択範囲を保存(コピー)
"<C-insertchar>" ;; kill-ring-save kill-ringに選択範囲を保存(コピー)
"<C-left>" ;; left-word 左の単語にカーソルを移動
"<C-next>" ;; scroll-left 画面右へスクロールする
"<C-prior>" ;; scroll-right 画面左へスクロールする
"<C-right>" ;; right-word 右の単語にカーソルを移動
"<C-up>" ;; backward-paragraph 1つ上の空行までカーソルを移動
"<C-wheel-down>" ;; mouse-wheel-text-scale マウスホイールで文字サイズの縮小?
"<C-wheel-up>" ;; mouse-wheel-text-scale マウスホイールで文字サイズの拡大?
;; M-(特殊キー) Metaキープラス特殊キーのバインド
"<M-begin>" ;; beginning-of-buffer-other-window 分割された非アクティブのウィンドウ上のカーソルを最上部に移動
"<M-down-mouse-1>" ;;mouse-drag-secondary マウスドラッグでサブの選択範囲を設定
"<M-drag-mouse-1>" ;; mouse-set-secondary マウスドラッグでサブの選択範囲を設定
"<M-end>" ;; end-of-buffer-other-window 分割された非アクティブのウィンドウ上のカーソルを最下部に移動
"<M-f10>" ;; toggle-frame-maximized フレームの最大化を切り替える
"<M-home>" ;; beginning-of-buffer-other-window 分割された非アクティブのウィンドウ上のカーソルを最上部に移動
"<M-left>" ;; left-word 左の単語にカーソルを移動
"<M-mouse-1>" ;; mouse-start-secondary サブ選択範囲の片方の端をクリックした位置に設定する?
"<M-mouse-2>" ;; mouse-yank-secondary サブ選択範囲をクリックした場所に挿入する?
"<M-mouse-3>" ;; mouse-secondary-save-then-kill サブ選択範囲をkill-ringに保存する
"<M-next>" ;; scroll-other-window 分割された非アクティブのウィンドウを下へスクロール
"<M-prior>" ;; scroll-other-window-down 分割された非アクティブのウィンドウ上へスクロール
"<M-right>" ;; right-word 右の単語にカーソルを移動
"<M-wheel-down>" ;; mwheel-scroll やや飛ばし気味で下へスクロール
"<M-wheel-left>" ;; mwheel-scroll やや飛ばし気味で左へスクロール
"<M-wheel-right>" ;; mwheel-scroll やや飛ばし気味で右へスクロール
"<M-wheel-up>" ;; mwheel-scroll やや飛ばし気味で上へスクロール
"<Scroll_Lock>" ;; scroll-lock-mode カーソルの動きとスクロールの動きを固定する
;; S-(特殊キー) Shiftキープラス特殊キーのバインド
"<S-delete>" ;;kill-region 選択中の範囲を切り取る
"<S-insert>" ;; yank 切り取り、コピーした内容を貼り付ける
"<S-insertchar>" ;; yank 切り取り、コピーした内容を貼り付ける
"<S-mouse-1>" ;; mouse-save-then-kill クリックしてリージョンを設定し、2回目はそれを切り取る
"<S-mouse-3>" ;; kmacro-end-call-mouse マウスでクリックした位置にポイントを移動し、kbdマクロを呼び出す
"<S-wheel-down>" ;; mwheel-scroll やや飛ばし気味で下へスクロール
"<S-wheel-left>" ;; mwheel-scroll やや飛ばし気味で左へスクロール
"<S-wheel-right>" ;; mwheel-scroll やや飛ばし気味で右へスクロール
"<S-wheel-up>" ;; mwheel-scroll やや飛ばし気味で上へスクロール
;; 特殊キーのバインド
"<XF86Back>" ;; previous-buffer 現在のバッファより前のバッファを開く
"<XF86Forward>" ;; next-buffer 現在のバッファの次のバッファを開く
"<again>" ;; repeat-complex-command 1つ前に実行したコマンドを繰り返す
"<begin>" ;; beginning-of-buffer バッファ先頭に移動
"<bottom-divider>" ;;Prefix Command
"<bottom-edge>" ;;Prefix Command
"<bottom-left-corner>" ;;Prefix Command
"<bottom-right-corner>" ;;Prefix Command
"<compose-last-chars>" ;; compose-last-chars ?
"<deletechar>" ;; delete-forward-char カーソルの下にある文字を削除
"<delete-frame>" ;; handle-delete-frame Xサーバ向けのフレーム削除イベント?
;;"<down>" ;; next-line 十字キー下でカーソルを下に移動
;;"<down-mouse-1>" ;;mouse-drag-region マウスドラッグで選択範囲を決める
;;"<drag-mouse-1>" ;; mouse-set-region マウスドラッグで選択範囲を決める
"<drag-n-drop>" ;; ns-drag-n-drop MacならFinderからEmacsにファイルをドラッグアンドドロップで開ける
"<deleteline>" ;; kill-line 行を削除
"<end>" ;; end-of-buffer バッファの末尾まで移動
"<execute>" ;; execute-extended-command Emacsのコマンドをミニバッファで実行
"<f1>" ;; help-command Emacsのヘルプコマンド このPrefixはC-hと同じ働きをする
"<f2>" ;; 2C-command 2C-modeのためのプレフィックスコマンド
"<f3>" ;; kmacro-start-macro-or-insert-counter キーボードの操作マクロの登録を開始
"<f4>" ;; kmacro-end-or-call-macro マクロ登録中なら停止、そうでないなら登録したマクロを実行
"<f10>" ;; menu-bar-open Emacsメニューを開く
"<f11>" ;; toggle-frame-fullscreen Emacsのフレームを全画面モードで表示
"<find>" ;; isearch-forward カーソルの先の文字を検索する
"<header-line>" ;; Prefix Command
"<help>" ;; help-command Emacsのヘルプコマンド このPrefixはC-hと同じ働きをする
"<home>" ;; beginning-of-buffer バッファ先頭に移動
"<horizontal-scroll-bar>" ;; Prefix Command
"<iconify-frame>" ;; ignore-event
"<insert>" ;; overwrite-mode カーソルの下の文字を上書きでタイプできるモード
"<insertchar>" ;; overwrite-mode カーソルの下の文字を上書きでタイプできるモード
"<insertline>" ;; open-line カーソルの下に行を挿入
"<kp-end>" ;; end-of-buffer バッファの末尾まで移動
"<kp-home>" ;; beginning-of-buffer バッファ先頭に移動
"<kp-next>" ;; scroll-up-command 下へスクロールして進む
"<kp-prior>" ;; scroll-down-command 上へスクロールする
;;"<left>" ;; left-char 1つ左の文字へカーソルを移動
"<left-edge>" ;; Prefix Command
"<make-frame-visible>" ;; ignore-event
"<menu>" ;; execute-extended-command Emacsのコマンドをミニバッファで実行
"<mode-line>" ;; Prefix Command
;; "<mouse-1>" ;; mouse-set-point マウスでクリックした所にポイントを移動
"<mouse-2>" ;; mouse-yank-primary マウスでクリックした所に選択範囲の文字を挿入
"<mouse-3>" ;; mouse-save-then-kill クリックしてリージョンを設定し、2回目はそれを切り取る
"<mouse-movement>" ;; ignore
"<next>" ;; scroll-up-command スクロールして下へ進む
"<ns-change-font>" ;; ns-respond-to-change-font ?
"<ns-new-frame>" ;; make-frame 新規Emacsウィンドウを開く
"<ns-open-file>" ;; ns-find-file find-fileと同じ?
"<ns-open-file-line>" ;; ns-open-file-select-line ?
"<ns-open-temp-file>" ;; Keyboard Macro ?
"<ns-power-off>" ;; save-buffers-kill-emacs 未保存のバッファを保存するか確認し、その後Emacsを終了する
"<ns-show-prefs>" ;; customize カスタマイズ画面の起動
"<ns-spi-service-call>" ;; ns-spi-service-call ?
"<ns-toggle-toolbar>" ;; ns-toggle-toolbar GUIのツールバーを表示、非表示
"<open>" ;; find-file ファイルを探し、開く
"<prior>" ;; scroll-down-command スクロールして上へ移動
"<redo>" ;; repeat-complex-command 1つ前のコマンドの実行を繰り返す
;;"<right>" ;; right-char 右の文字へカーソルを移動
"<right-divider>" ;; Prefix Command
"<right-edge>" ;; Prefix Command
"<select-window>" ;; handle-select-window ウィンドウ選択のハンドルイベント
"<switch-frame>" ;; handle-switch-frame フレーム選択のハンドルイベント
"<s-kp-bar>" ;; shell-command-on-region 選択範囲をLinuxコマンドの引数として渡し実行
"<s-left>" ;; ns-prev-frame 複数フレームがある時に前のフレームに移動
"<s-right>" ;; ns-next-frame 複数フレームがある場合次のフレームに移動
"<tab-line>" ;; Prefix Command
"<top-edge>" ;; Prefix Command
"<top-left-corner>" ;; Prefix Command
"<top-right-corner>" ;; Prefix Command
"<undo>" ;; undo 操作のやり直し
;;"<up>" ;; previous-line カーソルを上の行に移動
"<vertical-line>" ;; Prefix Command
"<vertical-scroll-bar>" ;; Prefix Command
;;"<wheel-down>" ;; mwheel-scroll やや飛ばし気味で下へスクロール
;;"<wheel-left>" ;; mwheel-scroll やや飛ばし気味で左へスクロール
;;"<wheel-right>" ;; mwheel-scroll やや飛ばし気味で右へスクロール
;;"<wheel-up>" ;; mwheel-scroll やや飛ばし気味で上へスクロール
;;C-h ヘルプ系コマンド
"C-h C-a" ;; about-emacs Emacsのトップページ
"C-h C-c" ;; describe-copying Emacsの著作情報
"C-h C-d" ;; view-emacs-debugging Emacs上でのデバッグ方法について
"C-h C-e" ;; view-external-packages Emacsの外部パッケージの利用について
"C-h C-f" ;; view-emacs-FAQ Emacsの利用についての簡単なFAQ
"C-h RET" ;; view-order-manuals Emacsのマニュアル購入について
"C-h C-n" ;; view-emacs-news 最新の変更に関する情報を表示
"C-h C-o" ;; describe-distribution GNU Emacsの最新版の入手方法を表示
"C-h C-h" ;; help-for-help どのようなヘルプがあるか表示
"C-h C-p" ;; view-emacs-problems 発覚しているEmacsの問題について
"C-h C-s" ;; search-forward-help-for-help ヘルプウィンドウを開き検索する
"C-h C-t" ;; view-emacs-todo Emacs開発におけるTodo
"C-h C-w" ;; describe-no-warranty Emacsが保持していない保証に関する情報を表示
"C-h C-\\" ;; describe-input-method 自然言語入力に関する情報を表示
"C-h ." ;; display-local-help ローカルのヘルプを表示?
"C-h 4" ;; Prefix Command 1つだけiというキーバインドがある
"C-h ?" ;; help-for-help どのようなヘルプがあるか表示
"C-h C" ;; describe-coding-system 利用している文字エンコードを表示?
"C-h F" ;; Info-goto-emacs-command-node コマンドを検索し、それの解説ドキュメントに移動
"C-h I" ;; describe-input-method 自然言語入力に関する情報を表示
"C-h K" ;; Info-goto-emacs-key-command-node キー入力から対応するコマンドのドキュメントを表示
"C-h L" ;; describe-language-environment Emacsの自然言語対応に関する情報を表示
"C-h P" ;; describe-package 指定のパッケージドキュメントを表示
"C-h S" ;; info-lookup-symbol シンボルの定義とそのマニュアルを表示
"C-h a" ;; apropos-command コマンドをキーワードからざっくり検索
"C-h b" ;; describe-bindings 定義されているキーバインドを表示
"C-h c" ;; describe-key-briefly キータイプやマウス操作にバインドされているコマンド名を表示
"C-h d" ;; apropos-documentation コマンドをキーワードからざっくり検索しドキュメントも表示
"C-h e" ;; view-echo-area-messages エコーエリアに表示されたメッセージを表示
"C-h f" ;; describe-function コマンドのドキュメントを表示
"C-h g" ;; describe-gnu-project GNUプロジェクトとはを表示
"C-h h" ;; view-hello-file Emacsがサポートする自然言語の一覧をHelloで表示
"C-h i" ;; info インフォ画面の起動
"C-h k" ;; describe-key キー入力でバインドされているコマンドのドキュメントを表示
"C-h l" ;; view-lossage ユーザーがタイプしたキーの履歴を表示
"C-h m" ;; describe-mode 現在のメージャーモードとマイナーモードのドキュメントを表示
"C-h n" ;; view-emacs-news 最新の変更に関する情報を表示
"C-h o" ;; describe-symbol シンボルの定義とそのマニュアルを表示
"C-h p" ;; finder-by-keyword キーワードからパッケージを検索
"C-h q" ;; help-quit ヘルプページを離脱
"C-h r" ;; info-emacs-manual Emacsのマニュアルを起動
"C-h s" ;; describe-syntax 特殊文字等の一覧を表示
"C-h t" ;; help-with-tutorial Emacsのチュートリアルを起動
"C-h v" ;; describe-variable Emacsで定義されている変数を検索
"C-h w" ;; where-is コマンドがどのキーにバインドされているか調べる
"C-h <f1>" ;; help-for-help どのようなヘルプがあるか表示
"C-h <help>" ;; help-for-help どのようなヘルプがあるか表示
;; C-x C- のキーバインド
"C-x C-@" ;; pop-global-mark 全てのバッファで選択範囲を指定した箇所に移動する
;;"C-x C-b" ;; list-buffers バッファのリスト一覧を表示
;;"C-x C-c" ;; save-buffers-kill-terminal バッファを保存しアプリケーションを終了
"C-x C-d" ;; list-directory ディレクトリを移動し、RETでそのディレクトリに含まれるファイルを表示
"C-x C-e" ;; eval-last-sexp Lispコードにおいて1つ前のコードを実行する
;; "C-x C-f" ;; find-file ファイルを探し、バッファに展開
"C-x TAB" ;;indent-rigidly 選択範囲かプログラムのインデントレベルで十字キーでインデントを調整
"C-x C-k" ;; kmacro-keymap キーボードマクロのprefix command
"C-x C-l" ;; downcase-region 選択範囲の大文字を小文字に変換
;; "C-x RET" ;; Prefix Command
"C-x C-n" ;; set-goal-column 横方向の現在のカーソルの位置を記憶しC-n,C-pで再度その行に訪れた際に記録した場所にカーソルを置く
"C-x C-o" ;; delete-blank-lines カーソルのラインとその下の空行を削除する
"C-x C-p" ;; mark-page バッファ全体を選択する
"C-x C-q" ;; read-only-mode バッファを書き込み不可モードにする
"C-x C-r" ;; find-file-read-only ファイルを選択肢、書き込み不可で開く
;;"C-x C-s" ;; save-buffer バッファを保存する
"C-x C-t" ;; transpose-lines カーソルのある行とその上の行を入れ替える
"C-x C-u" ;;upcase-region 選択範囲の文字を大文字に変更する
"C-x C-v" ;; find-alternate-file 名前を間違えて開いたバッファ上で、本来開きたいファイルを開くとそれと置き換える
"C-x C-w" ;; write-file 現在のバッファを別名で保存
"C-x C-x" ;; exchange-point-and-mark 選択範囲のカーソルの位置を開始位置に移動
"C-x C-z" ;; suspend-frame Emacs製品によるが基本は終了する
;; "C-x ESC" ;; Prefix Command
"C-x SPC" ;; rectangle-mark-mode 矩形モードを起動する
"C-x $" ;; set-selective-display ?
"C-x '" ;; expand-abbrev 略称を展開する
"C-x (" ;; kmacro-start-macro キーボードマクロの記録を開始
"C-x )" ;; kmacro-end-macro キーボードマクロの記録を終了
"C-x *" ;; calc-dispatch Emacsの計算ツールCalcの処理に進む
"C-x +" ;; balance-windows ウィンドウのサイズを微調整する
"C-x -" ;; shrink-window-if-larger-than-buffer バッファがそれほど多くの行を必要としない場合、ウィンドウの高さを縮小する
"C-x ." ;; set-fill-prefix
"C-x 0" ;; delete-window ペインが複数に分割されていた時、アクティブなペインを閉じる
;;"C-x 1" ;; delete-other-windows ペインが複数に分割されていた時、アクティブなペイン以外を閉じる
"C-x 2" ;; split-window-below 上と下にウィンドウを分割
;;"C-x 3" ;; split-window-right 左右にウィンドウを分割
;; "C-x 4" ;; ctl-x-4-prefix
;; "C-x 5" ;; ctl-x-5-prefix
"C-x 6" ;; 2C-command 2C-modeのためのプレフィックスコマンド
;; "C-x 8" ;; Prefix Command
"C-x ;" ;; comment-set-column カーソルの位置を起点にコメントアウトする
"C-x <" ;; scroll-left 画面右へスクロールする
"C-x =" ;; what-cursor-position カーソルの位置情報をエコーエリアに表示
"C-x >" ;; scroll-right 画面左へスクロールする
"C-x [" ;; backward-page バッファの一番上に移動
"C-x ]" ;; forward-page バッファの一番下に移動
"C-x ^" ;; enlarge-window 選択中のウィンドウを拡大する?
"C-x `" ;; next-error エラーメッセージ部分に移動する
;; "C-x a" ;; Prefix Command
;;"C-x b" ;; switch-to-buffer バッファの切り替え
"C-x d" ;; dired ディレクトリ探索編集モードの起動
"C-x e" ;; kmacro-end-and-call-macro キーボードマクロを呼び出す。もしも登録中ならそれを終えて実行する
"C-x f" ;; set-fill-column ?
"C-x h" ;; mark-whole-buffer バッファ全体を選択
"C-x i" ;; insert-file 現在のバッファにミニバッファで選択肢たファイルの内容を挿入する
"C-x k" ;; kill-buffer 対話式でバッファを選択して終了する
"C-x l" ;; count-lines-page バッファの行数を表示
"C-x m" ;; compose-mail メール送信ダイアログを表示
;; "C-x n" ;; Prefix Command
;;"C-x o" ;; other-window 別のウィンドウにカーソルを移動
"C-x q" ;; kbd-macro-query キーボード実行中のクエリ
;; "C-x r" ;; Prefix Command
"C-x s" ;; save-some-buffers 未保存のバッファを連続して保存
;; "C-x t" ;; Prefix Command
"C-x u" ;; undo 操作のやり直し
;; "C-x v" ;; vc-prefix-map
"C-x z" ;; repeat 1つ前に実行したコマンドを繰り返す
"C-x {" ;; shrink-window-horizontally ウィンドウを水平方向に狭める
"C-x }" ;; enlarge-window-horizontally ウィンドウを水平方向に拡大する
"C-x DEL" ;; backward-kill-sentence カーソルから後ろのセンテンスの終わりまで削除
"C-x C-SPC" ;; pop-global-mark 全てのバッファで選択範囲を指定した箇所に移動する
"C-x C-+" ;; text-scale-adjust 文字を拡大
"C-x C--" ;; text-scale-adjust 文字を縮小
"C-x C-0" ;; text-scale-adjust 文字サイズをデフォルトに戻す
"C-x C-;" ;; comment-line 行をコメントアウト
"C-x C-=" ;; text-scale-adjust 文字を拡大
"C-x <C-left>" ;; previous-buffer 前のバッファに移動
"C-x <C-right>" ;; next-buffer 次のバッファへ移動
"C-x <left>" ;; previous-buffer 前のバッファに移動
"C-x <right>" ;; next-buffer 次のバッファへ移動
"M-0" "M-1" "M-2" "M-3" "M-4" "M-5" "M-6" "M-7" "M-8" "M-9" ;; digit-argument 数を引数としてコマンドに渡す
;; C-M- ControllキープラスMetaキーのキーバインド
"C-M-@" ;; mark-sexp ある程度のまとまりでカーソル前進させ選択する
"C-M-a" ;; beginning-of-defun 関数の始めまでカーソルを移動
"C-M-b" ;; backward-sexp ある程度のまとまりでカーソルを後ろに移動
"C-M-c" ;; exit-recursive-edit 再帰的に編集状態を破棄する
"C-M-d" ;; down-list 1つ下の階層の括弧に移動する
"C-M-e" ;; end-of-defun 関数の終わりまでカーソルを移動
"C-M-f" ;; forward-sexp ある整ったレベルで前にカーソルを移動
"C-M-h" ;; mark-defun 関数全体を選択し、カーソルを関数の先頭に移動
"C-M-j" ;; default-indent-new-line 改行してインデントを考慮してカーソルを移動
"C-M-k" ;; kill-sexp ある程度のまとまりで文字を削除する
"C-M-l" ;; reposition-window ウィンドウの位置を調整
"C-M-n" ;; forward-list 同じ階層の次のリストへ移動
"C-M-i" ;; complete-symbol lispのシンボルを補完する
"C-M-o" ;; split-line 改行して改行先にカーソルを移動する
"C-M-p" ;; backward-list 同じ階層の前のリストへ移動する
"C-M-r" ;; isearch-backward-regexp カーソルより前の文字を正規表現で検索する
"C-M-s" ;; isearch-forward-regexp カーソルより先の文字を正規表現で検索する
"C-M-t" ;; transpose-sexps 単語レベルで前後を入れ替える
"C-M-u" ;; backward-up-list 1つ上の階層の開き括弧に移動する
"C-M-v" ;; scroll-other-window 分割された非アクティブのウィンドウを下へスクロール
"C-M-w" ;; append-next-kill ?
"ESC ESC" ;; Prefix Command
"C-M-\\" ;; indent-region 選択している範囲のインデントを調整する
;; M- Metaキーのキーバインド
"M-SPC" ;; just-one-space カーソルの周りのタブやインデントを削除し、スペース1つにする
"M-!" ;; shell-command Linuxコマンドをminiバッファで実行できる
"M-$" ;; ispell-word カーソルの周りのスペルをチェック
"M-%" ;; query-replace 対話的にキーワードを置換する
"M-&" ;; async-shell-command 非同期でLinuxコマンドを実行する
"M-'" ;; abbrev-prefix-mark 現在のポイントをabbrevの始まりとしてマーク
"M-(" ;; insert-parentheses Lispの開き括弧閉じ括弧を挿入する
"M-)" ;; move-past-close-and-reindent 次の')'を越えて、インデントを削除した後インデンする
"M-," ;; xref-pop-marker-stack M-.を最後に起動した場所にポップバックします。
"M--" ;; negative-argument 実行後数字をタイプでマイナス引数をコマンドに渡せる
"M-." ;; xref-find-definitions Emacsの関数を検索し、関数定義のコードにジャンプする
"M-/" ;; dabbrev-expand カーソル直前の単語を、 バッファ内にある単語で補完する
"M-:" ;; eval-expression ミニバッファでLispコードを実行
"M-;" ;; comment-dwim 選択範囲があればコメントアウト、そうじゃない場合は行末にコメント
;;"M-<" ;; beginning-of-buffer バッファ先頭に移動
"M-=" ;; count-words-region 選択範囲にある文字数や行数を表示
;;"M->" ;; end-of-buffer バッファの末尾まで移動
"M-?" ;; xref-find-references フォルダを指定して、その中に含まれるシンボルや関数を検索
"M-@" ;; mark-word 単語レベルで選択範囲を拡大
"M-\\" ;; delete-horizontal-space カーソルの周りにあるスペースを全て削除
"M-^" ;; delete-indentation インデントと改行を削除して前の行の末尾に連結
"M-`" ;; tmm-menubar CUIベースのメニュー
"M-a" ;; backward-sentence 前のセンテンスにカーソルを移動
;;"M-b" ;; backward-word 前の単語へカーソルを移動
"M-c" ;; capitalize-word カーソルの位置にある文字を大文字にし、単語の末尾に移動
"M-d" ;; kill-word カーソルの1から単語の終わりまで削除
"M-e" ;; forward-sentence 次のセンテンスへ移動
;;"M-f" ;; forward-word 次の単語へ移動
;;"M-g" ;; Prefix Command
"M-h" ;; mark-paragraph パラグラフ全体を選択
"M-i" ;; tab-to-tab-stop タブかスペースを挿入
"M-j" ;; default-indent-new-line 改行してカーソルをインデントに合わせて移動
"M-k" ;; kill-sentence センテンス全体を削除
"M-l" ;; downcase-word カーソルの位置にある文字を小文字にし、単語の末尾に移動
"M-m" ;; back-to-indentation カーソルのある行のインデントを含めない先頭に移動
;; "M-o" ;; facemenu-keymap 文字の装飾のprefix
"M-q" ;; fill-paragraph 長い文章を適度な長さで改行する
"M-r" ;; move-to-window-line-top-bottom カーソルをウィンドウの中央、上部、下部に移動
;;"M-s" ;; Prefix Command
"M-t" ;; transpose-words 単語レベルで前後を置換する
"M-u" ;; upcase-word カーソルより前の文字を大文字に変更する
;;"M-v" ;; scroll-down-command スクロールしてバッファを上に移動
;;"M-w" ;; kill-ring-save 選択範囲をコピーする
;;"M-x" ;; execute-extended-command Emacsのコマンドをミニバッファで実行
"M-y" ;; yank-pop yankして貼り付けた直後に実行すると1つ前のyankを代わりに挿入する
"M-z" ;; zap-to-char 文字を1つ入力しバッファ上に出現するまで削除
"M-{" ;; backward-paragraph 1つ上の空行までカーソルを移動
"M-|" ;; shell-command-on-region 選択範囲をLinuxコマンドの引数として渡し実行
"M-}" ;; forward-paragraph 1つ下の空行までカーソルを移動
"M-~" ;; not-modified 未保存でも現在のバッファは差分は存在しないとする
"M-DEL" ;; backward-kill-word 単語レベルで文字を削除
"M-s-h" ;; ns-do-hide-others Emasc以外のアプリケーションを全て隠す
;; C-M- ControllキープラスMetaキーのキーバインド
"C-M-S-v" ;; scroll-other-window-down 分割された非アクティブのウィンドウ上へスクロール
"C-M-SPC" ;; mark-sexp ある程度のまとまりでカーソル前進させ選択する
"C-M-%" ;; query-replace-regexp 対話的に正規表現で検索しキーワードを置換する
"C-M--" ;; negative-argument 実行後数字をタイプでマイナス引数をコマンドに渡せる
"C-M-." ;; xref-find-apropos Emacsの関数を検索
"C-M-/" ;; dabbrev-completion abbrevの補完を使用
"C-M-0" "C-M-1" "C-M-2" "C-M-3" "C-M-4" "C-M-5" "C-M-6" "C-M-7" "C-M-8" "C-M-9" ;; digit-argument 数を引数としてコマンドに渡す
;; ESCプラス特殊キー
"ESC <C-backspace>" ;; backward-kill-sexp ある程度のまとまりまでカーソルより後ろの文字を削除
"ESC <C-delete>" ;; backward-kill-sexp ある程度のまとまりまでカーソルより後ろの文字を削除
"ESC <C-down>" ;; down-list 1つ下の階層の括弧に移動する
"ESC <C-end>" ;; end-of-defun 関数の終わりまでカーソルを移動
"ESC <C-home>" ;; beginning-of-defun 関数の始めまでカーソルを移動
"ESC <C-left>" ;; backward-sexp ある程度のまとまりでカーソルを後ろに移動
"ESC <C-right>" ;; forward-sexp ある整ったレベルで前にカーソルを移動
"ESC <C-up>" ;; backward-up-list 1つ上の階層の開き括弧に移動する
"ESC <begin>" ;; beginning-of-buffer-other-window 分割された非アクティブのウィンドウ上のカーソルを最上部に移動
"ESC <end>" ;; end-of-buffer-other-window 分割された非アクティブのウィンドウ上のカーソルを最下部に移動
"ESC <f10>" ;; toggle-frame-maximized フレームの最大化を切り替える
"ESC <home>" ;; beginning-of-buffer-other-window 分割された非アクティブのウィンドウ上のカーソルを最上部に移動
"ESC <left>" ;; backward-word 前の単語へカーソルを移動
"ESC <next>" ;; scroll-other-window 分割された非アクティブのウィンドウを下へスクロール
"ESC <prior>" ;; scroll-other-window-down 分割された非アクティブのウィンドウ上へスクロール
"ESC <right>" ;; forward-word 次の単語へ移動
;; M-s Prefix
;; "M-s ESC" ;; Prefix Command
"M-s ." ;; isearch-forward-symbol-at-point カーソルがある場所のシンボルを検索
"M-s _" ;; isearch-forward-symbol Lispコードのシンボルを検索
;; "M-s h" ;; Prefix Command
"M-s o" ;; occur バッファに含まれるキーワードを検索し、全てのラインを表示
"M-s w" ;; isearch-forward カーソルの先の文字を検索する
;; M-o Prefix
;;"M-o ESC" ;;Prefix Command
"M-o b" ;; facemenu-set-bold
"M-o d" ;; facemenu-set-default
"M-o i" ;; facemenu-set-italic
"M-o l" ;; facemenu-set-bold-italic
"M-o o" ;; facemenu-set-face
"M-o u" ;; facemenu-set-underline
;; M-g Prefix
"M-g TAB" ;; move-to-column 現在のカーソルの位置から入力数字分右へ移動
;;"M-g ESC" ;; Prefix Command
"M-g c" ;; goto-char バッファの上から入力した数字分の文字へ移動
"M-g g" ;; goto-line 入力した数字の行に移動
"M-g n" ;; next-error エラーメッセージ部分に移動する
"M-g p" ;; previous-error 前のエラーメッセージに移動
;; C-x RET Prefix
"C-x RET C-\\" ;; set-input-method 入力する自然言語の種類を選択
"C-x RET F" ;; set-file-name-coding-system ファイル名の文字のコーディングシステムを指定?
"C-x RET X" ;; set-next-selection-coding-system 別のウィンドウのコーディングシステムを指定?
"C-x RET c" ;; universal-coding-system-argument I/O系のコーディングシステムを指定?
"C-x RET f" ;; set-buffer-file-coding-system ファイルのコーディングシステムを指定
"C-x RET k" ;; set-keyboard-coding-system キーボードのコーディングシステムを指定
"C-x RET l" ;; set-language-environment 自然言語の種類を指定?
"C-x RET p" ;; set-buffer-process-coding-system バッファのプロセスのコーディングシステムを指定?
"C-x RET r" ;; revert-buffer-with-coding-system ?
"C-x RET t" ;; set-terminal-coding-system ターミナルのコーディングシステムを指定
"C-x RET x" ;; set-selection-coding-system ?
;; C-x ESC Prefix
"C-x ESC ESC" ;; repeat-complex-command 1つ前のコマンドの実行を繰り返す
"C-x M-:" ;; repeat-complex-command 1つ前のコマンドの実行を繰り返す
;; C-x 4 Prefix
"C-x 4 C-f" ;; find-file-other-window ファイルを探し、別のウィンドウで開く
"C-x 4 C-o" ;; display-buffer バッファを指定し、別のウィンドウで開く
"C-x 4 ." ;; xref-find-definitions-other-window
"C-x 4 0" ;; kill-buffer-and-window アクティブなウィンドウのバッファを破棄してウィンドウを閉じる
"C-x 4 a" ;; add-change-log-entry-other-window 別ウィンドウでファイルのチェンジログファイルを開く
"C-x 4 b" ;; switch-to-buffer-other-window バッファを別のウィンドウを開く
"C-x 4 c" ;; clone-indirect-buffer-other-window 開いているバッファを別のウィンドウでも開く
"C-x 4 d" ;; dired-other-window ディレクトリを探索し、別のウィンドウで開く
"C-x 4 f" ;; find-file-other-window ファイルを探索し、別のウィンドウで開く
"C-x 4 m" ;; compose-mail-other-window 別のウィンドウでメールダイアログを開く
"C-x 4 r" ;; find-file-read-only-other-window 読む専用でファイルを開く
;; C-x 5 Prefix
"C-x 5 C-f" ;; find-file-other-frame ファイルを探し、別のフレームで開く
"C-x 5 C-o" ;; display-buffer-other-frame バッファを指定し、別のフレームで開く
"C-x 5 ." ;; xref-find-definitions-other-frame Emacsの関数を検索しそれが書かれているファイルを別のフレームで開く
"C-x 5 0" ;; delete-frame 開いているフレームを閉じる
"C-x 5 1" ;; delete-other-frames アクティブなフレーム以外のフレームを閉じる
"C-x 5 2" ;; make-frame-command 新しいフレームを作成
"C-x 5 b" ;; switch-to-buffer-other-framefafa 別フレームを作成しバッファを開く
"C-x 5 d" ;; dired-other-frame ディレクトリを探索し、別のフレームで開く
"C-x 5 f" ;; find-file-other-window ファイルを探索し、別のウィンドウで開く
"C-x 5 m" ;; compose-mail-other-frame 別のフレームでメールダイアログを開く
"C-x 5 o" ;; other-frame Emacsフレームを複数開いている場合、別のフレームに移動する
"C-x 5 r" ;; find-file-read-only-other-frame 別のフレームで読み取り専用でファイルを開く
;; C-x 8 Prefix
"C-x 8 RET" ;; insert-char UnicodeかHexを入力してバッファに挿入
;; C-x a Prefix
"C-x a C-a" ;; add-mode-abbrev カーソルの前の単語をabbrevの略語として定義する?
"C-x a '" ;; expand-abbrev 略称を展開する
"C-x a +" ;; add-mode-abbrev ポイントの前の最後の単語をモード固有の略語として定義する?
"C-x a -" ;; inverse-add-global-abbrev カーソルの前の最後の単語をグローバルなabbrevにする
"C-x a e" ;; expand-abbrev 略称を展開する
"C-x a g" ;; add-global-abbrev ポイントの前の最後の単語をグローバルなabbrevとして定義する?
;;"C-x a i" ;; Prefix Command
"C-x a l" ;; add-mode-abbrev カーソルの前の単語をabbrevの略語として定義する?
"C-x a n" ;; expand-jump-to-next-slot カーソルを最後の省略展開の次のスロットに移動
"C-x a p" ;; expand-jump-to-previous-slot カーソルを最後の省略展開の前のスロットに移動
;; C-x n Prefix
"C-x n d" ;; narrow-to-defun 関数の中のコードのみを表示しそれ以外を隠す
"C-x n n" ;; narrow-to-region 選択中の範囲のみを表示し、それ以外を隠す
"C-x n p" ;; narrow-to-page 現在のページ以外を非表示にする
"C-x n w" ;; widen 隠していた範囲を表示する
;; C-x r Prefix
"C-x r C-@" ;; point-to-register 現在のカーソルの位置を登録
;; "C-x r ESC" ;; Prefix Command
"C-x r SPC" ;; point-to-register 現在のカーソルの位置を登録
"C-x r +" ;; increment-register ?
"C-x r M" ;; bookmark-set-no-overwrite バッファをブックマークに追加
"C-x r N" ;; rectangle-number-lines 選択した範囲の行頭に数字を挿入する
"C-x r b" ;; bookmark-jump ブックマークしたバッファに移動する
"C-x r c" ;; clear-rectangle 長方形リージョンを空白にする
"C-x r d" ;; delete-rectangle 長方形リージョンを削除する
"C-x r f" ;; frameset-to-register フレームを登録する
"C-x r g" ;; insert-register 登録されたテキストを挿入
"C-x r i" ;; insert-register 登録されたテキストを挿入
"C-x r j" ;; jump-to-register
"C-x r k" ;; kill-rectangle 矩形リージョンを削除し、kill-ringに保存
"C-x r l" ;; bookmark-bmenu-list 登録したバッファのリストを表示
"C-x r m" ;; bookmark-set バッファをブックマークに追加
"C-x r n" ;; number-to-register 数字を登録
"C-x r o" ;; open-rectangle 矩形で選択された範囲分の空白をそこに挿入
"C-x r r" ;; copy-rectangle-to-register 矩形の範囲をコピーする
"C-x r s" ;; copy-to-register 選択範囲をコピーし登録
"C-x r t" ;; string-rectangle 矩形の範囲を削除しそれぞれの行に入力した文字を挿入する
"C-x r w" ;; window-configuration-to-register ウィンドウの設定を登録する
"C-x r x" ;; copy-to-register 選択範囲をコピーし登録
"C-x r y" ;; yank-rectangle 最後に矩形で登録した内容を貼り付ける
"C-x r C-SPC" ;; point-to-register 現在のカーソルの位置を登録
;; C-x t Prefix
"C-x t C-f" ;; find-file-other-tab ファイルを別タブで開く
"C-x t RET" ;; tab-bar-select-tab-by-name タブ名を指定して移動
"C-x t 0" ;; tab-close 現在いるタブを閉じる
"C-x t 1" ;; tab-close-other 現在いるタブ以外を閉じる
"C-x t 2" ;; tab-new 新しくタブを作成する
"C-x t b" ;; switch-to-buffer-other-tab バッファを選び新規タブで開く
"C-x t d" ;; dired-other-tab ディレクトリを選択して新規タブで開く
"C-x t f" ;; find-file-other-tab ファイルを別タブで開く
"C-x t m" ;; tab-move タブの並び順を変更する
"C-x t o" ;; tab-next 次のタブへ移動
"C-x t r" ;; tab-rename タブ名を変更
;; C-x v Prefix
"C-x v +" ;; vc-update gitのリモートレポジトリ情報を更新
"C-x v =" ;; vc-diff 開いているファイルの差分を表示
"C-x v D" ;; vc-root-diff リポジトリ全体の差分を表示
"C-x v G" ;; vc-ignore ?
"C-x v I" ;; vc-log-incoming リモートにある別のユーザーのコミットを取得?
"C-x v L" ;; vc-print-root-log リポジトリのログを表示
;; "C-x v M" ;; Prefix Command
"C-x v O" ;; vc-log-outgoing リモートに送る自分のコミットを表示?
"C-x v P" ;; vc-push git pushする
"C-x v a" ;; vc-update-change-log チェンジログファイルがあればそれにgit logを追加
"C-x v b" ;; vc-switch-backend Backendを作る?
"C-x v d" ;; vc-dir vc dir modeを起動
"C-x v g" ;; vc-annotate 現在のバッファの変更履歴を色別で表示
"C-x v h" ;; vc-region-history 選択範囲の変更履歴のログを表示
"C-x v i" ;; vc-register 新規ファイルをステージに上げる
"C-x v l" ;; vc-print-log 現在のバッファのコミットログを表示
"C-x v m" ;; vc-merge ブランチを対話的にマージする
"C-x v r" ;; vc-retrieve-tag タグを指定したらHEADをそこに移動
"C-x v s" ;; vc-create-tag HEADのいる場所にタグを設置
"C-x v u" ;; vc-revert ファイルの変更を戻す
"C-x v v" ;; vc-next-action バージョン管理で次にすべきことを実行する
"C-x v x" ;; vc-delete-file gitで管理しているファイルを削除する
"C-x v ~" ;; vc-revision-other-window 現在のファイルの過去の差分を開く
;; M-s h Prefix
"M-s h ." ;; highlight-symbol-at-point カーソルを当てている変数をハイライトする
"M-s h f" ;; hi-lock-find-patterns
"M-s h l" ;; highlight-lines-matching-regexp 検索して合致した行をハイライト
"M-s h p" ;; highlight-phrase キーワードを検索し合致したワードをハイライト
"M-s h r" ;; highlight-regexp 正規表現で検索し、ハイライト
"M-s h u" ;; unhighlight-regexp 正規表現で検索し、ハイライトを解除
"M-s h w" ;; hi-lock-write-interactive-patterns 対話的にパターンを決める?
;; M-s ESC Prefix
"M-s M-w" ;; eww-search-words ewwでキーワードを検索
;; M-o ESC Prefix
"M-o M-S" ;; center-paragraph パラグラフを中央揃えにする
"M-o M-o" ;; font-lock-fontify-block ?
"M-o M-s" ;; center-line カーソルのある行の文字をセンターに寄せる
;; M-g ESC Prefix
"M-g M-g" ;; goto-line 行番号を入力しカーソルをそこに移動
"M-g M-n" ;; next-error エラーメッセージ部分に移動する
"M-g M-p" ;; previous-error 前のエラーメッセージに移動
; C-x a i Prefix
"C-x a i g" ;; inverse-add-global-abbrev カーソルの前の最後の単語をグローバルなabbrevにする
"C-x a i l" ;; inverse-add-mode-abbrev カーソルの前の最後の単語を現在のモードのabbrevにする
;; C-x r ESC Prefix
"C-x r M-w" ;; copy-rectangle-as-kill 矩形で選んだ範囲をコピーする
;; C-x v M Prefix
"C-x v M D" ;;vc-diff-mergebase マージベースでのリビジョンの差分を表示
"C-x v M L" ;; vc-log-mergebase マージベースでのリビジョンのログを表示
))
(global-unset-key (kbd key)))
残しているキーバインド
上のコードではカーソルの移動、バッファの分割と選択、カーソルクリックとマウススクロールなど必要最低限のキーバインドは残してある。全てアンバインドすると、全く操作できなくなるからだ。もしも、本当に全てのキーバインドをアンバインドしたいなら上のコードにあるコメントアウトしている部分をコメントインすればよい。
Prefix キーバインドについて
Prefixでキーがバインドされているものは大元のPrefixでアンバインドするのではなく、個々のキーバインドを1つ1つアンバインドしている。
例えば、C-x t
というPrefixがあるなら大元のC-x t
をアンバインドするのではなくC-x t 0 ;; tab-close
のようなキーバインドを1つ1つアンバインドしている。
特殊キーとマウスのPrefixキーバインドについて
特殊キー(例えば、<left-edge>
とか)とマウス操作を伴う複雑なPrefixコマンドは大元のPrefixコマンドをアンバインドしている。これらのキーバインドは利用しているユーザーも少ないと思ったので、1つ1つアンバインドするのではなく、大元でアンバインドした。
全てアンバインドした感想
当たり前に利用していること
全てアンバインドしてまず驚いたのは、他のMacアプリケーションで利用しているCommand+C(コピー)やスクロール、クリックなど当たり前に利用している機能も利用できなくなるということ。当たり前に利用している機能も、Emacsにおいてはそうのように記述し割り振られているから利用できるという発見があった。
Emacsの標準機能って色々あるね
Emacsってパッケージ入れて拡張してナンボ見たいな印象があって、僕もcompany入れたり、helm入れたりしてる。ただ、デフォルトキーバインドを1つ1つ見ると、様々な便利機能がEmacs標準で備わっているんだなと思った。せっかくなので今回僕が面白そうだなと思ったEmacsの機能をまとめておく
- Abbrev
- キーボードマクロ
- 矩形モード
- タブモード
- 登録機能
これらは時間があればまた別の機会に勉強して紹介したいと思う。
まとめ
デフォルトキーバインドをアンバインドしたところで「で!? なに」 と思わなくもない。
まあでも僕なりの使い方はこんな感じだと思う。
1つ目は自分のキーバインドを見直せる。今回コードにはアンバインドしたファンクションのちょっとした解説も加えてあるので改めて見直すと勉強になると思う。
2つ目は空いているキーバインドが明確になるので、新しくパッケージを入れた時に、いちいち重複や上書きを気にして設定しなくてよくなる。正直パッケージ入れた時って、そこに書いてあるオススメのバインドを設定することが多いのだけど「このキーバインドは使って大丈夫なのかな」って毎回心配になる。その辺を良い感じにしてくれそう。
3つ目はパッケージを入れすぎて、キーバインドが重複したり、適当に割り振っているせいで分からなくなったりしているのを整理できると思う。2つ目と基本的には同じなんだけど、既にEmacsの設定を色々してしまったいる人は見返して整理できる。
最後に、使っていないデフォルトキーバインドを確認して、不必要なものはアンバインドし切り離すことでより風に近くなれるはず。