今回はトレーニングとは全く関係ない記事です。

ここ最近、少々忙しくてトレーニングは半休止状態です。家にトレーニング器具があればいつでもトレーニングができるかと思い、簡単な器具を買ってみたのですが、他に優先したいことがあったり、コンディションが良くなかったりして、結局トレーニングは殆どやっていません。まあ段々と暖かくなってきましたし、トレーニングの方も少しずつ再開したいと思います。

Emacs キーバインド

さて、そんな近況なのですが、普段の生活や仕事で「前に似たようなことをやったはずだけど、どうやるんだっけ?」とか「これを適当に済ませたら、また後で調べ直しになってしまう」となることが度々あり、情報整理の仕方を改めて見直しています。このようなことは IT の道具を上手く使ってスマートにやりたいものですが、本来やるべきことを放ってついつい本筋から脱線してしまうのは人の常です。ここ最近は、自分が使う道具を見直して環境を整えるのに結構な時間を費やしています。

そんな道具の中で、私にとって特別大事なものに Emacs というテキストエディタがあります[*1]。

Emacs の分かりやすい魅力のひとつに、便利なキーバインドが挙げられます。キーバインドとは、キーボードへの機能の割り当てのことです。ちなみに、本題ではないのですがもうひとつ Emacs に関係した便利なものを挙げると、SKK (Simple Kana to Kanji conversion program)[*2]という日本語入力システムがあります。これも私にとっては Emacs が手放せない理由のひとつです。

Emacs キーバインドは一般には馴染みが薄いものですが、実は、もし Mac のパソコンを持っていれば、すぐにこれがどのようなものか試すことができます。私自身は Mac を持っておらず使い方もよく知らないのですが、Mac では様々なアプリケーションで最初から Emacs ライクなキーバインドが少し使えるようになっているらしいです。例えば次を試してみてください。

  1. まず、Safari を起動してアドレスバーにカーソルを置いてください。
  2. 次に Ctrl キーを左手の小指で押し、Ctrl を押したままの状態で左手の人差指で F キーを何度か打ってください。F を打つ度にカーソルが一文字先に進むはずです。(forward-char)
  3. Ctrl は左手の小指で押し続けた状態を保ってください。左手の人差指で今度は B キーを何度か打ってください。その度にカーソルが一文字後ろに戻るはずです。(backward-char)
  4. まだ Ctrl は押したままです。次に右手の中指で K と打ってください。カーソルから先の文字列がカットされます。(kill-line、Windows での C-x ショートカット)
  5. まだ Ctrl は押したままです。最後に右手の人差指で Y と打ってください。カットされた文字列がペーストされます。(yank[*3]、Windows での C-v ショートカット)

すごく便利でしょう?・・・えーと、私は便利だと思います。

Emacs では、アプリケーションの基本操作にはこのような単純なキーバインドが割り当てられています。また、こういった操作が自然な指の動きで行えるように、キーボードはレイアウトを変更して CtrlA の隣に配置するか、または最初からそのように配置されているものを使用します(これは Emacs を使用するにあたっての前提条件ともいえる重要事項です)。そうすると、上記の一連の操作は、手をホームポジションに置いたまま、指をちょっと動かすだけで全て行うことができます。Emacs ではキーバインドを割り当てていない機能も直接キータイプして命令できるので、操作はマウスを使わずキーボードで完結させることができます。しかも、決してアクロバティックな手の動きは要りません。両手の位置はそのままに、指をちょっと動かして届くところに操作範囲が収まっているのです[*4]。


  1. テキストエディタというのは Emacs が持つ表面的な機能にしか過ぎず、Emacs はエディタではなく環境、あるいは OS だ、とよく言われ、Emacs はその複雑さや難しさのために敬遠されがちでもあります。ただ、私は機能的には深入りせずに、単にテキストエディタとしての使い勝手の良さで Emacs を使い続けています。
  2. パソコンで、普通の日本語入力システム(Microsoft IME や Google 日本語入力、ことえり、ATOK など)で文章を書く場合、ある程度まとまった語のかたまりを入力して(この時点では文字は全てひらがな)、Space を押してシステムに形態素解析と仮名漢字変換をさせて、変換後の結果を目で見てチェックして、正しければ Enter を押す、という流れになると思います。
    これに対し、SKK は形態素解析を一切行わないという独特な設計をしています。SKK では、そういった処理はコンピュータに任せず、ペンで手書きをするときのように、人間が自ら、その語を入力するのと同時に行います。最初から頭に描いた通りの完成形の日本語を入力していくので、自然な操作感になるのが特徴です。
  3. Yank とは「引っ張る」といった意味の言葉ですが、Emacs ではコピーしたデータをペーストすることをこう呼びます。
  4. これに関連して、Emacs には Enter キーを押さなくて良いという特徴もあります。Emacs では普通は Enter 相当の機能が Ctrl + m などに割り当てられており、文章を書いているときに変換の確定のためにわざわざ小指を伸ばして Enter キーを押す必要がありません。また、SKK を使うのであれば、確定キーが Enter ではないうえに、そもそも文章入力中に明示的な確定処理をすること自体があまりありません。

