vimからHelixに乗り換えたときのメモ
原文は Julia Evans により に公開されました。 このブログを購読する
こんにちは!今年の夏のはじめ頃、友人とfishを愛用していることや、設定不要なところがどれだけ気に入っているかという話をしていました。友人はHelixというテキストエディタに対して同じように感じていると言っていて、それで試してみることにしたんです。
もう3ヶ月ほど使っているので、気づいたことをいくつかメモしておきます。
Helixにした理由:言語サーバー
Helixを試そうと思ったきっかけは、言語サーバーをちゃんと動くようにしたかったからだと思います(「定義へ移動」のようなことができるようにしたくて)。VimやNeovimでしっくりくる設定を作るのは、ただただ面倒に感じられたんです。
20年間Vim/Neovimを使ってきて、「一から自分好みの設定を自作する」ことも「誰かが作った既製の設定システムを使う」ことも両方試してきました。Vimは大好きなのですが、設定をいじらなくてもそのまま動いてくれるというのは魅力的でした。
Helixは言語サーバーのサポートがはじめから組み込まれていて、どの言語でも「このシンボルをリネームする」といったことが手軽にできるのが気持ちいいです。
検索が素晴らしい
Helixでとくに気に入っていることのひとつが検索です!リポジトリ内のすべてのファイルを文字列で検索すると、候補のファイルをスクロールしながら、マッチした箇所の前後の文脈をまるごと確認できるんです。こんな感じです:

比較として、これまで使っていたVimのripgrepプラグインだとこんな表示になります:

その行の前後に何があるのか、文脈がまったくわかりません。
クイックリファレンスが便利
Helixで気に入っていることのひとつに、gを押すとジャンプ先の一覧を教えてくれる小さなヘルプポップアップが出ることがあります。「定義へ移動」や「参照へ移動」といった機能は頻繁に使うわけではないので、キーボードショートカットをよく忘れてしまうのですが、これがとても助かります。

vim → Helixの置き換えあれこれ
- Helixには
maや'aのようなマーク機能はありませんが、代わりにCtrl+OとCtrl+Iで直前のカーソル位置に戻ったり進んだりするようにしています - Helixにもマクロはあると思いますが、以前ならマクロを使っていた場面ではすべて複数カーソルで代用しています。毎回マクロを書くよりも、複数カーソルのほうがずっと気に入っています。ドキュメント内で一括で何かを変えたいときは、
%を押して全体をハイライトし、次にsを押して(正規表現で)変えたい箇所を選択し、あとはまとめて編集する、という流れでやっています。 - HelixにはNeovimのようなタブはありませんが、代わりに使いやすいバッファ切り替え機能(
<space>b)があって、切り替えたいバッファに飛べます。Neovim風のタブを実装するためのプルリクエストもあります。また、bufferline="multiple"という設定を使えば、gpやgnで前後の「タブ」に移動したり、:bcで「タブ」を閉じたりと、タブのように使うこともできます。
Helixのちょっと困るところ
これまでのところ、Helixでイライラした点を全部挙げてみます。
- Helixの
:reflowの動きは、Vimがgqでテキストを折り返すやり方に比べてあまり好きではありません。リストではうまく機能しないんです。(GitHub issue) - Markdownでリストを作っているときに、リスト項目の末尾でEnterを押してもリストが続かないんです。箇条書きリストについては部分的な回避策がありますが、番号付きリストについてはやり方がわかりません。
- まだ永続的なアンドゥがありません。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流」を覚える方がずっと楽でした。
それでもまだ戸惑うことはあります。たとえばVimのwとHelixのwでは「単語」の捉え方が違っていて、Helixの方は単語の後の空白まで含むのに対し、Vimは含みません。
ターミナルベースのエディタを使う
長年、主にvim/neovimのGUI版を使ってきたので、実際にターミナル内でエディタを使うように切り替えるのは少し慣れが必要でした。
最終的にこんな運用に落ち着きました:
- プロジェクトごとにターミナルウィンドウを1つ用意し、そのウィンドウ内のタブは(ほぼ)すべて同じ作業ディレクトリを使う
- 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を使っていて、そちらには満足しています)。
記事をランダムに読む
コメント
ログインしてコメントする