LoginSignup
17
11

Rust製のエディタHelixを紹介第二弾

Last updated at Posted at 2022-08-12

:point_right: github
:point_right: web
:point_right: doc

:point_right: 22.12 update info

helix 24.3 に更新 (2024/04/07)

Summary

ver 24.3から追加されたジャンプラベル機能の例

gw_dhc.png

✅おすすめする人

  • nvim/vimのライトユーザー

  • pluginのエラーを見るとため息をついてしまう人

  • vscodeが最近重いと感じる人

  • モード系のエディタ初心者

🚫おすすめしない人

  • nvim/vimのヘビーユーザー

  • プラギンのエラーを見ると修正する人

  • vscodeの特定の機能が必要な人

  • emacsやvimのキーバインド重視派

思った以上に機能が増えたり修正されたりし、ここ数ヶ月で一気にnvim/vimの代替になりそうな気がしてきた

そこで簡易的なコードを書く時にはhelixを使うようにして操作感を手に馴染ませてきた

これにより選択モード(select/extend mode)とマイナーモードのキーコンボが編集の幅を広げることが分かった

そしてまだ足りない,操作感が悪いなあという問題の輪郭が見え始めてきた

個人的に後はプラグインができるのとomni補完とかができれば正直多くの人とまではいかないまでも,ライトユーザーにはnvim/vimの代替になると思う

私自身、nvim/vimのライトユーザーでどうしてもプラグインマネージャーを駆使して何十、何百というプラグインを管理するのが難しい上にめんどくさいという課題があった

特に、言語ではなくエディタの機能向上系のpluginは使い勝手に直結するのに、ほぼ必須なのはなんかなあといつも思っていた

deinを使いdeopleteを使い、dark poweredに染まってシスの暗黒面に落ちかけたが結局私はシスを裏切るカイロ・レンのようにHelixへ移ってしまった

How to Install

Rustがない場合はリリースノートからダウンロードする

ダウンロードした中にruntimeのフォルダーがあるのでそれをコピーする

# cmd
xcopy /e /i runtime %AppData%\helix\runtime
# PowerShell
xcopy /e /i runtime $Env:AppData\helix\runtime
# PowerShellシンボリックリンク
New-Item -ItemType Junction -Target "runtime" -Path "$Env:AppData\helix\runtime"
# Linux/macOs
ln -s $PWD/runtime ~/.config/helix/runtime
# homebrew
brew tap helix-editor/helix
brew install helix

インストールが完了したら以下のコマンドができるかを確認する

hx -V # バージョン確認
hx -H # ヘルプ参照 

個人的にはリリースノートよりもソースコードからbuildした方が機能が豊富で良いと思う

Rustがある人はビルドするのをお勧めする

git clone https://github.com/helix-editor/helix
cd helix
cargo install --path helix-term

上記と同じでhelixの中にあるrutimeフォルダーをコピーする(上記のコマンドどれか)

LSP Settings

必要な言語がある場合はその言語がまずLSPのサポートがされているかをhx —health (lang)を使って確認する

ここでLSPの項目がNoneになっていたらそもそもhelixでLSPを扱えないのでPRを待つか、自分で探してPRを作るしかない

ex) Erg

> hx --health erg
Configured language server: None
Configured debug adapter: None
Highlight queries: ✘
Textobject queries: ✘
Indent queries: ✘

今回は例としてrust-analyzerをインストールする方法を説明する

https://rust-analyzer.github.io/manual.html#installationにあるようにhelixではバイナリーを利用する

なのでreleasesから自分の環境のバイナリーをインストールする

vscodeやrustcに入っている場合は、それがPATHにあれば恐らく機能すると思うが確証がない

windows11の人はこれを好きな所へ解凍する

解凍した.gzファイルを.exeに変換する

gzip -d rust-analyzer-versionname.gz # 解凍、7-zipでも良いし、wslで開いてこれをやるでもいい
mv rust-analyzer-versionname.gz rust-analyzer.exe # exeの拡張子に直す

私の場合はC:\\直下にhelix-lspのディレクトリを作成してその中に入れている

次に、それをPATHに追加するので、”環境変数の編集”の”Path”の”新規”で先ほどのディレクトリを追加する

C:\helix_lsp\elixir
C:\helix_lsp\rust-analyzer # rustはこれ
# python-lsp-seaverはpip installで入れれるので自分の環境に合わせてインストールする

Linuxやmacosの人はcurlが使えるので以下のコマンドで.localに入れることもできる

