LoginSignup
8
5

More than 1 year has passed since last update.

Helix Editorのモードと基本操作

Last updated at Posted at 2022-05-27

より網羅的な説明は:point_right:DocumentのKeymapを参照すること

前半は説明と感想が主でキー操作は後半に行う

Summary

Mode default key 個人的な感想
Normal Esc 移動系はvim/neovimとそこまで変わらないが,選択や編集が加わるとややこしさがアップ
Insert i, a, A, I, etc... selectに慣れるまではここもおぼつかないが,基本はvim/neovimと同じ
Select v, w, e, b, %, etc... vim/neovimと一番違う操作及びモード.慣れれば逆に使いかも
Space space メタ的な操作が豊富で非常に便利.とりあえずspace+fでfzfを覚えれば良い
Match m テキスオブジェクトを使った操作全般はこれを使えば良く他のモードと組み合わせたり応用が利く
Goto g カーソル行移動,列移動などでよく使う.このモードからの移動に慣れると速い操作ができる
View z 画面位置を軽く調整する場合に利用できるがCtrl-fなどのデフォルトのキーマップの方が楽
Sticky View Z コードを眺めるときにとりあえず起動すれば画面移動が楽になる
Window Ctrl-w
space+w
そこまで多用しないが,ウィンドウ操作がまとまっていてわかりやすい
Command : vimと同様に保存からレジスタからスクリプトの実行など便利な機能が豊富.私はまだ使いこなせていない

select mode/selectに慣れれば基本操作はvim/neovimと変わらない感じ

selectに加えてマイナーモードと機能を合わせることでより編集や操作が拡張される

逆に言えばこれらモードと機能の使い勝手が自分に合わなければvim/neovimで良いと思う

実際にディスカッションなどでvimのキーマッピングの仕方を尋ねている人がいたが,コントリビュータの方が「それだとhelixの思想と合っていないならおすすめしない(意訳)」ときちんと説明している

Basic Mode

  • ノーマルモード(Normal mode)
  • 挿入モード(Insert mode)
  • 選択モード(Select/Extend mode)

大きく違うのがこのselect/extend mode(以下選択モードまたは選択)になる

この選択がHelixではとても重要であるためManipulationの箇所で詳しく説明する

ノーマルモード(Noraml Mode)

デフォルトでノーマルモードのカーソル位置が一つの選択状態になっている

移動系全般は基本的には似た動作になる

違う移動系操作で分かりやすいのはwftになる

wは単語の先頭に移動だが,vim/neovimとは違い単語の一文字目ではなくその単語の直前にカーソルが移動する(eは同じ)

マルチバイト文字の上でシングルバイト文字を一文字移動すると文字が重なるという問題もある

これはLinuxとか触ったことがある人ならわかると思うが,ターミナルなどで割とよくあることだと思うので気にせずに使うかそもそも日本語を使わなければ問題は少ない

windows terminal上ではこれら重なりは発生しないが,他のalacrittyなどでは発生する

w_e_move.gif

また,昔のvimよろしく日本語文におけるweなどの移動はスペース以外が全て一単語として扱われる

一応個人的に関数を作って対応したが,あまり使わない(執筆予定)

japanese_w_e_move.gif

ftはその行だけに限らず一文字を発見するまでとなり,繰り返し検索はAlt+.で押しにくかったりする

f_t_find.gif

その他にもヤンクy/Yとペーストp/Pはレジスタを利用し,システムクリップボードを利用する場合は space+y/Yspace+p/Pになっていたりする

挿入モード(Insert Mode)

ノーマルモード・選択モードから挿入モードへの操作がvim/neovimと違う

一行目がwを押した後にi*3,a*3を押した場合,二行目がeを押した後にi*3,a*3を押した場合となる

select_i_a.gif

この操作に同意できるかどうかが,helixを使っていくかvim/neovimに戻るかの違いだと思う

個人的にはここの行末にある単語でwを押した後にaで単語の後ろに追加で,次の行の冒頭に来るのが一番helixで嫌なところになる

こうなる理由は改行も一文字扱いだからである

そのため,wによる「次の単語の前に移動」により\nまで移動してaで「後ろに挿入」だと,どうしても改行後の行頭に挿入することになってしまう

[]が選択箇所を示す
iii[一行目\n]aaa二行目\n // w: 次の単語の前は"\n"
一行目\niii[二行目]aaa\n // e: 現在の文字の最後は"目"

