helix 24.3 に更新 (2024/04/07)
Summary
ver 24.3から追加されたジャンプラベル機能の例
✅おすすめする人
-
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.toml
とlanguages.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.cursor-shape]
insert = "bar"
normal = "block"
select = "underline"
# デフォルトのこれで個人的には良い気がする
[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 # 型を表示
[editor.inline-diagnostics]
cursor-line = "hint" # エラーメッセージなどをインラインにする
[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な見た目で個人的には過度に修飾しすぎていないシンプルなデザインが気に入っている
もっと修飾できるようにしているところらしい
カスタマイズ性が向上するのは非常に良いと思うが、テーマのメンテナンスが増えてしまう
これら新しいUIの変更があった際にはテーマに変更が反映されておらず、透明になってしまうのが今の問題になっている
実際、いくつかのテーマがすでに透明でメンテナンスされていないので注意が必要になる
個人的には気が向けば、メンテナンスがされていないテーマの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
個人的なランク付けマイナーモード
- Space
- Unimpaired
- Commands
- Goto
- Window
- Match
- (Sticky)View
Space Mode
本格的に使うようになってから特に使うようになった目玉の機能
- Space+f/F: ファイルの曖昧検索
- Space+b/B: バッファー検索
- Space+a: コードアクション(クイックフィックス)
- Space+/: グローバル検索
- Space+k: ドキュメント参照
- Space+d: エラー診断検索
- Space+r/R リネーム
- Space+w: 単語ジャンプ(vimのhopみたいなの)
特にこれら機能が簡単にキーバインドされているおかげですぐにこれらを実行できるのが思っていた以上に自分の操作感の向上につながった
helix(kakue)ではShiftやCtrl、Altといった修飾キーを多用しないということがキーバインドのブレインストーミングでよく上がる
これはまさにキーコンボでこれらを行うというの例の一つになると思う
これらをVSCodeでやろうとするとCtrl+p
やCtrl+.
など小指で同時に押さえることにより思った以上に手の負荷がかかってしまう
これがきっかけでhelixのスペースモードのキーバインドをそのままvscodeに移植して活用している
実際に移植してから手の疲れが減ったのでお勧めする
これは副次的だが、zellij
やtumux
,i3wm
みたいなのを使っているとどうしてもAltやCtrlの一部が優先的に拾われることがある
それで意図しない動きになるときがあるので、修飾キーが多用されないのは個人的には良いと思っている
Unimpaired Mode
vim-unimpairedの機能が元になっている
この中のd/D
のDiagnostic
が非常に良く役立つ
これをとりあえず押してエラーの箇所へ移動するのに使う
欲を言えば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が使えるようになると選択モードのありがたみが増してくる
例えば関数内の変数を置換をしたければ以下のように範囲を決めてできる
-
mif
で関数を選択 -
s
で正規表現を利用し範囲選択 -
c
で確定選択範囲を削除し,インサートモードへ移行 - 単語を入力
-
;
でマルチカーソルを終了
この正規表現というところが味噌になる
これでいわゆる曖昧検索みたいなことを正規表現で実現できる
なので変数名とその変数名のタイポした微妙にずれた変数とか,複数のダブルクォーテーションで囲まれた文字などを簡単に指定することができる
そこにカーソルが挿入されるので,そこからさらにテキストオブジェクトを使って範囲を指定したりすることができるので更に拡張した範囲を編集することができる
私も初めはvim/nvimの矩形選択や単純な置換の方が扱いやすいと思っていた
だが,このマルチカーソル機能を使えるようになってから明らかにこちらの方が使い勝手が良いことに気づけた
もちろん正規表現やテキストオブジェクトを覚える手間はかかるが,その分のリターンを得ることができるようになる
Bad Points
- プラグインがいまだに作れない
理由としては元にしていたwasmのフレームワークが閉じてしまったため、作っていた実装が無駄になってしまったという経緯がある
議論中 議論終了した
schemeみたいな言語に傾いているっぽい?
前に読み間違えてwasmでほぼ確定と書いていたけど間違い
スクリプトMLライクな書きやすさ重視の実装と,Rustベースのパフォーマンス重視の実装を作る予定でどちらもwasmを実行できるようにするらしい
- Omni補完系ができない
私は結構走り書きやmarkdown用のエディタとして使ったりするのだが単語レベルの補完がないと非常につらい
LSPがあればそのワークスペース内のみで補完をすることができるが、その都度何かしら環境が必要になるうえ,変数としてじゃないと補完が効かない
一応PRは作られており、出来上がりつつある
どうしてもLSPのようなものじゃないと大量の文字列があるときに処理コストがかさむので既存のregex系のアプローチだとダメ見たい
テキスト補完用のLSPもできたのでプレーンテキストなどでこのLSPを起動するみたいなアプローチになるのかも
- Pop-upが見づらい
マイナーモードやコマンドモードのヘルプにはボーダーラインがあり見やすい
だが、内容が場所寄って変化する補完のポップアップやエラーメッセージのポップアップにはボーダーラインがつけられない(個人でこれの修正を試験的にやっている人がいて,それを見る限りは背景とボーダーラインがつけられるようになっている)
そのため、その行のコードが長いと同化してどこが切れ目かがわかりにくいなどの問題がある
一応背景はつけられるが文字ごとの背景なので少し見栄えが悪くなってしまう
加えてガターとステータスラインの●の背景にも追加されてしまう
加えて、LSPのメッセージは常に上に表示される
これはエラーなどを見る時に上のメッセージとエラーが出ている行が絶妙に離れているため見にくい
ちなみに白いエラーメッセージの下のa local variable...
もLSPのメッセージである
このように、コードとメッセージが被って見にくかったり、そもそもカーソルが見えなくなったりしてimportを書くときは地獄になる
一応インラインのエラーメッセージなどができつつある
inline-diagnostics
がマージされました
[editor.inline-diagnostics]
cursor-line = "warning"
# other-lines = "disable" # warning"
# prefix-len = 1
# max-wrap = 20
# max-diagnostics = 10
これを追記することで写真のようにinlineで診断が表示されるようになる
Conclusion
個人的にhelixが大きく化けてもはやメインのエディタになりつつある
ただ、所々がまだ使いにくくvscodeやpluginを備えたvim/nvimにはまだ追いつけていない感が否めない
ただ、vim/nvimのライトユーザーはHelixに乗り換えても大丈夫なくらいには機能が豊富になっている
問題点が割と自分の中だとくっきりしているのでこれらが修正される、またはpluginで調節できるようになった段階でVSCodeから移行もありだなあと思っているくらい
vimの操作感に近いコンフィグファイルがあるのでvimmerは一見の余地あり