# linux/macos
mkdir -p ~/.local/bin
curl -L https://github.com/rust-lang/rust-analyzer/releases/latest/download/rust-analyzer-x86_64-unknown-linux-gnu.gz | gunzip -c - > ~/.local/bin/rust-analyzer
chmod +x ~/.local/bin/rust-analyzer

ログアウトしてサインインし直す

バージョンが表示されるようになったら成功

rust-analyzer.exe --vesion
rust-analyzer --version

ここでバージョンが出せなかったらバイナリーの解凍ができていないか、PATHを通せていないかのどちらかだと思うので重点的に見直す

最終的に以下のような形になっていればいい

> hx --health rust
Configured language server: rust-analyzer
Binary for language server: C:\helix_lsp\rust-analyzer\rust-analyzer.EXE
Configured debug adapter: codelldb # デバッグ用なのでこれはなくても問題ない
Binary for debug adapter: C:\helix_lsp\codelldb-x86_64-windows\extension\adapter\codelldb.EXE
Highlight queries: ✔
Textobject queries: ✔
Indent queries: ✔

Setting

設定が必要ファイルはconfig.tomllanguages.tomlの二つ

config.toml

hxでhelixを起動し、:config-openですぐに開くことができる

とりあえず下のをコピペするだけで良い

# 任意のテーマ
theme = "base16_transparent"

[key.cursor-shape]
insert = "bar"
normal = "block"
select = "underline"

[keys.insert]
j = { j = "normal_mode"} # jjでノーマルモードへ戻る
# C: Ctrl, S: Shift, A: Alt それぞれの接頭辞
# "C-c" = "normal_mode" # Ctrl-cでノーマルモードへ戻る

保存されている場所は以下の場所へ自動的に作られる

# windows10
~\AppData\Roming\helix\config.toml
# linux\macOS
~/.config/helix/config.toml

エラーが発生したりクラッシュした際にはhelixのログを見ることもできる

再現性がある場合には特に以下の引数をつけてファイルを開くことで詳細なログを取ることができる

hx -v filename
hx -vv filename
hx -vvv filename # 一つ増えるごとにログが詳細になっていく

これも:log-openで自動で開くことができる

これが保存される場所は先ほどとは異なる場所に保存される

# windows
~\AppData\Local\helix\helix.log
# linux/macOS
~/.cache/helix/helix.log

詳細な設定

theme = "base16_transparent" # 任意のテーマ

[editor]
true-color = true # デフォルトがfalaseなのでこれをtrueにする、これのせいでテーマが上手く機能しない
rulers = [80] # ルーラーを設定できる、カラーはテーマ依存になるので細かい設定をしたければ自分でテーマを編集する必要がある
cursorline = true # これもデフォルトでfalseなのでtrueにするとlihgtlineみたいな見た目になる
color-modes = true # ステータスラインにモードごとに色が表示されるようにする,テーマ依存なので色が変になったらテーマが対応していないので注意が必要
auto-completion = true # 任意のキーで補完をしたい人はfalseにする
auto-save = true # これも任意で保存したい人はfalseにする

# デフォルトのこれで個人的には良い気がする
[editor.statusline]
left = ["mode", "spinner"]
center = ["file-name"]
right = ["diagnostics", "selections", "position", "file-encoding", "file-line-ending", "file-type"]
separator = "│" # 正直わかっていない
# 左下のモード名を任意の文字列に変えられる.ここで絵文字を使っても面白いかも
mode.normal = "NOR"
mode.insert = "INS"
mode.select = "SEL"

[editor.file-picker]
max-depth = 6 # pickerの検索するフォルダーの深さ
hidden = false # 隠しファイルフォルダーを検索しない

[editor.whitespace.render]
space = "all" # "all"か"none"の2択しかない
tab = "all"
newline = "all"

[editor.whitespace.characters]
space = "·"
nbsp = "⍽"
tab = "→"
# newline = "↲"
newline = "✔" # やろうと思えばこういうのもできる

[editor.indent-guides]
render = true # 個人の好みで、スペースよりもガイド派はこちらをtrueにする
character = "|" # バーティカルバーも好きにできるので:とかにしても良いかも

# EDIT(2023/2/06)
[editor.soft-wrap]
enable = true # ソフトラップによる改行を追加
# よくわかっていない
max-wrap = 20 # increase value to reduce forced mid-word wrapping
max-indent-retain = 20 # 改行ごのインデントの数
wrap-indicator = ""  # ソフトラップ改行したところの改行を表示

[editor.lsp]
display-inlay-hints = true # 型を表示

[keys.insert]
j = { j = "normal_mode" } # jjでノーマルモード
C-space = "completion" # Ctrl + spaceで補完