AutoHotkey で Emacs キーバインド

Windows パソコンでは、OS やアプリケーションの操作を全体的に Emacs キーバインドで行えるようにする方法がいくつかあります。

まず、32-bit の時代には、Windows パソコンの操作を全体的に Emacs ライクなキーバインドにしてくれる XKeymacs (xkeymacs.osdn.jp)という素晴らしいツールがありました。64-bit の時代になってからは、AutoHotkey (ahkscript.orgwikipedia)というツールを使用して Emacs キーバインドを実現してくれた人がいて(usi3.comNTEmacs @ウィキ)、今はその設定スクリプトを自分用に編集して使っています。ちなみに、試したことはないのですが、現在は XKeymacs も 64-bit で動作するようです。また、これも試したことはないのですが、keyhac(craftware)というツールを使用する方法もあります。というか今ではどちらかというと keyhac を使用する方法がよりお勧めされており、設定も随時拡充されているようです(NTEmacs @ウィキ)。

現在では keyhac の方がお勧めされているようですが、私は個人的に AutoHotkey で十分満足しているため、今も AutoHotkey を使い続けています。

ダウンロード

私が使用している AutoHotkey スクリプト MyEmacsKaymap.ahk を次のサイトに置きました。説明は README.ja.md です。

設定済みのキーバインド

バッファとファイル選択、削除、コピー・ペースト
C-x C-ffind-fileC-SPCset-mark-command
C-x C-ssave-bufferC-x hmark-whole-buffer
C-x C-wwrite-fileC-x C-pmark-page
C-x kkill-bufferC-ddelete-char
C-x C-ckill-emacsC-bdelete-backward-char
カーソル移動C-kkill-line
C-fforward-charC-wkill-region
C-bbackward-charM-wkill-ring-save
C-nnext-lineC-yyank
C-pprevious-line検索
M-fforward-char x 5 [*1]C-sisearch-forward [*2]
M-bbackward-char x 5 [*1]C-risearch-forward [*2]
M-nnext-line x 5 [*1]アンドゥ、キャンセル
M-pprevious-line x 5 [*1]C-/undo
C-amove-beginning-of-lineC-x uundo
C-emove-end-of-lineC-gkeyboard-quit
C-vscroll-downその他
M-vscroll-upC-mnew-line
M-<beginning-of-bufferC-iindent-for-tab-command
M->end-of-bufferC-jnew-line
言語入力システム切替C-oopen-line
C-x C-jtoggle-input-methodC-ttranspose-chars
C-\toggle-input-method
Microsoft Excel、Google スプレッドシート[*3]
C-c a選択されたセルを活性化しカーソルを最後に移す (Append) (F2)
C-c i選択されたセルを活性化しカーソルを最初に移す (Insert) (F2 + Home)
C-q プレフィックス: 一時的に Emacs キーバインディングを無効化[*4]
C-q C-a(すべて選択) [*5]C-q C-n(新規ウィンドウ) [*6]
C-q C-p(印刷)
C-M キー: 管理用キー
C-M-qスクリプト実行の停止と再開の切替
C-M-zフォーカスされているアプリケーションの有効/無効の確認
M- は元々は Meta キーを押すという意味でしたが、現在では実質的に Alt キーを押すことを意味します。)
  1. 単語単位ではなく5回分移動します。例えば M-fM-b はカーソルを5回移動します。M-nM-p は Emacs のキーバインドには存在しませんが、Web ブラウジングをするときなどに、ページ単位だと進みすぎるが1回のスクロールでは遅すぎるといった場合に便利です。
  2. 検索はインクリメンタルではありません。後方検索もなしです。
  3. 操作対象が Google スプレッドシートかどうかの判断は m_IsGoogleSheets() 関数の IfWinActive で行っています。私の場合、大雑把に FireFox か Google Chrome であれば true としていますが、より適切な判断をしたい場合はスクリプトを編集してください。
  4. C-q でツールを一時的に無効にするのは、かつて使用していた XKeymacs に慣らったものです。私は XKaymecs を長年使用していたため、印刷する時に C-q C-p と打つのが体に染み付いています。
  5. 私の場合、Microsoft Paint で C-x hC-x C-p が効かないため替わりにこれを使用することがあります。
  6. 私の場合、Web ブラウザでこれを使用することがあります。

