Neovimを使って4ヶ月
2024年の9月末からNeovimを始めてみて、4ヶ月が経過しました。Neovimを使い始めてから4ヶ月経って感じたこと・メリットとデメリットなどを軽くまとめます。
neovimを使っての所感
ウィンドウの切り替えがすぐできて楽で良い
まず、Neovimでのコーディングに慣れたかと言うと2024年の12月中旬くらいには慣れていました。少なくとも、コーディングはほぼNeovim上で完結できるようになりました。ブラウザなどどうしても必要な場合以外はターミナルにこもることができるので非常に体験として良いです。特に、「コード編集〜コミット」までの流れの体験が良いです。
| 操作・時間軸 | 以前 | 現在 | 
|---|---|---|
| コード編集 | PyCharmで編集 | neovim (on WezTerm)で編集 | 
| ↓ | トラックパッド操作 | キーボード操作 | 
| ↓ | 4本指でスワイプしてmission-controlから | space -> l -> gを順に押下 | 
| ↓ | Forkを見つけ選択する(3秒くらい) | (ほぼ0秒) | 
| Git操作 | ファイルを選んでダブルクリックなどでstaging | ファイルを選んで space+jkでstaging | 
文字に起こすとそうでもない気がしますが、ターミナルの中にこもることができ対象のウィンドウを見つける煩雑さから解放されたのは大きいです。行ごとのコミットもlazygitで問題なくできるので、そういった点でも通常のcommitに関しては不自由なく実行できます。
そのほかの気に入っている点として、異なるリポジトリ間のエディタの移動がとても楽になりました。以前はだいたい3リポジトリくらいはPyCharmなどで開いており、上のタブでリポジトリをマウスで切り替えて使っていました(もしかしたらショートカットがあったのかもしれません)。それが今では、ターミナル上の異なるウィンドウ(WezTermにおけるペイン)でneovimを開いておき、⌘ + Shift + j (or k)で移動できます。また、ターミナルでのコマンド実行も同様に⌘ + Shift + j (or k)でペインを切り替えて実行でき、マウスに触らずに完結できるのでとても良いです。

PyCharmの上のタブの切り替えのイメージ
 dotfilesの編集でneovimに慣れる
使い始めは、zennの記事の作成や、dotfilesを更新するときに使っていました。しばらくは実際のコーディングには利用できていませんでしたが、12月くらいからは、neovimの操作に慣れてきてコーディングもできるようになってきました。
ただ、エディタの配色(カラースキーマ)には目が馴染みませんでした。ずっとIntellijの配色に慣れていたこともあり、そこが変わってしまうとコードが全く読めなくなりました。一旦、目に馴染む以下のonenordと言うcolorschemaを利用しています。
無理にneovim上で完結しようとしない
コンフリクト解消などのneovimであまり行わない操作については、今でもPyCharmなどの使い慣れた方法に則っています。一応diff-viewと言うプラグインを入れているので、neovim上で解決もできるのですが頻度が多くなく慣れたPyCharmを使ってしまいます。
今はほとんどないですが、neovimでのコーディングに慣れる11月末くらいまでは、PyCharmなどと併用してコーディングしていました。無理にneovimを使いすぎないことも大事だと思っています。あと、ちょっとしたファイルの中身を見たい時には逆にVSCodeをまだ使ったりしています。
あと、コードの追加などは便利なのですが、細かいコピー&ペーストを繰り返すような作業はまだまだ早く実行できないです。
LLMの活用はこれから
LLMを活用したコード補完については、まだ十分に対応できていません。一応avanteやparrot、codecompanionなどのプラグインを利用すればLLMを利用したコード支援は活用できますが、まだ改善の余地があるかなと思います。
neovim以外への影響
neovim以外の操作に関しても、キーボードでの操作で完結できるようになりました。neovimを使っていると、ターミナルの中によりこもりたくなってきます。それに伴ってエディタ以外にも快適に操作できるようにしてきました。
影響①: zshのアップデートとキーバインドの追加
今まで、プライングマネージャとしてzinitを利用していました。ただ、最近はsheldonと言うのがRustで書かれており起動も早いと言うことで乗り換えました。元々のzshの起動時間が遅かったということもあって、切り替えた直後はあまり早いと思いませんでしたが設定などを見直して、今は50[ms]くらいで起動するようになったので、いい感じです。
$ time zsh -i -c exit
zsh -i -c exit  0.05s user 0.05s system 71% cpu 0.148 total
また、指を矢印キーに持っていくのが面倒なのでCtrl + Kが↑キーと、Ctrl + Jが↓キーと同じ動作をするように設定を加えました。
bindkey '^k' history-beginning-search-backward
bindkey '^j' history-beginning-search-forward
こうすることで、矢印キーに手を動かさなくても、直前に打ったコマンドなどを参照できるようになりました。
影響②: モニタ・ウィンドウの切り替え
上記の記事を見て、aerospaceを導入しました。以前yabaiなどのウィンドウマネージャーの導入などを試みたのですが、設定のところがわかりにくく諦めていました。一方、aerospaceはパッと見で設定の方法がわかりやすく、かつデフォルトで色々設定されており導入しやすかったです。
aerospaceを導入すると、⌥ + 1で1、⌥ + 2で2、⌥ + cでc、⌥ + wでwのワークスペースを切り替え・表示できます。私は、⌥ + wでWezTermを、⌥ + cでChromeを切り替えるように設定しています(その他にもSlack, PyCharm, YouTube Music, Fork, VSCodeなどを設定しています)。また、⌥ + Tabで直前にフォーカスしていたウィンドウに移動できるのも地味に便利で、ターミナルとブラウザを楽に行き来できます。
[mode.main.binding]
alt-1 = 'workspace 1'
alt-2 = 'workspace 2'
(中略)
alt-c = 'workspace C'
(中略)
alt-w = 'workspace W'
また、以下の設定でChromeなどを立ち上げると自動的にワークスペースCにChromeのウィンドウを移動するようにしてくれます。
[[on-window-detected]]
if.app-id = 'com.google.Chrome'
run = 'move-node-to-workspace C'
ここまでのaerospaceのworkspaceとwindowのイメージを以下に表します。
1つのworkspaceに1つのwindowだと次のようになります
    +-------------------------+ +-- ...
    |(workspace 1)            | |(workspace ... 他のワークスペースも存在はしている)
    | +---------------------+ | |   ...
    | |(window) Chrome      | | |   ...
    | |                     | | |   ...
    | |                     | | |   ...
    | |                     | | |   ...
    | +---------------------+ | |   ...
    +-------------------------+ +-- ...
