この記事はVim Advenvimt Calendar 2012 192日目の記事です。 前回は@manga_osyoさんのtextobj-context をつくったAdd Staraerealでした。
このブログではVAC107日目に Vim以外でVimする: Windows編という記事で Windows上でVimエディタ以外の場所でVimっぽく操作することを yamyという キー設定変更ソフトで実現する方法を紹介しました。 (Vim以外でVimする: Windows+AutoHotkey編でAutoHotkey (or Standalone)でする方法も追加。)
今回の記事はそのMac編です。
Karabiner-Elementsでの設定
追記: 2017/09/05
最新のmacOS SierraではKarabinerは使えなくなっていて、代わりに Karabiner-Elements がSierra用に開発されています。
このKarabiner-Elements用にも作りました。
追記ここまで
KeyRemap4MacBook
KeyRemap4MacBook
はMac用のキーバインド編集アプリです。
今回はこのアプリを使います。
このアプリについては上記公式ページにも詳しい解説がありますし、 このブログでもいくつか紹介記事を書いたので 良かったら見てみてください。
上のタイトルと各エントリの日付を見て貰えれば 分かる様に基本的に今回の内容の一部を フライイングして書いたものです… (Vim以外でVimする: Windows編の時と同様、まとめてみようと思ったら物凄く長くなりそうだったので分けました)
最初の2つはデフォルト機能や単なる使い方ですが、 3つ目は Windows編で紹介した モード変更無しでモディファイヤーキーと同時押しで行うVimの動きで、 ⌘-⌃-h/j/k/l でカーソルを上下左右にしたり、 他にもマウスポインタやウィンドウを動かす事を可能にする設定を 紹介しています。
vim_emu: Vim emulation with KeyRemap4MacBook
ということで今回の本題です。
KeyRemap4MacBookには元々Complete Vim
、Ubiquitous Vim
と言うモードが入っていて、
これらを有効にするとノーマルモードの動きは大体再現出来ます。
ただ、ノーマルモードだけであればワザワザモード変化させなくても 上のモディファイヤーキーとの同時押し、で殆ど十分ですが ビジュアルモードなど範囲選択も使いたいところです。
Windows同様、選択はShiftを押しながら移動すれば 可能なんですが、そんなことはしれられないので やはりVim以外でもVimっぽく選択コピペしたい、 ということを再現するのがデフォルト設定に加えて作ってみた理由の一つです。
Windowsに比べてMacの方でしか再現出来ない部分等もあったり、 これまで知らなかったショートカットキーとかも覚えたので その辺も勉強になりました。
設定ファイル & インストール
設定ファイルの最新版、及び詳しい仕様方法は GitHubのvim_emuレポジトリ を御覧ください。
上のREADMEにも書いてありますが、 KeyRemap4MacBookの作者の方に連絡してみたところ、 本体にも入れていただいたので、 もし、現在すでにKeyRemap4MacBookをインストール済の人であれば 現在のベータ版(現時点で8.3.7)にすれば 上のvim_emuの設定項目が追加されますので是非試してください 1。
安定バージョンが現在8.3.5なので、問題なければ 安定バージョンにもそのうち追加されるかな、と。
vim_emuが入っているバージョンを導入すると
下の様にVIM Emulation
の項目が追加されます。
有効にするために、Enable Vim Emulation
にチェックを入れ、
Normal Modeに入るためのキーとして
ESCまたは⌃-[を選んでください。勿論両方選択も可能です。
Enable Visual Block Mode
については、下に書く様にこのモードが
ちょっと特殊なので別に有効化/無効化出来る様にしてあります。
(通常は無効の方が良いかと。)
有効にするアプリの選択
KeyRemap4MacBookでは各設定をアプリ毎に有効にしたり無効にしたりできるのですが、 初期設定ではvim_emuはターミナル (iTerm)、Vim (MacVim)、Firefox、Emacs、 またパスワード入力のポップアップでは無効になるようになっています。
もし、この設定を変えたい場合は、ベータ版をインストールした場合は
/Applications/KeyRemap4MacBook.app/Contents/Resources/appdef.xml
、
またvim_emuをGitHubから直接入れた場合は
~/Library/Application Support/KeyRemap4MacBook/vim_emu.xml
の中にある
<replacementdef>
<replacementname>VIM_EMU_ONLY_APPS</replacementname>
<replacementvalue></replacementvalue>
</replacementdef>
<replacementdef>
<replacementname>VIM_EMU_IGNORE_APPS</replacementname>
<replacementvalue>TERMINAL, VI, PASSWORD, FIREFOX, EMACS</replacementvalue>
</replacementdef>
の部分を変更してください。
VIM_EMU_ONLY_APPS
: 設定されたアプリ上でだけ有効になる。空欄の場合はすべてのアプリ。VIM_EMU_IGNORE_APPS
: 設定されたアプリ上では無効にする。
例えば、テキストエディット上でだけ有効にしたい場合は
<replacementdef>
<replacementname>VIM_EMU_ONLY_APPS</replacementname>
<replacementvalue>EDITOR</replacementvalue>
</replacementdef>
としてください。
アプリの定義等に関しては Macでのキーバインド設定 や公式ページを参照してください。
主なモード
まず、vim_emuには以下の様な主なモードがあります。
Mode | Description |
---|---|
Insert Mode | Macの通常の状態。 |
Normal Mode | hjkl等のキーでの移動、ビジュアルモードに入ったりできる状態。 |
Visual Mode | Character-wise, Line-wise, Block-wiseのビジュアルモードがあります。ただし、Block-wiseはちょっと特殊。 |
Command Mode | 主にファイルの保存、終了コマンドが使えます。 |
各モードへの入り方はVim同様、
- ESCまたは⌃-[でNormal Modeへ(どちらを使うか、は選択可能、勿論両方選択も可能。)。
- Normal ModeからiなどでInsert Mode(通常Macの状態)へ。
- Normal Modeからv/⇧-v/⌃-vでCharacter-wise, Line-wise, Block-wise の各Visual Modeへ。
- Normal Modeから:でCommand Modeへ。
:warning: Block-Wise Visual Modeに関しては、カーソル移動では無く、 ⌥-⌘とマウスのドラック、 とう言う方法を取っています。 これはMacデフォルトの機能で、文字選択が出来るアプリであれば 大概これで矩形選択できます 2。
ただ、その特性上、編集中のカーソルキー位置から、ではなく、 その時点でのマウスポインタの位置からの矩形選択スタート、になるので、 はっきり言って実用性無いですが、 矩形選択出来る事知らなかった人はためしてみると ちょっと楽しいと思います(ショートカットキーとマウス直接でも良いですが)。 その様な機能なので、この機能は別にOn/Off出来る様になっています。
Normal Mode等が有効時の表示
Normal Mode等が有効になった場合、画面右下に下の様な表示が出ます。
Visual Mode等の時はその表示が出るようにもなっています。
これらのMode変換は全てのアプリで共通で、さらに無効なアプリの上でも 表示は出続けます。 つまりテキストエディットでNormal Modeを有効にしたままターミナルに移ると 上の表示は出続けますが、この場合ターミナル上ではキーバインドは無効になっています。
もし、この表示が邪魔だ、という場合は
/Applications/KeyRemap4MacBook.app/Contents/Resources/include/checkbox/vim_emu/vim_emu_core_settings.xml
、
またvim_emuをGitHubから直接入れた場合は
~/Library/Application Support/KeyRemap4MacBook/vim_emu/vim_emu_core_settings.xml
の中にある
<autogen>__ShowStatusMessage__ -- VIM </autogen>
となっている__ShowStatusMessage__
を含む行を全て消すかコメントアウトして下さい。
できること
詳しくはREADME や付属のHELPを見て頂ければ分かると思いますし、 とりあえずVimなので適当に打って出来るか試して頂ければ、と と思ったりしてますがざっっと紹介したいと思います。
Insert Mode
このモードが初期状態で、 殆どのキーは変更を行なっていませんが、 Normal Modeに入るためのキー(ESC、⌃-[) と、⌃-n、⌃-p はリマップされています。
Macでは大概のアプリで入力中にESCを押すと補完が出来るので、 ⌃-n、⌃-pでは この機能を使ってVimの様な補完のキーバインディングを再現しています。
Normal Mode:移動系
まず、勿論h/j/k/lの動きは再現しています。
Windowsの時と違い、単語移動において、単語末へ移動、が出来る様になっていますので、 e等がwと区別されます。(⇧-w、⇧-e等各大文字に関しては小文字と全く同じ動き。) 単語末移動があるのでgeについても追加してあります 3。
移動系に関しては4wなどとすることにより 4単語進む、と言った、数字 コマンドで繰り返し、 ということも出来る様になっています。 ただし、数字は2-9だけです。 Windows編と違い、現状yなどとの連携は取れません。
Normal Mode:Yank/Cut/Change/Paste
y y、⇧-d、cw等、 ひと通りのコピー/カット機能は使えます。
勿論貼り付けはpでカーソルキーの次へ位置へ貼り付け(大文字ならその場へ貼り付け)。
Normal Mode:その他
Undo(u、Redo(⌃-r) や/での検索、等。 *でカーソル下の単語検索、も。
Visual Mode
基本的にNormal Modeで使える動きで範囲を変更出来る。 y/dなどでコピー/カット。
Command Model
w で名前をつけて保存、 wqで保存して終了、等。
まとめ
以前のWindows編同様に 基本的にMacに元々あるキーボードショートカット 4をVimmerとして 分かりやすい位置に持ってきた(まとめた)に過ぎません。
例えば行連結の⇧-jに関しては
- ⌘-⇢ (行末へ移動)
- Space
- Foward
- ⇠
という一連のキーを割り当てて居ます 5。
思いつく限りキー設定を入れてみたつもりですが、 このキーの割り当てが無い、とか このキーの動きがおかしい、とか あればここでのコメントなりメールなり なんなりで教えて貰えるとありがたいです。
Windows編で作ったyamy の設定についても、おかしな点やこれは出来るんじゃないか? ていうのがあれば是非連絡ください。