Ctrl+p,Ctrl+nでラインの移動になるのがなんか独特に感じる

補完はLSPが無いと行われず,オムニ補完などは今のところはない

インサート内でのペーストはCtrl+rだが,この時にレジスタが表示されるのでこれも初心者的には良いと思う

vim/neovimとは異なり,helixではデフォルトでレジスタには"しか保存されない

順次レジスタに保持されていかないので明示的に任意のレジスタに保存する必要がある

register.png

これ以外のキーマッピング関してはvim/neovimでも使いこなせないので多分問題ないと思う

Minor Mode

基本的にはvim/neovimでまとまっていないキーバインドや,プラグインを入れてそれぞれのユーザーが独自に設定していたようなキーバインドをわかりやすくモードとして統合したもの

これらが個人的にはHelix-Editorの中で非常に気に入っている機能・モードになる

特に初心者にはありがたいポップアップなど豊富な機能が含まれている

  • space: スペースモード(space mode)
  • v : 選択モード(select mode)
  • m: マッチモード(match mode)
  • g: 移動モード(goto mode)
  • z: 視点モード(view mode)
  • Z: 固定視点モード(sticky view mode)
  • :: コマンドモード(command mode)
  • C-w: 画面モード(window mode)

スペースモード(Space Mode): space

picker.gif

様々な機能がとりあえず放り込まれたメタ的なモードになる

主な用途としてはピッカー(Picker)操作となる

いわゆるfuzzy finderにあたる機能になる

この中にあるf, Ffile pikcerbbuffer picker をよく利用する

ディレクトリ内のファイルの検索やバッファーの検索などをすることができる

他にもシンボル検索(関数やクラスなど)やgrepにあたるglobal searchも存在し,これもピッカーが起動するので操作しやすい

ピッカーではないが,Debug機能もある

エディタ内でインデックスの番号辺りをクリックするとブレークポイントを設置でき,dからDebugerを起動することができる

まだ,この機能自体にバグが多く試験中である

?でVSCodeなどにもあるコマンドパレットも開くともできる

これを利用して独自の関数を作って動作確認したり簡単にできる

最近エクスプローラーもPRがあがっており将来的にはファイル操作もこのピッカーでできるようになるかもしれない

マッチモード(Match Mode): m

編集するときに非常に役立つモード

'"に地味に変わっている

match.gif

単語の選択から関数の選択まで一気にできる

tree-sitterがある言語なら他にもクラスやコメント,パラメータなどにも対応できる

matching.png

vim surroundやtext objectsなどをここで上手く扱うことができる

操作中は右下にポップアップが表示されるでそれを見ながら編集ができる

キー入力自体はvim/neovimよりも多くなってしまう

例えば,text objectsを使った操作は全般的にvim/neovimよりキー操作が増える

