Notes on switching to Helix from vim

Julia Evans

VimからHelixに乗り換えたときの覚え書き

こんにちは!今年の夏のはじめ、友人とfishが大好きなことや、設定不要なところが気に入っているという話をしていました。友人はテキストエディタのhelixについても同じように感じていると言っていたので、試してみることにしました。

使い始めて3か月ほど経ったので、気づいたことをいくつか書き留めておきます。

Helixを選んだ理由:言語サーバー

Helixを試そうと思ったきっかけは、言語サーバーをきちんと動くようにしたかったからです(「定義へ移動」などができるようにしたかったのです)。VimやNeovimで使い心地の良い環境を整えようとすると、どうにも手間がかかりすぎると感じていました。

20年間Vim/Neovimを使ってきて、「一から自分で設定を組み上げる」ことも「他人が作った設定一式を使う」こともどちらも試してきました。Vimは大好きですが、設定に手をかけなくてもそのまま動いてくれることに惹かれました。

Helixには言語サーバーのサポートが最初から組み込まれていて、どの言語でも「このシンボル名を変更する」といった操作ができるのが心地よく感じます。

検索が素晴らしい

Helixで特にお気に入りなのが検索です!リポジトリ内のすべてのファイルから文字列を検索するとき、候補のファイルをスクロールしながら、ヒットした箇所の前後の文脈も含めて確認できます。こんな感じです。

比較のために、これまで使っていたVimのripgrepプラグインでの表示がこちらです。

こちらはヒットした行の前後に何があるのかがまったくわかりません。

クイックリファレンスが便利

Helixで気に入っているもう一つの点は、gを押すと移動先の候補を教えてくれる小さなヘルプポップアップが表示されることです。「定義へ移動」や「参照へ移動」といった機能はあまり頻繁に使わないので、キーボードショートカットをよく忘れてしまうのですが、このおかげでとても助かっています。

VimからHelixへの読み替え

  • Helixにはma'aのようなマーク機能がありません。その代わりに、Ctrl+OCtrl+Iで直前のカーソル位置に戻ったり進んだりするようにしています。
  • Helixにもマクロはあると思いますが、以前ならマクロを使っていた場面では、今はすべて複数カーソルで代用しています。いちいちマクロを書くよりも、複数カーソルのほうがずっと気に入っています。ドキュメントを一括で変更したいときは、%で全体を選択し、sで正規表現を使って変更したい箇所を選択してから、一気に編集するようにしています。
  • HelixにはNeovimのようなタブはありませんが、便利なバッファ切り替え機能(<space>b)で切り替えたいバッファに移動できます。Neovim風のタブを実装するプルリクエストはこちらにあります。また、bufferline="multiple"という設定にすると、gpgnで前後の「タブ」に移動したり、:bcで「タブ」を閉じたりと、タブのように使うこともできます。

Helixで気になるところ

これまでにHelixで気になった点をすべて挙げてみます。

  • Helixの:reflowは、Vimのgqでの折り返しと比べるとあまり好きではありません。リストとの相性がよくありません(GitHubのissue)。
  • Markdownのリストを作成しているときに、リスト項目の末尾でEnterを押してもリストが続かないことです。箇条書きリストについては部分的な回避策がありますが、番号付きリストでの方法はわかりません。
  • まだ永続的なundoがありません。Vimではundofileを使って、終了後でも変更を取り消すことができましたが、Helixにはまだその機能がありません(GitHubのPR)。
  • Helixはディスク上でファイルが変更されても自動で再読み込みしてくれません。:reload-all:ra<tab>)で手動で再読み込みする必要があります。とはいえ大した問題ではありません。
  • ときどきパニックを起こします。1週間に1回くらいでしょうか。このissueが原因かもしれません。

クラッシュ時の表示はだいたいこんな感じです。

thread 'main' panicked at helix-core/src/transaction.rs:499:9:
Positions [(2959, AfterSticky), (2959, AfterSticky)] are out of range for changeset len 2945!
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Markdownのリストや折り返しの問題は、Markdownのリストを編集することが多いので頻繁に遭遇しますが、それでもHelixを使い続けているので、そこまで深刻には感じていないのだと思います。

乗り換えは思ったより簡単でした

20年分のVimの指の癖を覚え直すのはとても大変なのではないかと心配していました。

実際は思ったよりも簡単でした。休暇中にちょっとした個人プロジェクトでHelixを使い始めたのですが、1〜2週間もすると違和感はだいぶなくなりました。VimとHelixを行き来するのは難しいかもしれませんが、最近はVimを使う必要がなかったので、それが問題になるかどうかはまだわかりません。

最初にHelixを試したときは、Vimに近いキーバインドを無理に設定しようとして、うまくいきませんでした。素直に「Helix流」を覚えるほうがずっと楽でした。

今でも戸惑うことはあります。例えばwの「単語」の捉え方はVimとHelixで異なります(Helixでは単語の後の空白も含みますが、Vimでは含みません)。

ターミナルベースのテキストエディタを使う

長年、Vim/NeovimはGUI版を主に使ってきたので、実際にターミナル内でエディタを使うようになるのは少し慣れが必要でした。

最終的に、こんな運用に落ち着きました。

  1. プロジェクトごとに専用のターミナルウィンドウを用意し、そのウィンドウ内のタブは(ほぼ)同じ作業ディレクトリにする
  2. Helixのタブをターミナルウィンドウの最初のタブにする

なかなかうまくいっていて、以前のワークフローよりも気に入っているかもしれません。

私の設定

Neovimでは何百行もあった設定と比べると、今の設定はとてもシンプルで気に入っています。ほとんどキーボードショートカットが4つあるだけです。

theme = "solarized_light"
[editor]
# Sync clipboard with system clipboard
default-yank-register = "+"

[keys.normal]
# I didn't like that Ctrl+C was the default "toggle comments" shortcut
"#" = "toggle_comments"

# I didn't feel like learning a different way
# to go to the beginning/end of a line so
# I remapped ^ and $
"^" = "goto_first_nonwhitespace"
"$" = "goto_line_end"

[keys.select]
"^" = "goto_first_nonwhitespace"
"$" = "goto_line_end"

[keys.normal.space]
# I write a lot of text so I need to constantly reflow,
# and missed vim's `gq` shortcut
l = ":reflow"

言語ごとの設定は別のlanguages.tomlで行っていて、自動フォーマットをオフにするといった言語別の設定をしています。例えばPythonの設定はこんな感じです。

[[language]]
name = "python"
formatter = { command = "black", args = ["--stdin-filename", "%{buffer_name}", "-"] }
language-servers = ["pyright"]
auto-format = false

今後どうなるかは様子見です

3か月というのはまだそれほど長い期間ではないので、いつかまたVimに戻る可能性もあります。例えば、以前nixへの乗り換えについての記事を書いたときも、8か月ほど使ったあとにHomebrewに戻しました(とはいえ、今でも小さなサーバー1台ではNixOSを使い続けており、その点では満足しています)。

原文は Julia Evans により に公開されました。

この記事は「muse-spark-1.2-contributor」を使用して翻訳されました。