なんでもキーアサインしないEmacs

  • 12
    いいね
  • 2
    コメント

こんにちは、今日も一日Emacsを起動してました.emacs Advent Calendar 2016です。

私は記憶力が悪く、特に複雑なキーバインドが覚えられないのでEmacsの操作を単純化する方向をめざしてきました。 だいたいなんですか、たかだかカーソル移動のためにC-nとかC-pとか難しいキーバインド覚えられるわけないじゃないですか。

キーアサインする

ものおぼえが悪いことを自覚しながらも、奥の手に手を染める前に基本から攻めていきます。

絶対に鬼軍曹しない

あきすてさんのEmacs 初心者はいかにして変態キーバインドを覚えるかみたいな話もあるのですが、これは罠です。鬼軍曹.el(drill-instructor.el)は記憶力の良い人向きです。私は一瞬で諦めました。

初心者がEmacsの得意なひとにそそのかされて、Emacsはふべんだとか、めんどくさいとか感じるのは損失です。私はまったくおすすめしません。いますぐ捨ててください。

一箇所に書く

キーバインドは一箇所だけ見ておけばわかるようにします。bind-keydefine-keyよりも短く書けるやつです。例によってるびきち師のbind-key.el : define-keyを直接書くのは時代遅れ!Emacsの重鎮が行っているスタイリッシュキー割り当て管理術!をお読みください。

init.el
(progn
  (bind-key  "M-ESC ESC"   'keyboard-quit)
  (bind-key  "C-S-n"       'make-frame)
  (bind-key  "C-S-w"       'delete-frame)
  (bind-key  "M-N"         'my/new-untitled-buffer)
  (bind-key  "C-c :"       'right-click-context-menu)
  (bind-key  "C-c ;"       'imenu)
  (bind-key  "C-c R"       'revert-buffer)
  (bind-key  "C-c S-i"     'my/display-file-info)
  (bind-key  "C-x j"       'dired-jump)
  (bind-key  "C-x C-S-e"   'pp-eval-last-sexp)
  (bind-key  "C-x お"      'other-window)
  (bind-key  "M-:"        'eval-expression)
  (bind-key  "M-i"         'helm-imenu prog-mode-map)
  (bind-key  "M-ESC :"    'eval-expression)
  (bind-key  "<S-tab>"     'my/outdent-dwim)
  (bind-key  "C-M-y"       'helm-show-kill-ring)
  (bind-key  "M-<left>"    'bs-cycle-previous)
  (bind-key  "M-<right>"   'bs-cycle-next)
  (bind-key  "C-M-S-y"     'my/kill-buffer-file-name)
  (bind-key  "M-<f5>"      'compile)
  (bind-key  "<f5>"        'quickrun)
  (bind-key  "<f9>"        'zone)
  (bind-key  "<f12>"       'neotree-toggle)
  (bind-key* "C-c <left>"  'windmove-left)
  (bind-key* "C-c <down>"  'windmove-down)
  (bind-key* "C-c <up>"    'windmove-up)
  (bind-key* "C-c <right>" 'windmove-right))

が、物覚えが悪いので正直覚えられてないのが半分ほどあります。つらいですね。次行きます。

物覚えが悪いから同時に押す

去年書いた記事です。二種類のキーを「えいやっ」「ていやっ」と押してやるとコマンドが実行されます。

init.el
(progn
  (key-chord-define-global "df" 'find-function)
  (key-chord-define-global "fh" 'describe-function)
  (key-chord-define-global "fv" 'find-variable)
  (key-chord-define-global "@p" 'package-install)
  (key-chord-define-global "kl" 'align-regexp)
  (key-chord-define-global "rt" 'toggle-load-theme)
  (key-chord-define-global "wr" 'writeroom-mode)
  (key-chord-define-global "m," 'reload-major-mode)
  (key-chord-define-global "mc" 'my/buffer-minchoize))

この方法の難点は、ふつうに入力されうる組み合せを指定すると高速に入力したときに発火して危ないです。(上記だとrtsmartなどの単語の一部なので誤爆します)

それと、人前で誤爆したりするとカッコワルイので、Emacsを使ってるオレカコイイみたいなのを見せつけてどやりたいひとにもおすすめできません。

which-keyで次のキーを見る

which-keyはキー入力の途中で手を止めると、キーバインド一覧を表示してくれます。例によってwhich-key.el : 【guide-key改】次のキー操作をよりわかりやすく教えてくれるぞ!をお読みください。

(use-package which-key
  :diminish which-key-mode
  :init
  (which-key-setup-side-window-right-bottom) ;; 画面幅によって右端または下部に表示
  (which-key-mode t))

スクリーンショット 2016-12-07 午後11.23.49.png

どうしてもキーバインドを思ひだしたいときに見ます。が、あんまり依存はしてないです。

キーアサインしない

ここからが本番です。

メニューバー

気取ったひとの.emacsでは丁寧にメニューバーを消す設定がしてあったりするんですけど、個人的には信じられませんね。機能が複雑なEmacs Lispパッケージには大概ちゃんとメニューが設定されてるので、これを利用しない理由は全然ないです。

ちなみにメニューバーのメニューは、キーボードからでもM-x menu-bar-openまたは<f10>で開けます。(私はものおぼえがわるいので、たったいま(describe-function 'menu-bar-open)で調べて思ひ出しました…)。

これは重要なのですが、メニューバーは端末からでも利用できます。

スクリーンショット 2016-12-07 午後11.30.26.png

もう一度書きますよ。メニューバーはターミナルでも利用できます。いいですか、わかりましたね?

ツールバー

例には出すんですが、その、私はあんまり使ってないです。これでも昔はWindows系のテキストエディタをよく使ってて、特に往時のDelphi製のアプリなどはツールバーコントロールがやたら充実してたのか、私の使ってたMKEditor for Windowsなどは自由自在にツールバー位置のカスタマイズができました。

スクリーンショット 2016-12-07 午後11.45.22.png

が、Emacsではそもそもどうやってカスタマイズするのかも知らないし画面の幅をとるので消しました。残念ではあります。

M-xを活用する

最近のテキストエディタには「コマンドパレット」なる機能があって、機能名の単語をぱぱっと入力してやるだけでコマンドが実行できてべんりなのだそうです。

それEmacsのM-xとおなじだから!!!! とは言ってもデフォルトのEmacsでは操作性が貧弱です。

なので補完用のメカニズム(インターフェイス・フレームワーク)を導入して操作性を強化すべし。……って話を君は誰とEmacsる? (補完インターフェイス紹介篇)に書いたんじゃ。

Emacs helm-smex

いまのところ、私のお気に入りはhelm-smexです。明日には変ってるかもしれませんけど。

右クリックする

これは自作のやつですが、まだ正式リリースしてないので、いつの間にか仕様変更されても泣かない人向けです。(直接質問してくれたらサポートしますょ)

zonuexe/right-click-context: Emacs Right Click Context menu

demo.gif

べんり。超べんり。

あとがき

ものおぼえが悪くてもEmacsを使ってらっしゃる型は、何か知見がありましたらシェアしてくださいね ヾ(〃><)ノ゙