[keys.normal]
ret = ["open_below", "normal_mode"] # ノーマルモードでもenterで改行
backspace = "delete_char_backward" # 簡易的な一文字削除もできる
tab = ":bn" # tabで次のバッファーへ移動
S-tab = ":bp" # Shift + tabで前のバッファーへ移動

コメントを消したい場合はぜひ選択モードと正規表現を使いマルチカーソル + インサートモードで選択削除を試してみてください

%(全体選択) -> s(select regex) -> regex ptn -> enter(選択確定) -> d(delet selection) -> ,(keep primary selection)

nvim/vimのlightlineな見た目で個人的には過度に修飾しすぎていないシンプルなデザインが気に入っている

normal.png

insert.png

select.png

もっと修飾できるようにしているところらしい

カスタマイズ性が向上するのは非常に良いと思うが、テーマのメンテナンスが増えてしまう

これら新しいUIの変更があった際にはテーマに変更が反映されておらず、透明になってしまうのが今の問題になっている

themes.gif

実際、いくつかのテーマがすでに透明でメンテナンスされていないので注意が必要になる

個人的には気が向けば、メンテナンスがされていないテーマのPRを作ってみようかなあとは思っている

結構みん名頑張ってメンテナンスしている感じがする

  • 追記2024/05/08
    "built-in" themesでデフォルトのテーマや良く利用されるテーマのみを組込みテーマとして残して、あとはコミュニティに任せるかテーマ専用のリポジトリに分けるかも

langueages.toml

helixのgithubにあるlanguages.tomlから好きな言語をコピーして,新しくlanguages.tomlをconfig.tomlと同じディレクトリへ作成して貼り付けるだけ

よく見かける質問としてはデフォルトのじゃないLSPやフォーマッターを変えたいというのがある

その場合は以下のように好きに自分のを設定すればいいだけになる

[[language]]
name = "language"
language-server = { command = "another" }
formatter = { command = "name", args = ["arg00", "arg01"] }

# python
[[language]]
name = "python"
roots = ["pyproject.toml"]
language-server = { command = "pyright-langserver", args = ["--stdio"] }
config = {} # <- this is the important line

もしくは:sh black filenameのように直接コマンドとして呼び出すしかない

Favorite Points for Me

個人的にhelix editorが好きな点は以下の通り

  • 設定が他のエディタに比べて少ない
    • config.toml
    • language.toml
  • 取り出してすぐに使える
    • tree-sitter
    • picker
    • LSP
  • モーダルエディタ
    • normal
    • select
    • insert
    • command

個人的なランク付けマイナーモード

  1. Space
  2. Unimpaired
  3. Commands
  4. Goto
  5. Window
  6. Match
  7. (Sticky)View

Space Mode

本格的に使うようになってから特に使うようになった目玉の機能

  • Space+f/F: ファイルの曖昧検索
  • Space+b/B: バッファー検索
  • Space+a: コードアクション(クイックフィックス)
  • Space+/: グローバル検索
  • Space+k: ドキュメント参照
  • Space+d: エラー診断検索
  • Space+r/R リネーム
  • Space+w: 単語ジャンプ(vimのhopみたいなの)

file picker.png

doc ref.png

特にこれら機能が簡単にキーバインドされているおかげですぐにこれらを実行できるのが思っていた以上に自分の操作感の向上につながった

helix(kakue)ではShiftやCtrl、Altといった修飾キーを多用しないということがキーバインドのブレインストーミングでよく上がる

これはまさにキーコンボでこれらを行うというの例の一つになると思う

これらをVSCodeでやろうとするとCtrl+pCtrl+.など小指で同時に押さえることにより思った以上に手の負荷がかかってしまう

これがきっかけでhelixのスペースモードのキーバインドをそのままvscodeに移植して活用している

実際に移植してから手の疲れが減ったのでお勧めする

これは副次的だが、zellijtumuxi3wmみたいなのを使っているとどうしてもAltやCtrlの一部が優先的に拾われることがある

それで意図しない動きになるときがあるので、修飾キーが多用されないのは個人的には良いと思っている

Unimpaired Mode

vim-unimpairedの機能が元になっている

この中のd/DDiagnosticが非常に良く役立つ

これをとりあえず押してエラーの箇所へ移動するのに使う

欲を言えばwarningとerrorなどを分けて移動できれば良いなあと思う

helixではまだエラーのポップアップが上部に出るのでエラーの箇所とそのメッセージが離れていて読みにくいという難点がある

頑張ってinline diagnosticsを作っている最中

この診断移動以外は正直Goto Modeに近いので私はGoto Modeにリマッピングしている

g+f/Fで関数移動,g+p/Pでパラグラフ移動など

