VI(ブイアイ)というテキストエディタをご存じだろうか。
カーソルの移動をh・j・k・lの4キーで行う、なんとも奇妙なエディタである。
では文字入力はどうするのかというと、VIにはいくつかのモードがあり、iキーで編集モードに入ると普通のエディタのように編集でき、Escキーで編集モードから抜けるとノーマルモードに戻ってhjklで移動できるようになる。
VIを知らない方にとっては、編集モードがノーマルで、hjklで移動できる方がむしろアブノーマル。
しかし、VIではこれが普通なのだ。
VIでは、ホームポジションを大きく崩さずに編集ができる。
矢印キーでも移動できるが、ホームポジションから遠いので普通はhjklで移動する。
そしてその操作に慣れてしまうと…
もう普通に戻れない。
矢印キーがひどく煩わしく感じる。
VIは他にも、切り取りやコピー、選択などをすべてコマンドで行う。
メモ帳でもCtrl+Cでコピーできるが、VIのそれはちょっと違う。
yyと入力すると、現在カーソルがある行が丸ごとコピーされ、pで貼り付けされる。
3yyと入力すると3行コピーされ、10pと入力するとそれが10回文貼り付けられる。
Windows番のVIはこちらで入手できる。
www.kaoriya.net
さて、VIの操作に慣れてしまうと、ExcelもVI風に操作したくなる。
全部は無理でも、せめてカーソル移動だけでも。。
ということで作ってみたのがこちら。
Sub ViMode() Application.CutCopyMode = False Application.OnKey "i", "ExcelMode" Application.OnKey "h", "Vi_h" Application.OnKey "j", "Vi_j" Application.OnKey "k", "Vi_k" Application.OnKey "l", "Vi_l" Application.OnKey ":", "Vi_ExMode" Application.Caption = "■■■VI MODE■■■" End Sub Sub ExcelMode() For Each x In Split("i h j k l :", " ") Application.OnKey x Next Application.Caption = "" Application.OnKey "{ESC}", "ViMode" End Sub Sub Vi_ExMode() Application.VBE.MainWindow.Visible = True Dim w As VBIDE.Window For Each w In Application.VBE.Windows If w.Type = VBIDE.vbext_wt_Immediate Then w.SetFocus End If Next End Sub Sub Vi_h() If Selection.Column > 1 Then Selection.Offset(0, -1).Select End Sub Sub Vi_j() If Selection.Row < Rows.Count Then Selection.Offset(1, 0).Select End Sub Sub Vi_k() If Selection.Row > 1 Then Selection.Offset(-1, 0).Select End Sub Sub Vi_l() If Selection.Column < Columns.Count Then Selection.Offset(0, 1).Select End Sub
あまり知られていないが、Application.OnKeyを使用すると、マクロのショートカットを[Ctrl+文字]以外にも設定できる。
削除するには再度Application.Onekyで、第二引数を渡さなければ良い。
上記コードを標準モジュールに貼り付けてViModeマクロを実行すればExcelのタイトルバーに■■■VI MODE■■■と表示され、hjklで移動できるようになる。
Vi_ExModeマクロは、イミディエイトウインドウをすばやく表示させるためのコードで、動作させるには次の2つの設定が必要だ。
まず、VBEのツールメニューから参照設定で、Microsoft Visual Basic for Applications Extensibility X.Xを参照させておく。
次に、マクロのセキュリティで以下を設定する。
これで、コロンを入力するとVi_ExModeマクロが実行され、イミディエイトウインドウが開く。
これはVBAで一行コマンドをすばやく実行するために用意した。
thom.hateblo.jp
iキーを押すと普通のExcelに戻るが、EscキーでまたVIモードになる。
まだ試行錯誤している段階なので、最初のViModeをどう実行させるか等は決めてない。
また、hjklは矢印キーと違い、非表示セルにも移動するので非表示セルが連続すると移動が煩わしい。
色々と改善できる点はあるけど、面倒くさいので徐々にやっていこうと思う。
…実は調べていたら似たような試みはすでにあったようで、Vectorで公開されていた。
www.vector.co.jp
まあ、全部VI風にはせずにExcelコマンドとハイブリッドにしようとは思うので、自分用のキーは自前で実装を続ける予定。