Rust製のエディタHelixを軽く紹介

気になっていたエディタがいつの間にやらwindowsでも使えるようになっていたので紹介する

個人的には[zellij](https://github.com/zellij-org/zellij)も早くwindowsで使えれば良いなあと思っている

参考資料: [GitHub](https://github.com/helix-editor/helix)(Issues, Discussions, Wiki), [Documentations](https://docs.helix-editor.com/title-page.html), [Website](https://helix-editor.com/)

```
💡 更新(2024/01/23) version23.10
💡 注意点(2022/04/29) version22.03
まだHelixは鋭意開発中なので変更が多くあります
ここに書いていることが上手く機能しないことがあります
```

## Summary

![スクリーンショット 2024-01-22 223455.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630694/12a4e5e3-2461-0389-0873-7061a4cb0d42.png)

Rust製の標準機能が豊富な軽く速いテキストエディタ

~~ターミナルと(一応)GUIの両方がある~~だいぶ先になる

[kakoune](https://kakoune.org/)(コクーン)/[neovim](https://neovim.io/)の二つから影響を受けている

特に開発者がkakouneの強い影響を受けている

キーマップやポップアップがわかりやすい特徴として挙げられる

操作している感じは[ウェブサイトの動画](https://helix-editor.com/)が分かりやすい

多くの言語でLSPによる補完や[tree-sitter](https://tree-sitter.github.io/tree-sitter/)によるシンタックスハイライトなどサポートしている

プラグイン用のAPIなどまだ実装段階で,プラグイン自体がない

独特な操作感で好みが分かれる

vimに慣れていればいるほど使いにくいかもしれない

個人的な感想としては,vim/neovimの代用にはならない

ただし,軽量で高速,取り出してすぐ使えるので一瞬だけターミナルで起動するときにはこれで十分な感じになる

Q.「ならvim/neovimで良くない?」

A.「その通りです」

## What Is This?

> A post-modern text editor.
> A kakoune / neovim inspired editor, written in Rust.
The editing model is very heavily based on kakoune; during development I found myself agreeing with most of kakoune's design decisions.


kakoune(コクーン)とneovimに影響を受けたRustで書かれたテキストエディタ

- vimみたいなモードがあるエディタ
- 複数のカーソル選択編集機能
- 組み込みでLSPサポート
- 複数言語のシンタックスハイライトやテキストオブジェクトサポート

## How to Install

Windowsなら[releases](https://github.com/helix-editor/helix/releases)ページからダウンロードする

次に解凍した中にあるruntimeをhelixのフォルダにコピーする

```shell
xcopy runtime %AppData%/helix/runtime
```

MacOSならhomebrewで簡単にインストールできる

```shell
brew install helix
```

その他は[GitHub](https://github.com/helix-editor/helix#installation)や[ドキュメント](https://docs.helix-editor.com/install.html)を参照する

きちんとインストールできたかどうかは`hx -V`や`hx -h`で確認できる

また，`hx —health (lang_name)`で利用できるLSPなどのリストが表示される

```shell
> hx --health rust
Configured language server: rust-analyzer
Binary for language server: ..\rust-analyzer.EXE
Configured debug adapter: lldb-vscode
Binary for debug adapter: Not found in $PATH
Highlight queries: Found
Textobject queries: Found
Indent queries: Found
```

基本的には他のエディタと同じ

```shell
hx file_name # ファイルを開く
hx file01 file02 # 複数ファイルを開く
hx dir_name # ディレクトリを直接開く
hx . # 現在いるディレクトリを開く
```

## Settings

設定はhelixを起動後、`:config-open`で設定ファイルを開ける

![config.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630694/34e1c825-123c-6d5b-ae0a-f667ef91e475.gif)

helixを起動した状態で`:`を押すとコマンドモードになる

このモードでは利用できるコマンドの一覧が表示される

コマンドモードではtabで次へ，shift+tabで前へ移動できる(上に説明が書いてあるのは地味にうれしい)

`:config-reload`で設定ファイルをリロードできる

`:theme theme_name`でテーマを試せる(私のテーマは[Onedark](https://github.com/helix-editor/helix/wiki/Themes#onedark))

[Wiki Themes](https://github.com/helix-editor/helix/wiki/Themes)でも探せる

とりあえずは以下内容をconfig.tomlで保存して，これを`~/.config/helix/`か`~/AppData/Roaming/helix/`に配置するだけで良い

```toml
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で前のバッファーへ移動
```

#### 設定ファイルのコメントを消す場合

1. %
    - 全選択
1. s
    - 正規表現で選択した場所にマッチングをかける
1. \# \S+
    - #から空白文字(今回は改行)以外を1以上繰り返し
1. enter
    - 正規表現の確定
    - helixの場合だと選択箇所内で正規表現がマッチングするところ全てにカーソルが現れる
1. d
    - 選択箇所の文字を削除
1. ,
    - マルチカーソルをメインのカーソル(プライマリカーソル)に戻す

正規表現はもっとあると思う、単純に`#.+$`とか

![レコーディング-2024-04-12-001107.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630694/4104a45f-05f9-4325-49ab-c044e299e797.gif)

---

他にも`hx —health`にあるようにLSPやtree-sitterの設定もできる

デフォルトではシンタックスハイライトのみでLSPは個人で設定する

GitHubにある`languages.toml`の中から必要な言語をコピーして貼り付けるだけで良い

もちろん[LSPなどの設定](https://github.com/helix-editor/helix/wiki/How-to-install-the-default-language-servers)は自分で行う必要がある

そもそも,まだLSPなどが実装されてなけれは使えないのでそこは注意する

これも`~/.config/helix/`か`~/AppData/Roaming/helix/`に配置するだけで良い

```toml
[[language]]
name = "rust"
scope = "source.rust"
injection-regex = "rust"
file-types = ["rs"]
roots = ["Cargo.toml", "Cargo.lock"]
auto-format = true
comment-token = "//"
language-server = { command = "rust-analyzer" }
indent = { tab-width = 4, unit = "    " }

[[grammar]]
name = "rust"
source = { git = "https://github.com/tree-sitter/tree-sitter-rust", rev = "a360da0a29a19c281d08295a35ecd0544d2da211" }
```

現在進行形で未対応のLSPやtree-sitterのissueは上がっているのでmasterを追跡すれば使えるようになっている可能性もある

## Favorite Points for Me

+ デフォルト機能が多く、取り出してすぐ利用できる

    + config.tomlの場所も自動で作成されるし、エディタ自体の機能も非常に多く使いやすい
    + 特にUI系やLSP系が組込みで入っている点がターミナルエディタとしては破格な気がする

+ マイナーモードと選択モードの組み合わせが面白い

    + 今回は紹介できていない
    + 同時押しではなくモード単位で連続押していく感じ
    + コメントを消す処理みたいに、選択モード、正規表現モード、変更モード、ノーマルモードで押していく

+ キーコンボに一貫性がある(議論の余地あり）

    + Shiftキーで反転とエンハンス系
        + u(アンドゥ), U(リドゥ)のような反転系
        + r(文字リプレイス), R(ヤンク文字でリプレイス)のようなエンハンス系
    + Ctrlでエディタの操作
        + 画面移動
        + 入力補完
    + 直感的ではないところもある
        + 見かけていたのが`Alt + ;`(アンカーとカーソル位置を入れ替える)
        + Shiftでキーが変わるところがAltになっていることが多い

+ kakouneは使ったことがないので良い判断材料にはならないがキーマップが覚えやすい(人による)

    + これは個人的には非常に良く、VSCodeでもスペースモードや移動モードなどのキーバインドは移植した
    + VSCodeだと押しにくいFキーなどを辞められる

+ キー操作で情報がポップアップするので初心者にやさしい

    + 覚えるの楽
    + 打ち間違ったときに今どの状態になったのかがすぐわかる

+ vim/neovimの経験がある人は割と楽に操作できる

    + 基本の操作はNormalモードInsertモード、Commandモードを踏襲しているので
    + 選択(select)モードと編集(change)モードあたりから慣れないはず

+ vim/neovimなどの代替ではなく補助的利用なら問題は少ない
    + 個人的にVSCodehHelixを併用している
    + vim/neovimのplugin管理に困っているなら一考と移行の余地あり

+ エディタが育つのを眺めるのが面白い
    + 使い勝手が悪いところはDiscussionしたりIssueを上げるのも良いかもしれない
    + 難しいが自分で実装してみるとか(個人で日本語対応もどきは実装できた)
    + Inline診断メッセージやジャンプラベル機能は個人的には凄いなあと思った

## Bad Points

+ プラグインまだ作れない
~~プラグイン用のAPIなど[実装予定](https://github.com/helix-editor/helix/pull/455)はあるが当分はない~~

+ キーマップが一部で冗長
    + これらはまだ議論中で再度変更が行われる可能性がある
    + インサートモードの矢印キーの移動が消されて，それがrevertされたりした
    + ディスカッションなどを見るのが楽しい
    + ~~configでマッピングをしてもまだ意図した挙動になりにくい~~
        + ~~これもmasterを追っていたら部分的にはできるようになっていたりする~~
        + 恐らくもう大丈夫

+ ~~マクロや.(ドット)の挙動が気に入らない~~
    + ~~試験的であったり，そもそも機能が違うのでなれるしかない~~
    + 修正された

+ エラーメッセージが読みにくいのとコードとかぶる

    + [インラインの診断メッセージ](https://github.com/helix-editor/helix/pull/6417)ができた

![227398597-3201a925-7241-463f-b6ea-22851386eb9d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630694/b670020c-4936-d5b0-98f6-88c5425706ec.png)

以下を追加する

```toml
[editor.inline-diagnostics]
cursor-line = "hint"
```

## Conclusion

エディタ自体は基礎が既に出来上がっているので補助的に使う分には申し分ない

まだかゆいところに届きそうで届かないもどかしさがある

多くの人にはまだneovim/vimの代用には~~ならない~~なりそうになってきた

楽しむ分にはちょうど良いかもしれない

:vulcan:[モード操作編](https://qiita.com/GreasySlug/items/8a2c58e39ab345660722)

:vulcan: [第二弾](https://qiita.com/GreasySlug/items/11b7548848119adb6967)