Commands Mode

基本的には保存や設定、画面の分割などに利用している

また:shを良く使っており、外部のフォーマッターやリンターなんかを使ったりするのに役立っている

一応[[languages]]でも各言語ごとに設定できるので必要はないが、めんどくさい時にはsh python black .とかcargo checkとか書き捨てコードで使ったりしている

:shは特に使い勝手が良く面白い使い方としては:sh gh repo view —webでgithub cliを利用しウェブを起動してリポジトリを表示するとかができる

helixのメンテナーの方がそれをキーバインド化しているのを見かけて確かにこんな使い方もできるなあと感心していた

個人的にはリマップしてよく使ったりしている

:next_bufferをtabにしたり ⇒ tab = ":next_buffer"

:prev_bufferをShift+tabにしたり ⇒ "S+tab" = ":prev_buffer"

:bc(:buffer-close)みたいな略型でリマップもできる ⇒ space+c = [”w”, “:format”,“:bc”] # 保存して、フォーマットして最後のバッファーじゃない限りそれでクローズする

いろいろと再マッピングのしがいがあり、考える余地をまだたくさん残している箇所になる

Discussions, Brain streamingで複数のコマンドをつなげたリマップは非常に参考になる

Goto Mode

思った以上に便利な機能

前回紹介したときにはhelix editorをコードを眺めるように利用していたためこれら編集に使うためのモードの優先順位が低かった

だが、ターミナルのメインエディタとして使い始めると思った以上にこの移動が役立つ

g+g, g+e, g+h, g+lのファイルの開始、最後、行頭、行末は無論のこと

  • g+d: 定義へ移動
  • g+i: 実装へ移動
  • g+r: 参照へ移動

これらLSPをフルに活用した移動が思っている以上に楽に使えるのが良かった

例えばvscodeだとF12だったりCtrl+F12だったりとファンクションキーはなかなか覚え辛い

そのうえ左右の小指を酷使したりする

だが、helixではg+で実行できしかも、gを押した段階でポップアップにより次のキーコンボを教えてくれるのですぐに覚えられる

これもスペースモード同様にvscodeに移植した

ただ、unimpairedと「移動」という機能が被って良く間違えることが多い

Window Mode

helixでデコーディングをするようになってからこれもよく使うようになった

画面を分割を複数すると画面の切り替えや画面移動がどうしても必要になりこれをよく使う

ただこれはCtrl+wとCtrlを押さないといけないのがまだ改善の余地ありだと思うところ

Space+wもあるが私はそれを:wにリマップしてしまっているので思ったいたより面倒になった

ただそこからの使いやすさは良いと思う

Shift+hjklで入れ替え、hjklで画面移動、Ctrl+fdbuで画面スクロールになっており、一貫性がありわかりやすいと思う

Match Mode

かなり便利だが使いこなせていないモードの一つ

vim/nvimのeasymotionに近い機能を持つ

これは選択モードにすぐに移行できかつ、指定する範囲をテキストオブジェクトで限定できる

現在いる関数やクラスで変更したいときはこれを使って編集した方が効率的である

分かっていてもどうしてもwとかfで細かい移動をしてしまう

vim/nvimでもそうだが,テキストオブジェクトを扱えるようになると途端にvim/nvimの編集力の凄さが分かってくる

このモードもそれにあたる

このモードをマスターすればかなりhelix editorの使い心地が変わってくる

(Sticky)View Mode

使い始めた頃はこれを多用してコードを眺めるときに使っていたが、unimpairedでワーニングやエラーの移動したり単純にCtrl+fやCtrl+dなどを覚えてしまいあまり使わなくなってしまった

思い出したように眺める際にticky View Modeを使い本当にView Mode単体は使わない

Base Mode

Normal Mode

各モードの起点になるモードで,ここはnvim/vimと大差がないので早く慣れると思う

ただ,デフォルトの移動で選択モードにもなるので半分選択モードと被っている

