msfukuiの日記

おおまさのみみはそらのみみ。

Vim Terminal mode 周りの設定の備忘録

もうちょっとちゃんと Vim を使っていきたい欲が高まっているので、少しずつ設定を入れたり本を読んだり Youtube を眺めたりしているのですが、 Terminal 周りの設定で四苦八苦したので、備忘録を兼ねて。

やりたいこと

これ。

qiita.com

Vim のウインドウ分割と Terminal 機能を気軽に使える状態にしたいなって思っていて、記事を拝見しごもっともだなって思って、設定に足を踏み入れたのですが、いろいろと地雷を踏みました。

やったこと

今のところこのあたりの設定に落ち着いています。L343 - L352 あたりと L377 以降になります。

github.com

前提

私有の Intel Macbook Pro と会社から支給されている M2 Macbook Pro の Terminal.app で Terminal 版の Vim を利用する想定です。

外付けの英字キーボードを使っています。

Windows のことは(環境はあるのですが)一旦脇に置く。

GUI 版の Vim は今まで使ったことがなくて、今のところ今後も使う予定がありません。

踏んだ地雷と対処

最初に Claude3 に対処方法を聞いてみたのですが、聞き方が悪いのか、最後まで意味のある対応内容を回答してくれることはありませんでした。

正反対のことを回答することが多く、AI はこの用途には向いていなさそうなことがよくわかりました。

Terminal.app の設定

プロファイル > キーボード の「メタキーとして Option キーを使用」にチェックを入れる

Option + いろんなキーを押すと、制御文字ではなくていろんなギリシャ文字っぽいものが入力できて、なんだーって思ったのですが、比較的たくさんの情報があって気がつきました。

IntelliJ IDEA の Terminal でも同じ設定があるみたいであとで試してみる。

https://youtrack.jetbrains.com/issue/IDEA-165184

Vim の Meta キーのマッピング設定

<A-..> の設定を入れてみたのですが、動作せず、理由を探していたところで、以下の比較的古い記事を拝見しました。

thinca.hatenablog.com

Option キーは ESC とマップする必要があるみたいで、アレンジして nmap <ESC>t <A-t> などと設定を入れてみると動作しました!

この情報、なかなか見つからなくて、時間がかかりました。

Vim Terminal mode 周りの設定

最初の記事のマッピング設定をアレンジして入れてみました。

当初 tmap の設定が漏れていることに気が付かず、二日ほど時間を無駄にしました。。

慣れるとサクサク操作できて快適。

" Alt key を normal mode で有効にする
nmap <ESC>w <A-w>
nmap <ESC>t <A-t>
nmap <ESC>s <A-s>
nmap <ESC>v <A-v>
nmap <ESC>j <A-j>
nmap <ESC>k <A-k>
nmap <ESC>o <A-o>
nmap <ESC>; <A-;>
nmap <ESC>/ <A-/>

" Alt key を Terminal 内の Vim でも有効にする
tmap <ESC>w <A-w>
tmap <ESC>t <A-t>
tmap <ESC>s <A-s>
tmap <ESC>v <A-v>
tmap <ESC>j <A-j>
tmap <ESC>k <A-k>
tmap <ESC>o <A-o>
tmap <ESC>; <A-;>
tmap <ESC>/ <A-/>

" ターミナルモードのキーマップ変更 (C-w をシェルで有効に)
set termwinkey=<A-w>
" ターミナルジョブモードで垂直分割した右ウインドウを開く
noremap <A-t> :vs<CR><C-w>l:term ++curwin<CR>
" ターミナルジョブモードからノーマルモードに切り替える
tnoremap <A-t> <C-\><C-n><CR>
" 水平分割した上ウィンドウを開く
noremap <A-s> :sp<CR>
" 垂直分割した右ウィンドウを開く
noremap <A-v> :vs<CR>
" ウインドウ間移動
noremap  <A-j> <C-w>w
tnoremap <A-j> <C-\><C-n><C-w>w
" ウィンドウ間を逆に移動
noremap  <A-k> <C-w>W
tnoremap <A-k> <C-\><C-n><C-w>W
" 他のウィンドウを閉じて最大化する
noremap  <A-o> <C-w>o
tnoremap <A-o> <C-\><C-n><C-w>o
" コマンドラインモードに移行
noremap  <A-;> :
tnoremap <A-;> <C-\><C-n><C-w>:
noremap  <A-/> /
tnoremap <A-/> <C-\><C-n>/
" ウインドウ操作時にターミナルノーマルモードの場合は
" 自動でジョブモードに切り替える
autocmd WinEnter * if &buftype ==# 'terminal' | normal i | endif

おしいところ

tmap で ESC + .. をキー割り当てしている関係上避けられないのですが、 Terminal job mode で開いているターミナルで、コマンドラインの vi mode のノーマルモードへの切り替えに ESC キーの入力待ちが発生します。

根本的に Option キーを Karabiner-Elements で別キーにマッピングすることも考えたのですが、Terminal.app 以外の操作に悪影響がありそうだったので、ここは一旦あきらめています。

その他

プロンプト表示をシンプルな内容に見直したり、 fzf-tab を入れたり、vimwiki を使うようになったり、少しずつタイピング練習したり、新しいキーボードを買いすぎて怒られたりしています。

今しばらくは VimIntelliJ IDEA の両方でコードを書くことになりそうです。使いこなせるようになる日は来るんだろうか。。頑張ります。