keybind
key binding
さて、お次はキーバインドです.
次のようなことを念頭において変えています. 自分では素直だと思うんですが.
- 良く使うのは 1ストローク.
- カーソルキーは使わない(遠い).
- すべて Ctrl キーを介したものとし, Esc キーは使わない(遠い).
- プレフィックスキーはホームポジション.
全体的に, emacs のデフォルトのキーバインドはどう考えても人間工学を無視し
ているとしか思えないので, カスタマイズしない手はありません.
全て Ctrl を介したものというのは、
C-d j
ではなく
C-d C-j
で、ということです。なぜならば、C-d j は一度キーボードを完全にニュートラルにする
必要があるため、連続して打鍵できる C-d C-j よりも確実に遅くなるからです。
自分のバインドには C-d C-f C-m みたいな 3 打鍵のコマンドがありますが、C-d m という
2 打鍵だけど不連続なストロークよりは速く打てると感じてます。
逆に、バッファのキルや emacs のキルのような、やや危険なコマンドについては、寧ろ
そのような一呼吸置くようなストロークの方がよいかもしれません。
emacs 触ったことある人ならご存知でしょうが、カー
ソル移動は基本的にC-f,C-b,C-n,C-pです. 当然カーソルキーもありますが、Ctrl
を介したコマンドはこれです. forward,backward,next,previousと、一見すれば
大変理にかなっているように思われます. 実際覚えやすいです.
しかしちょっと使ってみればたちどころに気付くでしょう.
死ぬほど使いにくいんです. やってられません. 特に b と
f が. というわけで変えます.
ここでは→をC-;,←をC-j,↑をC-l,↓をC-k としています. 具体的には下のスクリプト
を.emacsに追加してやります.
;;独自のキーバインド設定
(global-set-key "\C-j" 'backward-char)
(global-set-key "\C-k" 'next-line)
(global-set-key "\C-l" 'previous-line)
(global-set-key [?\C-;] 'forward-char)
ここで、今設定したキーの j,k,l,; をキーボードで眺めて下さい.
ずばり、vi風です. ちょっと違うけど. 何をやったかというと、コントロールキーは左手、
十字キーは右手、という風に、カーソル移動系を全て右手に集中させたわけです.
断言してもいいですが、前述のf,b,n,pで慣れた人でもこっちでもっかい慣れれば絶対
こっちの方が速い筈です.
と、ここまで書いてきて、一つ嘘があります。
自分は、右手の小指にはバックスラッシュが打てるように、キーボード上で入
れ換えています。何故か?これには深い訳がありますのです。
上のように、コントロール - セミコロン にコマンドを割当てても、コンソール上では動
作しないのです。これに限らず、文字列では表現できずにベクトル表現しなければならな
いキーバインドは、ほぼ端末コンソールからでは入力できません。
理由はちょっと複雑で、コンソールではアスキーコードしか認識できないためです。つま
り、コントロール - セミコロン という文字コードが存在しないのです。普通、
コントロールを押下しながら A を押した場合、端末には「コントロールを押しながら A
が押された」という情報が伝達されるのではなく、コントロール - A という文字コー
ドが送信されたと解釈されます。これを区別しているのは X の上だけなのです。
従って、X でも ターミナルコンソールでも同じ環境にしたいなら、文字列によるキーバ
インドで済ませる必要があるのです。英字配列を替えられない以上、control の装飾のア
スキーコードを持つ記号を右手小指に配置する以外に方法がありません。
@ [ \ ] ^ _
以上を満たすのは上の 6 つだけで、結局バックスラッシュにしたというわけです。
ふむ。
ようやくまともな環境になってきましたが、普通に使っていると秀丸との重大
な相違点に気付きます. 行頭・行末移動が「論理移動」なのです. どういうことかっつー
と、ある位置から行末へ飛ぶようにすると、次の改行へ飛んじまうのです. 当然画面端の
折り返しはまるで考慮されません. それだけならまだ許せるものの、カーソル上下移動で
も「改行をまたいで」しまいます. 暫く改行を入れず全角200文字くらいの文章を書いて
いて、上下移動しようとしたら一気に5行くらいすっ飛ばしてしまうわけです. まったく
やってられません. text-modeとかなら auto-fill-mode なる便利なマ
イナーモードがあります. 画面端に近づいたら勝手に改行されるようになります. 但し、
英文では単語の区切りを見つけて改行します. まあワープロっぽい感じですか.
ただ、先刻の要望を解決するマクロも発見しました.
window-lines.el とか ce-scroll.el とかで検索すれば引っかかるかと.
よく gnu.emacs.sources などのニュースグループにも投稿されるようです.
既に何らかのキーが割り当てられている場合はそいつらを割り当てなおす必要がある
かもしれませんが、良く使うのは自分で好きなところに割り当てるし使わないのは
一生使わないので、気にしないのがいいのです.
dangerous key binding
180%独自路線なので、参考程度にしてください.
何が危険なのか?そう、C-xとC-cを別のキーに替えるからです. これらの超重要なプレ
フィックスキーを変更するということは、それで慣れた場合デフォルトの設定には二度と
馴染めないことを意味します(ちょっと誇張).
自分で考
えた以下のキーバインドはそれなりに合理性を追及している(現在進行形)ものですが、他
に素晴らしいと思われる提案があるならアッサリ採用する可能性があります.
信念としては、「プレフィックスキーこそホームポジションにすべきだ」ということ. 前
述したカーソル移動とはまた別に非常によく打鍵するので、ホームポジションがベストだ
と考えます. 既に右手の j,k,l,; は使用済みなので、残るは左手ですね. わけあって私
の使用しているキーボードは左手親指で Ctrl を押下したまま全てのキーを打鍵すること
が可能なので、通常のキーボードで考えられる「左手小指Ctrl + s って押しにくいよ」
ということがありません. この辺からも既に独自路線であることがわかりますね
(?).
様々な紆余曲折がありましたが、Control-X-prefix は薬指の C-s にしました.
C-d も実は使用しますが、これは完全に独自のキーマップを使用するキーにしています。
詳しく云うと、ctl-x-map にはファイルを開くとかウィンドウを分割するとか、emacs 独
自の機能を割当てて、C-d に続くコマンドには移動や挿入など、他の環境(シェルとか)で
も共通になるようなコマンドを割当てます。
同様に, C-c のモード固有のキーマップは C-a にしようと思いました.
実は, 通
常のキーバインドを設定するように C-a にモード固有のキーマップ(旧 C-c) を割り当て
ようとして,
(define-key global-map "\C-a" mode-specific-map)
としてもうまくいきません. それもその筈、殆んどの elisp では
(define-key mode-specific-map "\C-f" 'smart-find-file)
などではなく
(global-set-key "\C-c\C-f" 'smart-find-file)
みたいに直接設定されてしまっています。自分で書いたバインドを変更するだけで済むな
らまだいいのですが、読み込もうとする elisp ファイルの中に直接書かれているともう
最低です。
つーわけで、全ての C-c を C-a に書き換える
という壮大な作業が好きな人以外は、keyboard-translate を使用する方が無難でしょう。
(keyboard-translate ?\C-a ?\C-c)
(keyboard-translate ?\C-c ?\C-a)
これの意味するところは,
C-a が押されたら C-c が押されたと解釈し,
C-c が押されたら C-a が押されたと解釈する
ということです. 重要なのは, C-x C-c とかも C-x C-a という風に解釈されて
しまうという点です. 従って二打鍵や三打鍵のバインドを少し変更する必要が出
てきますが, 大した労力ではありませんね(?)
上のと併せて, こう書いておけば OK です.
(keyboard-translate ?\C-x ?\C-s)
(keyboard-translate ?\C-s ?\C-x)
さらに, C-u の universal-argument も, 他のキー C-f に割り当てたいと考えました。
単純に
(global-set-key "\C-f" 'universal-argument)
としただけでは不十分で、
(setq universal-argument-map
'(keymap
(57 . digit-argument)
(56 . digit-argument)
(55 . digit-argument)
(54 . digit-argument)
(53 . digit-argument)
(52 . digit-argument)
(51 . digit-argument)
(50 . digit-argument)
(49 . digit-argument)
(48 . digit-argument)
(45 . universal-argument-minus)
(6 . universal-argument-more) ;; 6 is ^F, and (old) 21 is ^U
(switch-frame)
(27 keymap
(t . universal-argument-other-key))
(t . universal-argument-other-key)))
てな感じのおまけが必要です。
疲れたのでまたそのうち...
役に立たないので戻る