🏃

neovimを使って4ヶ月

2025/01/29に公開

2024年の9月末からNeovimを始めてみて、4ヶ月が経過しました。Neovimを使い始めてから4ヶ月経って感じたこと・メリットとデメリットなどを軽くまとめます。

https://zenn.dev/vim_jp/articles/1b4344e41b9d5b

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を利用しています。

https://github.com/rmehri01/onenord.nvim

無理にneovim上で完結しようとしない

コンフリクト解消などのneovimであまり行わない操作については、今でもPyCharmなどの使い慣れた方法に則っています。一応diff-viewと言うプラグインを入れているので、neovim上で解決もできるのですが頻度が多くなく慣れたPyCharmを使ってしまいます。

今はほとんどないですが、neovimでのコーディングに慣れる11月末くらいまでは、PyCharmなどと併用してコーディングしていました。無理にneovimを使いすぎないことも大事だと思っています。あと、ちょっとしたファイルの中身を見たい時には逆にVSCodeをまだ使ったりしています。

あと、コードの追加などは便利なのですが、細かいコピー&ペーストを繰り返すような作業はまだまだ早く実行できないです。

LLMの活用はこれから

LLMを活用したコード補完については、まだ十分に対応できていません。一応avanteparrotcodecompanionなどのプラグインを利用すれば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が↓キーと同じ動作をするように設定を加えました。

zshrc
bindkey '^k' history-beginning-search-backward
bindkey '^j' history-beginning-search-forward

こうすることで、矢印キーに手を動かさなくても、直前に打ったコマンドなどを参照できるようになりました。

影響②: モニタ・ウィンドウの切り替え

https://zenn.dev/mozumasu/articles/mozumasu-window-costomization

上記の記事を見て、aerospaceを導入しました。以前yabaiなどのウィンドウマネージャーの導入などを試みたのですが、設定のところがわかりにくく諦めていました。一方、aerospaceはパッと見で設定の方法がわかりやすく、かつデフォルトで色々設定されており導入しやすかったです。

aerospaceを導入すると、⌥ + 11⌥ + 22⌥ + cc⌥ + wwのワークスペースを切り替え・表示できます。私は、⌥ + wWezTermを、⌥ + cChromeを切り替えるように設定しています(その他にもSlack, PyCharm, YouTube Music, Fork, VSCodeなどを設定しています)。また、⌥ + Tabで直前にフォーカスしていたウィンドウに移動できるのも地味に便利で、ターミナルとブラウザを楽に行き来できます。

~/.config/aerospace/aerospace.toml
[mode.main.binding]
alt-1 = 'workspace 1'
alt-2 = 'workspace 2'
(中略)
alt-c = 'workspace C'
(中略)
alt-w = 'workspace W'

また、以下の設定でChromeなどを立ち上げると自動的にワークスペースCにChromeのウィンドウを移動するようにしてくれます。

~/.config/aerospace/aerospace.toml
[[on-window-detected]]
if.app-id = 'com.google.Chrome'
run = 'move-node-to-workspace C'

ここまでのaerospaceのworkspaceとwindowのイメージを以下に表します。

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     | |
    | |                     | | | |                     | |
    | |                     | | | |                     | |
    | |                     | | | |                     | |
    | +---------------------+ | | +---------------------+ |
    +-------------------------+ +-------------------------+

ここまではワークスペースとウィンドウだけの話ですが、ワークスペースを特定のモニタに自動的に割り当てることもできます。

aerospaceのmonitorとworkspaceとwindowのイメージ
モニタが3台ある場合のイメージ
  +=====================+ +=====================+ +=====================+
  |(monitor 1)          | |(monitor 2)          | |(monitor 3)          |
  | +-----------------+ | | +-----------------+ | | +-----------------+ |
  | |(workspace C)    | | | |(workspace W)    | | | |(workspace M)    | |
  | +-----------------+ | | +-----------------+ | | +-----------------+ |
  +=====================+ +=====================+ +=====================+

workspace-to-monitor-force-assignmentを利用すると、特定のモニタにウィンドウの割り当てができます。以下の設定で、向かって左のモニタにワークスペースのCSTVを、真ん中のモニタにワークスペースのPWを、右側のモニタにDFMを自動的に設置するようにします。

~/.config/aerospace/aerospace.toml
[workspace-to-monitor-force-assignment]
C = 1
D = 3
F = 3
M = 3
P = 2
S = 1
T = 1
V = 1
W = 2
aerospaceの上記の設定のイメージ
`⌥ + 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でリンクの選択などができるようになります。どうしても動かないページなどは出てきてしまいますが、スクロールができるようになるのはとても便利なので使っています。

https://chromewebstore.google.com/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb?hl=ja

おわりに

使い始めて4ヶ月くらいが経過してどんな感じなのか軽くまとめてみました。
neovimとかターミナルに篭り続けるのは、体験として非常に良いのでこれからも続けていきます。

GitHubで編集を提案

Discussion