本記事は Vim Advent Calendar 2012 の71日目です。70日目は VimShellだいすき(エイリアス編) | かなりすごいブログ でした。ここでは端末 vim におけるマウス操作について紹介したいと思います。
長いこと ssh 経由での作業ばかりしているので、vim とはターミナルエミュレータ越しにキーボードだけで対話するものだとばかり思っていました。昨年、ふとしたきっかけでマウスで出来る操作があることを知って大変驚いたので、いまさら感がありますがここにまとめます。
Vimでマウスを使えるようにする
ここで話題にする vim は gvim ではなく端末 vim です。そして mouse
機能が有効な状態でコンパイルされたものが必要です。パッケージで導入している場合は vim-minimal や vim-tiny だとマウス機能が利用できません。いますぐ vim-enhanced や vim-nox パッケージをインストールするか、--enable-features=huge を指定してソースからビルドしましょう。
さて、端末 vim でマウスによる操作を可能にするには、まず mouse
に値を設定します。モードごとに有効・無効を指定できますが、ノーマルモード(n
)、ビジュアルモード(v
)、挿入モード(i
)、コマンドラインモード(c
)の4つをすべて有効にできる a
を指定するのが手軽です。
set mouse=a
つぎに ttymouse
の値を設定します。これは TERM
環境変数の値を元に設定され、多くの場合は xterm
になっていると思います。最近の普通に高機能なターミナルエミュレータを使っている場合はドラッグを可能にするためにも xterm2
を指定しておくのが無難です。
set ttymouse=xterm2
Vimで出来るマウス操作
詳しくは :help mouse-using
で確認いただくとして、GUI アプリケーションではごく一般的な操作ができます。
- クリック
- カーソルの移動
- ウィンドウの選択
- タブの選択
- 折り畳みの開閉
- ダブルクリック
- ヘルプウィンドウでカーソル下の単語でタグジャンプ
- スクロール
- ウィンドウ内をスクロール
- ドラッグ(
ttymouse
の値がxterm2
以上の場合に可能)- 範囲選択
- ウィンドウサイズの変更
- タブの移動
出来ることを並べただけでは伝わりにくいので動画を用意しました。
どうですか?マウスで端末 vim と対話できるなんてちょっと驚きですよね。
動画の最後の方ではクリック以外のマウス操作が確認できたプラグインをいくつか紹介しています。
- mattn/calendar-vim
- ヘッダの
<Prev
Today
Next>
をダブルクリック可能 - 日付をダブルクリックでその日の日記を編集
- ヘッダの
- thinca/vim-ref
- カーソル下のキーワードをダブルクリックでタグジャンプしたり、
K
相当の動作
- カーソル下のキーワードをダブルクリックでタグジャンプしたり、
- Shougo/vimfiler
- ファイルをダブルクリックするとOS関連付けで開く
- ディレクトリをダブルクリックするとツリーの開閉
端末 224 桁問題
このようにマウスによる操作ができることを知ってしばらくは、その秘めたる可能性を探るために vim のあちこちを触ってはその反応を見て喜んでいたのですが、いつも使っている MacBook Pro Retina で最大化している端末だと、なぜか右端の方をクリックするとカーソル位置がおかしくなったりするなどの怪現象に遭遇しました。
どうやらこれは端末界ではよく知られたことらしく、ヘルプにも次のような注記があります。
NOTE: In some (older) xterms, it's not possible to move the cursor past column 95. This is an xterm problem, not Vim's. Get a newer xterm color-xterm. Now the limit is 223 columns.
このような制約を強いられることを憂慮する @kefir_ さんによってこの問題が vim-jp に提議され、SGR 形式のマウストラッキングサポートが patch 7.3.632 として晴れて本体に取り込まれました。
- 拡張マウストラッキングに対応するならばSGR-style - Togetter
- 提案:SGR形式のマウストラッキングサポート · Issue #220 · vim-jp/issues
- SGR(1006)形式の拡張マウストラッキングについて #224桁問題 #Terminal #端末エミュレーション - Qiita
ttymouse
の値として sgr
が指定できるようになります。私の端末だと 318 桁でもマウスイベントを認識してくれるようになりました。詳しいことはさっぱり理解できませんが、次のようなことらしいです。
@yoshikaw ドラッグ(Button Event Tracking相当)はttymouse=xterm2でも使えますね。xterm2->sgrは単純な座標の最大値の拡張と、リリース時のボタン番号がとれるという拡張のみになります。vimは後者の利点を活かすことはしていません。
— saitohaさん (@kefir_) 2012年9月7日
後者の利点を見いだそうとすると夜も眠れませんが、これで最近の幅広なディスプレイで右側が余っている端末 vim でも安心してマウスが使えます。
その後 patch 7.3.700 で機能認識の問題が修正されましたので、現在は次のような設定を .vimrc に書いています。
おわりに
ここで紹介したマウス操作はヘルプに書いてあることばかりですが、実際に端末(GNU Screen 含む)越しにスクロールやドラッグができると便利なものです。端末作業をしているとついマウスによる操作をおろそかにしがちですが、適材適所、使い分けてゆきたいですね。
明日は @tyru さんです。何連鎖まで行くでしょうか。楽しみですね。
0 件のコメント:
コメントを投稿