キー 前半 後半
miwms” miw
単語を選択
ms”
選択箇所の周りに”を追加
maWms{ maW
記号と周りの空白を含めた単語を選択
ms{
選択箇所の周りに{を追加
mr”’ mr”’
選択箇所の周りにある”を’に置換
md( md(
選択箇所の周りにある(を削除

前半のtext objectsを利用したvim surround系の操作がどうしても二回マッチモードを行い処理を行う必要がある

周りにある記号系を削除・変更する場合は選択されていなければ一番近い箇所が自動で選ばれる

そのため明示的に記号を選んで編集したいときは先述のmiやmaを使ったテキストオブジェクトの操作が必須になる

とりあえずは選択と変更をこのモードを経由して慣れれば編集がはかどるようになる

固定視点モード(Sticky View Mode): Z

選択状態などを維持しつつコードを眺められるモード

地味にこれがあるおかげでコードを眺めるのがはかどる

視点モード(view mode)は視点移動するとポップアップが消えてノーマルモードへ変わる

このモードを使えば右下にポップアップを固定表示したまま連続で視点移動をすることができる

このモードを経由しなくてもノーマルモードでCtrl-fやCtrl-dなどの視点移動系は全て扱える

そこまで重要な気がしなくもないが,初心者にとってポップアップが表示されて忘れやすい画面移動系のキー操作を見れるのは嬉しいと思う


他にもコマンドモードや移動モードなどよく使うモードがあるが長くなるので省略する

これらマイナーモードはマッピングを追加したり,違うマッピングすることができる

他にもポップアップ表示される独自のマッピングも作れる

例えば

[keys.normal]
# {}でマッピングを追加すると,これがポップアップとして表示される
"space" = { w = ":write", q = ":quit" } # "wで保存",”qで終了”がスペースモードに追加される
# 複数のコマンドを一気に実行したい場合は[]で囲む
"C-h" = ["select_all", "regex"] # "Ctrl+h"でファイル内を全て選択し置換できるようになる

再マッピングに関して

キーマップを変えたければキーではなく,コマンドをマッピングする

再帰マッピングができないのでそこは注意する

また,同時押しのキーマッピングはAlt,Ctrl,Shiftだけ

" vim/neovim
inoremap jj <Esc> " キーを再マップしている
nnoremap j gj     " helixではこのようなマッピングはできない
# helix
[keys.insert]
j = { j = "Normal" } # コマンドをキーにマッピング
C-c = "esc" # このようなマッピングはできない
n-z-z = ["search_next", "align_view_middle"] # これもできないので{}で入子にする
n = { z = { z = ["search_next", "align_view_middle"] } } # 適当マッピング
[keys.normal]
space = { w = [":write", ":format"] } # 組み込みコマンドはコロンが必要

Manipulation

helixを扱う上で大事なのは選択操作

これを使えないとまともに操作して編集ができない

vimmerが初見で絶対に慣れない操作は以下の通り

  • 常に選択箇所がハイライト表示(選択箇所の縮小は;)
  • ビジュアルモードとノーマルモードがセットになった操作感
  • xが行選択
  • sが正規表現のマッチング
  • Ctrl+vがなくShift+cのマルチカーソルの追加
  • dが選択箇所を削除
  • ddではなくxd
  • yyではなくxy
  • 選択状態からインサートモードへの移行
  • 改行が一文字扱い

初見でこれらが非常にうざく感じるが,慣れれば案外使いやすい

改行はいろいろ紆余曲折あって今の状態になっているので仕方がない,慣れるしかない

操作基礎

kakouneのサイトに違いが書かれてあるのでそれも参考になる

c,d,yの御三家はよく使うオペレータだと思うのでこれを例にする

vim/neovim helix
ciw, diW, yiw miwc, miWd, miwy
caw, daW, yaw mawc, maWd, mawy
ci", di{, yi’ mi"c, mi{d, mi’y
ca", da{, ya’ ma"c, ,ma{d, ma{y
cs"', ds( miwmr"', miWmd(
C, D, y$ vglc, vgld, vgly
dd, yy xd, xy
Vjd, Vjc, Vjy xxd, xxc, xxy
ggVGd %d

特徴として挙げられるのはこれら

  • 日本語っぽい文法(目的語 述語)
  • マッチモードmを用いたテキストオブジェクトの選択
  • 移動モードgを用いた列の選択
  • xによる行選択
  • %による全体選択

一番特徴的なのは日本語っぽい文法だと個人的には思う

日本語の「関数を選択してヤンク」,「行を選択してして削除」がそのままキーストロークとして実現できる

ただ,vim/neovimよりもストロークが多いのが難点であり,これがよく議論として出される

個人的にCDvglcvgldなのはいただけない

gは今回説明していいない移動モードとなっており,glで行末まで移動となっている

また,全体を選択するときには%となっており全体を選択がやりすいが,覚えにくいとは思う

それ以外はmから始まっており,一貫したキーストロークで覚えやすい

ちなみに単語だけを選択したければmiwmiWよりもebEBの方が楽に選択できる

単語の頭にいればeだけで単語全体が選択状態になるのでそのままdで削除できる

このようにテキストオブジェクト内にいる時と,外にいる時で操作が微妙に異なる

関数やクラス内にいてこれらを選択する場合はmif/cで関数内から関数全体を選択できる

関数やクラスの外側近くにおりこれらを選択する場合は,今回説明していないunipaired([])を使ったパラグラフ移動や関数移動(v]p)などで選択できる

移動

大文字は記号を含む

また,()に書かれているコマンド名は大文字のものになる

キー 説明 コマンド
h, Left 左へ move_char_left
j, Down 下へ move_line_down
k, Up 上へ move_line_up
l, Right 右へ move_char_right
w, W 次の単語の先頭へ move_next(_long)_word_start
e, E 次の単語の最後へ move_next(_long)_word_end
b, B 前の単語の先頭へ move_prev(_long)_word_start

これらはvim/neovimと同じようなカーソル移動をする

しかし,これらを操作したときのエディタの挙動が異なる

見た目の違いとしても現れるのが選択である

vim/neovimのビジュアルモードにあたるが,より拡張的に扱える

ちなみにデフォルトでカーソル位置が一つの選択状態になっている

これら移動操作に選択が組み込まれている

そのためw,Wなどは「次の単語の先頭へ移動」+「次の単語の先頭まで選択」の2つの意味を持つようになる

同様にfも「一文字を検索」+「一文字目までを選択」の2つの意味を持つようになる

キー 説明 コマンド
f カーソル以降で一文字を検索 find_next_char
t カーソル以降で一文字をまで検索 find_till_char
F カーソル以前で一文字検索 find_prev_char
T カーソル以前で一文字見までを検索 till_prev_char
Alt-. 検索actionの繰り返し repeat_last_motion

先ほど説明した通り今いる箇所から見つけた箇所までを選択する

そのためiで選択箇所の前,aで選択箇所の後ろに挿入なので注意して使わないと検索したときにいたカーソル位置に誤って挿入してしまったりする

f_t_find.gif

ただ,Rustなどでメソッドチェーンを書いている最後でcollect();する前に何かしら書きたいときはf;でセミコロンまで移動すればすぐに追加できる

f_search.gif

変更

キー 説明 コマンド
a 選択箇所の後ろに挿入 append_mode
i 選択箇所の前に挿入 insert_mode
A, end 行末に挿入 append_to_line
I, home 行頭に挿入 prepend_to_line
~ 大文字小文字切り替え switch_case
u アンドゥ undo
U リドゥ redo
r 一文字で置換 replace
R ヤンクした文章で置換 replace_with_yanked
d 選択箇所を削除 delete_selection
. 最後の変更を繰り返す N/A
“<reg>Q 選んだレジスタにマクロの記録を開始/停止(デフォルトで") record_macro
“<reg>q 選んだレジスタから記録されたマクロを実行(デフォルトで") replay_macro

ここで重要なのはa,i,dなどが選択箇所からの操作であるという点である

先ほどの移動操作で説明した通りカーソルはデフォルトで一つを選択している状態である

そのため,dを押すとvim/neovimでxを押した操作と同じになる

w, e, bなども移動+選択が組み合わせられている

選択箇所のi(始め)かa (後ろ)かを明確にキー操作で選択する必要性が出てくる

また,ドットとマクロは注意が必要になる

繰り返しは恐らく意図したような繰り返しにはならないし,マクロも記録されたマクロが正しく動きそうで動かない(仕方がない)

ただ,マクロがqではなくQなのは初心者的には嬉しい

qを誤って押して勝手に記録が開始されて焦るみたいなのが減る

qで実行するのも@よりもわかりやすいと思う

Issueとして挙がっているが,Q:記録q:再生を記録できるせいでマクロが無限にスタックされるバグがあるので注意する修正されました

また,挿入モードで説明した通りでレジスタが表示されるのは良いなあと思う

vimでレジスタを上手に扱うのは初心者にはなかなかに難しい

だが,とりあえずを押してレジスタを確認し,ペーストしたりヤンクする場所を決めたりできるので重宝する

選択

選択するだけではなく,選択後にもできる操作が複数ある

キー 説明 コマンド
v 選択モードへ移行 select_mode
s 選択箇所内で正規表現に一致する箇所を全て選択 select_regex
x 行を選択 extend_line
; 選択範囲を一つに縮小 collapse_selections
Alt-; 選択箇所のカーソル位置とアンカー(初期位置)を反転 flip_selections
, プライマリーキーだけ残す keep_primary_selection
% ファイル全体を選択 select_all
Ctrl-c 選択箇所をコメント化・コメント解除 toggle_comments

とりあえずはここに書いているのは覚えておいた方が良い

移動系の操作で広く選択してしまったときはとりあえず;を押すことでカーソル位置だけが選択された状態に戻る

fなどを使ったときにはこれをよく使う

選択操作は非常に強力で,よくこれが矩形選択と比較に出される

矩形選択では複数個所をIを利用しコメントアウトしたり,eWなどで上手く移動して複数個所を編集するなどをする

もう一つ:%s///gで検索した箇所を置換するという操作も良くすると思う

それらをhelixではマルチカーソルと正規表現などで丸ごと処理するようにしている

え,正規表現が難しい?ならハンターになるんだ

select.gif

Conclusion

モードによる機能が豊富で面白く,使いやすい

選択が肝になる操作になる

移動と選択が一緒なので注意が必要である

選択は他のモードと組み合わせることで更に強力になる

8
5
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
8
5