spece[, gとかのマイナーモードに移行するためのキーを覚えれば問題ないと思う

Insert Mode

Normal modeからのInsert modeは遷移が分かりやすくnvim/vimと大きく差がない

だが,行末の改行が一文字として扱われるため,行末へ移動したらi(nsert)をしないと次の行頭に入力してしまうことになる,削除も似た感じ

なのでSelect Modeと組み合わせたときにの扱い辛さが一番慣れが必要になる

ただ,慣れればかなり操作がしやすくなる

「選択して削除」,「選択して置換」といったように選択からの変更という日本語の並びに近いので脳みそで呪文みたいに唱えながら操作すると覚えやすい

Select/Extend Mode

Helixと言えばこのモードでありこれがneovim/vimとの大きな違いとなるモード

思っていた以上に慣れれば使いやすい

編集がこれを経由するおかげでしやすい

ただ、移動系がデフォルトで選択になるのがいまだに使い慣れず、セミコロンで縮小するが使いにくいなあと思っている

これの最大のポイントはsで選択することができ、マルチカーソルにすることができる点である

私はまだ使いこなせていないのはここでになる

Matchモードで関数やクラスで選択した後にsからの編集がはかどる

前述した通りvim/nvimもそうだが、テキストオブジェクトを扱えるようになると格段に編集速度が速くなる

helix editorではこのテキストオブジェクトにもLSPが使われているのでこれにより拡張されたテキストオブジェクトが使える

その上でsのselectが使えるようになると選択モードのありがたみが増してくる

例えば関数内の変数を置換をしたければ以下のように範囲を決めてできる

  1. mifで関数を選択
  2. sで正規表現を利用し範囲選択
  3. cで確定選択範囲を削除し,インサートモードへ移行
  4. 単語を入力
  5. ;でマルチカーソルを終了

この正規表現というところが味噌になる

これでいわゆる曖昧検索みたいなことを正規表現で実現できる

なので変数名とその変数名のタイポした微妙にずれた変数とか,複数のダブルクォーテーションで囲まれた文字などを簡単に指定することができる

そこにカーソルが挿入されるので,そこからさらにテキストオブジェクトを使って範囲を指定したりすることができるので更に拡張した範囲を編集することができる

私も初めはvim/nvimの矩形選択や単純な置換の方が扱いやすいと思っていた

だが,このマルチカーソル機能を使えるようになってから明らかにこちらの方が使い勝手が良いことに気づけた

もちろん正規表現やテキストオブジェクトを覚える手間はかかるが,その分のリターンを得ることができるようになる

Bad Points

  • プラグインがいまだに作れない

理由としては元にしていたwasmのフレームワークが閉じてしまったため、作っていた実装が無駄になってしまったという経緯がある

議論中 議論終了した

schemeみたいな言語に傾いているっぽい?

前に読み間違えてwasmでほぼ確定と書いていたけど間違い

スクリプトMLライクな書きやすさ重視の実装と,Rustベースのパフォーマンス重視の実装を作る予定でどちらもwasmを実行できるようにするらしい

  • Omni補完系ができない

私は結構走り書きや、markdownとして使ったりするのだが、単語レベルの補完がないことが非常につらい

LSPがあればそのワークスペース内のみで補完をすることができるが、その都度何かしら環境が必要なのが必要になるうえ,変数としてじゃないと補完が効かない

一応PRは作られており、出来上がりつつある

どうしてもLSPのようなものじゃないと大量の文字列があるときに処理コストがかさむので既存のregex系のアプローチだとダメ見たい

テキスト補完用のLSPもできたのでプレーンテキストなどでこのLSPを起動するみたいなアプローチになるのかも

  • Pop-upが見づらい

マイナーモードやコマンドモードのヘルプにはボーダーラインがあり見やすい

だが、内容が場所寄って変化する補完のポップアップやエラーメッセージのポップアップにはボーダーラインがつけられない(個人でこれの修正を試験的にやっている人がいて,それを見る限りは背景とボーダーラインがつけられるようになっている)

そのため、その行のコードが長いと同化してどこが切れ目かがわかりにくいなどの問題がある

一応背景はつけられるが文字ごとの背景なので少し見栄えが悪くなってしまう

加えてガターとステータスラインの●の背景にも追加されてしまう

diagnostic.png

加えて、LSPのメッセージは常に上に表示される

これはエラーなどを見る時に上のメッセージとエラーが出ている行が絶妙に離れているため見にくい

ちなみに白いエラーメッセージの下のa local variable...もLSPのメッセージである

このように、コードとメッセージが被って見にくかったり、そもそもカーソルが見えなくなったりしてimportを書くときは地獄になる

一応インラインのエラーメッセージなどができつつある

Conclusion

個人的にhelixが大きく化けてもはやメインのエディタになりつつある

ただ、所々がまだ使いにくくvscodeやpluginを備えたvim/nvimにはまだ追いつけていない感が否めない

ただ、vim/nvimのライトユーザーはHelixに乗り換えても大丈夫なくらいには機能が豊富になっている

問題点が割と自分の中だとくっきりしているのでこれらが修正される、またはpluginで調節できるようになった段階でVSCodeから移行もありだなあと思っているくらい

vimの操作感に近いコンフィグファイルがあるのでvimmerは一見の余地あり

17
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
11