はじめに

よく忘れるのでメモ。

私の環境はastronvimなので、これについても書く。

レジスタを見る

コマンド 内容
:registers(:reg) レジスタの一覧を見る
:echo @a 特定のレジスタの値を見る

registers の読み方

"<register名>: レジスタ名

ダブルクォートのあとにレジスタ名がある。

Type Name Content
c "" aaa
l "0 bbb^J

Typeの意味

Type 意味
c 文字(Character)
l 行(Line)
b ブロック(Block)

レジスタの値に含まれる、^Jは何?

改行。行単位でレジスタに入っている場合、基本的に含まれる。

nvimでは、\n^Jで表現されるらしい。 また、astronvimにおいては、"を押すとregisters一覧が見られる。

このときには、改行文字は消されて表示される。

レジスタの名前ごとの役割

レジスタは名前と役割が対応している。下記に示す。

レジスタ一覧

レジスタ 役割 説明
" (無名レジスタ) デフォルト yank (y), delete (d), change (c) の操作で自動的に使用される
0 最新のヤンク 直近の yank (y) でコピーされたテキスト
19 削除履歴 delete (d), change (c) で削除されたテキストが保存される (1 が最新)
az 名前付き マクロ用。"ay"ap のように指定して使用可能。追記 ("A など大文字) も可能
* クリップボード (X11) X11 の PRIMARY クリップボード (選択テキスト)
+ クリップボード X11 の CLIPBOARD または Windows/macOS のシステムクリップボード
- 小レジスタ 短い削除テキストを保存 (行をまたがない削除・変更)
. 最後に挿入したテキスト 直前の i/a/o で挿入したテキスト
% 現在のファイル名 カレントバッファのファイル名を取得
: コマンド履歴 直近の Ex コマンド (: で実行したコマンド)
# 代替ファイル名 CTRL-^ で切り替えられる直前のバッファのファイル名
= 式レジスタ "=3+4 のように入力して計算結果を取得
_ ブラックホール /dev/null のようなもの。ここに保存するとテキストが完全に破棄される

実験で気づいたこと

  • [!などの存在しないレジスタ名をペーストすると、無名レジスタの値が利用される
  • 一方、#レジスタの値がないときに#レジスタの値をペーストしようとするとエラーが出る
  • ddccで行削除した値は、ちゃんと1-9のレジスタにLILOで、入っていくのに、sdiwciwなどだと無名レジスタや-レジスタに入るだけ、履歴は保存されない。
  • Type=cのレジスタは、値の途中に^Jが入ることがない。
  • Type=bのレジスタは、値の途中に^Jが入る場合はあるが、最後に入ることはない。
  • :putおよびインサートモードの<Ctrl>-rの場合、珍しくレジスタを指定する際に"をつける必要がない。
  • +にWindows/macOSとあるが、Ubuntuでも同様に動作した。
  • 自分のUbuntu環境の場合、基本的に*は空であった。
  • d$で消した場合は、Type=cでレジスタに保存される(最後の改行は消されないし、レジスタに保存もされない)。
  • ビジュアルブロックモードで削除した場合、blockとして削除履歴に保存される。

式レジスタ(=)の使い方

"= を押して式レジスタに設定したい値を入力。エンターで決定。

:put = で式レジスタの値を貼り付け。

実験して気づいたこと

通常の変数を代入するときにも計算できるので、好みによるが下記でもそこまで問題ない。

:let a=3+3
:put a

normal Exコマンドとは

Exコマンドから、ノーマルコマンド(ノーマルモードのキーストロークのこと)を実行するExコマンド。

normal! の場合、ユーザが設定したキーバインドを無視する。

実験

  • normal! AHoge で、行末にHogeと入力されたあとに、ノーマルモードに戻った。ノーマルモードにデフォルトで戻るらしい。
  • %normal I// で、全行の先頭に// を入れられる。

コマンドの種類

大きくは2つ。MECEに分けるのが難しい。

Exコマンド

  • :s, :put などの、:から始まるもの。
  • これを実行するモードをコマンドラインモードという(Exコマンドモードなら分かりやすったのに…)。
  • Exコマンドの履歴は、q:で閲覧および編集、実行できる。抜けるのには、:q(Escで抜けたくなるが、編集できるモードなのでEscで抜けるの無理)。
  • 個人的にExコマンドらしくないExコマンド: :q, :let, :set, :w

ノーマルコマンド

  • ddxなどの、ノーマルモードで打てるコマンド。
  • aOなどの、インサートモードに入るコマンド。

マクロの編集

  • :put @a"apしてaレジスタを出力して編集(この場合の@はローカル変数aではなく、aレジスタであることを表す。)。
  • let @a='xx' のように、直接代入(なおこのとき、Escを入力するには一般にシェルで制御文字を打つときと同様にのあとにエスケープキーを押す)。
  • この記事執筆において多用したマクロ。これによりビジュアルモードで選択した範囲をバッククォートで囲える。: let @s="s``\[ESC]P"

実験して気づいたこと

qaなどで開始した後、終了する際にインサートモードの場合は、マクロの中でノーマルモードに戻らないと、qを押してもマクロ録画を終了できない。

制御文字の入力方法

  • <Ctrl-v>の後に、制御文字を打つ。 例: <Ctrl-v> エンターで、^M
  • <Ctrl-v>の後に、ASCIIコードを10進数で打つ。 例: <Ctrl-v> 27 で、^] が出る(10ではうまく動かなかった)

実験して気づいたこと

ビジュアルブロックモードでは、必ず長方形の操作になるので、コピーしたときに改行より後ろのところもたくさんコピーされがち。

ビジュアルモード3つ

  • ビジュアルモード
  • ビジュアルラインモード
  • ビジュアルブロックモード

実験して気づいたこと

  • ビジュアルラインモードにおいて、選択した後にA3を押して、行の最後に3を入れることはできない。
  • ビジュアルラインモードもビジュアルブロックモードも、:を押したら、行範囲で同じになる。
  • ビジュアルラインモードでも、ビジュアルブロックモードでも、:normal A3(つまり、行範囲Exコマンド)をすればできる
  • ビジュアルラインモードにおいては、カーソルは最後の位置にある(なので、A3は動かない。)
  • ビジュアルブロックモードにおいては、カーソルは各行の先頭にある(なので、a3で左から2番目に3を打てる)

astronvim

rubyファイルを開いている状態で下記を打つと、rubyのLSPを選択してダウンロード&インストールできる。

:LspInstall

このとき、ruby-lspを選択したところ、rubyがopensslと一緒にビルドされていないのでビルドし直してください、と出た。

どうやら、ruby-lsp gemの中でOpenSSLを利用するらしい。

利用しているrubyは、下記Exコマンドで確認できる。

:echo exepath('ruby')

これを見ると、PATH環境変数から探しているようだった(nvimが独自にrubyをインストールしてくるわけではない)。

コメント

astronvimでコメントするには、gcを使う。

例:

コマンド 内容
gcc 行をコメントトグル
V j j gc 下3行をコメントトグル

実験して気づいたこと

V<ctrl-v>で行範囲選択した後に、normal Exコマンドでgcを適用しようとしてもできない。

どうやら、Comment.nvimプラグインのコマンドのためらしい。 (normal! でないから、動作するものでもないのか。。)

astronvimで最近よく使うコマンド

コマンド 内容
Space + f f ファイルを検索
<C-\><C-n> ターミナルにいるときフォーカスを外す