1つのworkspaceに2つのwindow(ChromeとTerminal)の状態です
(私はあまり使うことはないです)
    +-------------------------+
    | (workspace 1)           |
    | +---------+ +---------+ |
    | |(window) | |(window) | |
    | | Chrome  | |Terminal | |
    | |         | |         | |
    | |         | |         | |
    | +---------+ +---------+ |
    +-------------------------+
特定のworkspaceに特定のwindowだと次のようになります
(`⌥ + c`で`Chrome`が、`⌥ + w`で`WezTerm`が見えるようになっている)
    +-------------------------+ +-------------------------+
    |(workspace C)            | |(workspace W)            |
    | +---------------------+ | | +---------------------+ |
    | |(window) Chrome      | | | |(window) WezTerm     | |
    | |                     | | | |                     | |
    | |                     | | | |                     | |
    | |                     | | | |                     | |
    | +---------------------+ | | +---------------------+ |
    +-------------------------+ +-------------------------+
ここまではワークスペースとウィンドウだけの話ですが、ワークスペースを特定のモニタに自動的に割り当てることもできます。
モニタが3台ある場合のイメージ
  +=====================+ +=====================+ +=====================+
  |(monitor 1)          | |(monitor 2)          | |(monitor 3)          |
  | +-----------------+ | | +-----------------+ | | +-----------------+ |
  | |(workspace C)    | | | |(workspace W)    | | | |(workspace M)    | |
  | +-----------------+ | | +-----------------+ | | +-----------------+ |
  +=====================+ +=====================+ +=====================+
workspace-to-monitor-force-assignmentを利用すると、特定のモニタにウィンドウの割り当てができます。以下の設定で、向かって左のモニタにワークスペースのCSTVを、真ん中のモニタにワークスペースのPWを、右側のモニタにDFMを自動的に設置するようにします。
[workspace-to-monitor-force-assignment]
C = 1
D = 3
F = 3
M = 3
P = 2
S = 1
T = 1
V = 1
W = 2
`⌥ + c`で`Chrome`にフォーカスが、`⌥ + w`で`WezTerm`にフォーカスが当たる。
`⌥ + c`で(monitor 1)にあるChromeにフォーカスをした後に、
`⌥ + s`を押下すると、Slackが(monitor 1)にてフォーカスされる
  +=====================+ +=====================+ +=====================+
  |(monitor 1)          | |(monitor 2)          | |(monitor 3)          |
  | +-----------------+ | | +-----------------+ | | +-----------------+ |
  | |(workspace C)    | | | |(workspace P)    | | | |(workspace D)    | |
  | +-----------------+ | | +-----------------+ | | +-----------------+ |
  | +-----------------+ | | +-----------------+ | | +-----------------+ |
  | |(workspace S)    | | | |(workspace W)    | | | |(workspace F)    | |
  | +-----------------+ | | +-----------------+ | | +-----------------+ |
  | +-----------------+ | |                     | | +-----------------+ |
  | |(workspace T)    | | |                     | | |(workspace M)    | |
  | +-----------------+ | |                     | | +-----------------+ |
  | +-----------------+ | |                     | |                     |
  | |(workspace V)    | | |                     | |                     |
  | +-----------------+ | |                     | |                     |
  +=====================+ +=====================+ +=====================+
私の環境は、macにSANWA 400-VGA023を接続して、DisplayLinkを介して合計3枚のディスプレイを繋げて作業をしています。aerospaceを使うことでシングルモニタでも作業の負担、主にウィンドウの切り替えが軽減されました。
影響③: Chromeをvimっぽく操作する
以下の拡張機能を入れると、jkで画面のスクロールをし、fでリンクの選択などができるようになります。どうしても動かないページなどは出てきてしまいますが、スクロールができるようになるのはとても便利なので使っています。
おわりに
使い始めて4ヶ月くらいが経過してどんな感じなのか軽くまとめてみました。
neovimとかターミナルに篭り続けるのは、体験として非常に良いのでこれからも続けていきます。


Discussion