コメント

コメント一覧

    • 1. 武井
    • 2016/10/25 09:34
    • はじめまして。武井と申します。

      誠に申し訳ないのですが、AutoHotkeyの設定方法で教えていただきたいことがあり
      投稿させていただきました。

      貴殿が設定された内容では、「c-v」が「scroll-down」に設定してありますが、
      このキーだけ「貼り付け(yank)」にしたいのです。
      設定ファイルを修正することになると思うのですが、どの部分をどう変更すれば
      良いのか教えていただけませんでしょうか。
      よろしくお願いします。
    • 2. OneH
    • 2016/10/25 11:42
    • どうもはじめまして!
      「^v::」に続けて記述されている部分が、「Ctrl + V」に対応する動作です。
      (「^」は「Ctrl」に対応します。)

      スクリプトの以下の部分で、「m_ScrollDown()」を「m_Yank()」に変更するといけると思います。ちなみに、「m_xxxx()」は AutoHotkey 標準ではなく、スクリプトの前半で私が定義したファンクションです。
      (接頭辞の「m_」は「My function」のつもりです。 )

      変更前
      --------------------
      ^v::
      if (m_IsEnabled()) {
      m_ScrollDown()
      } else {
      Send %A_ThisHotkey%
      }
      Return
      --------------------

      変更後
      --------------------
      ^v::
      if (m_IsEnabled()) {
      m_Yank()
      } else {
      Send %A_ThisHotkey%
      }
      Return
      --------------------
    • 3. OneH
    • 2016/10/25 13:48
    • すいません、今気付いたのですが、Ctrl+V で貼り付けというのは Windows の標準的なショートカットなので、ただコメントアウトするだけで OK ですね。
      --------------------
      ;^v::
      ; if (m_IsEnabled()) {
      ; m_ScrollDown()
      ; } else {
      ; Send %A_ThisHotkey%
      ; }
      ;Return
      --------------------
    • 4. 武井
    • 2016/10/25 16:16
    • 武井です。

      早速の回答ありがとうございました。
      試してみます。
      助かりました。
    • 5. 武井
    • 2016/10/25 22:05
    • 武井です。
      お世話になります。
      うまくいきました。ありがとうございました。
    • 6. OneH
    • 2016/10/25 22:35
    • あ、良かったです!
    • 7. sasaki
    • 2016/10/26 10:28
    • OneHさん、どうも。
      Emacsはこれまで機会がなく触ったことがないのですが、viは仕事でよく使っています。
      エンターキーやカーソルキーを多用せずにテキストを入力するのはなんともいえない味わいがありますよね。
      SKKについて恥ずかしながら知らなかったものでちょっとググってみたのですが、あの佐藤雅彦先生が開発されたものなんですね。子供といっしょにピタゴラスイッチを見るようになってから氏のファンでした。
      久しぶりに著作を物色したのですが、どうやら認知症を患われているようですね・・・
    • 8. OneH
    • 2016/10/26 13:03
    • あれ、そういえばあの有名な方も佐藤雅彦さんという名前でしたね。佐藤雅彦という方は同姓同名で沢山いらっしゃるみたいで、それぞれ別の方っぽいです (笑)
      SKK は Emacs 操作との組み合わせで抜群の相性を発揮するので、Emacs を使わないと、この日本語入力の快感を実感する機会ってないかもしれません。私は文章を書くのにすごく便利で手放せないんですけど、Emacs を使っている人なんてたぶん滅多にいないですよね。
      sasaki さんは vi を使われるんですね。ちょっとテキストを開くのに便利なので私も vi は使うことがあるのですが、操作が覚えられなくってなかなか上手く扱えません。
    • 9. sasaki
    • 2016/10/26 13:56
    • まじっすか!!!
      とんだ早合点でした・・・・。ファンとか言っといてなにも分かってないですね(苦笑)
      もっとちゃんと調べないといけないですね・・・
      ご指摘ありがとうございます。

      SKKはShiftキーを多用するのが特徴らしいですね。小指が疲労しやすいのが欠点なんて指摘もありましたが、私は自分の名前を打つのに小指を多用するので耐性がありそうです。(笑)
      機会があったら一度体験してみたいものです。

      viはまあ必要にかられてしかたなく、という面もあるんですけどね。(仕事なので)
      最初はとっつきにくくて難儀したものでした。
      私も必要最小限の操作しか知りませんが、何事も慣れですね。
コメントフォーム
評価する
  • 1
  • 2
  • 3
  • 4
  • 5
  • リセット
  • 1
  • 2
  • 3
  • 4
  • 5
  • リセット

トラックバック