おもちゃバコ

中身スカスカ♡

「実践Vim 思考のスピードで編集しよう!」を読んだ

こんにちは
最近,夜お家に帰ると室温が40℃でヤバいです。

「実践Vim 思考のスピードで編集しよう!」を読んだ備忘録です。
紙は絶版(?)で高かったので,Kindle版で読みました。


Amazon

Kindleのダークモードで読むと,ハイライトの文字が全く見えなかったので注意ね。

おススメな人

・素のVimを使いこなしたい人。
Vim入門したいけど,取っ掛かりが欲しい人。
 (セキュリティの関係で素のVimを使う必要のある人は多いはず...)
Vimをなんとなく使ってて,本格的に使いこなしたい人。
・hjklでファイル内を移動している人。
 (自分もこの本を読むまではhjklで移動していました...)

プラグインマシマシウェイしたい人はあまりおススメできないかも.

自分のVimレベル

hjklと検索,画面分割など,基本的なことぐらいしかできない.
ちょっと高度なことをやろうとするとすぐ調べる.

この本のおかげでVim初級者に成れた気がする…!

備考

メモの中で出てくるvimプラグインのバージョン。
(自分が勝手に書いてるだけで,本の内容とは関係ないです。)

VSCode

名前: Vim
ID: vscodevim.vim
説明: Vim emulation for Visual Studio Code
バージョン: 1.23.1
パブリッシャー: vscodevim
VS Marketplace リンク: https://marketplace.visualstudio.com/items?itemName=vscodevim.vim


メモ

実質,チートシートになってるかも。
かなり雑メモなので,気になった人は購入してしっかり読んでね。

序文

この本の読み方や考え方について。
レシピ本なので,最初から最後まで読み進める内容では無いよ的なことが書かれてます。
Vimを学ぶ前にタッチタイプは出来るようにしようね。
この本を読むときは,GVimVimどっちを使ってもいいよ。

$ vim -u NONE -N
「-u NONE」フラグは,vimrcを読み込ませないことやプラグインを無効化する。
「-N」フラグは,nocomaptibleオプション(vi互換ではなくvimのデフォルト設定)を適用する。
つまり,バニラvimを立ち上げるってこと。

第1章 Vimのやり方

ドットコマンドは神ということ。

.
ドットコマンド。直前に行った内容を繰り返す。
これをいかに使いこなすかで,タイプ量が変わります(実感しました)。

?
前方検索(/)の後方検索版。

*
カーソル上の単語を検索する。
検索(/や?など)を使用する手間が不要。

cw
カーソル上の単語を削除して,挿入モードへ。

第1部 モード

第2章 ノーマルモード

Vimを初めて使用したときに,多分テンパるだろうモード。
できる限り変更は繰り返し可能なものとする習慣を身に着けると,Vimが報いてくれるぞ!

u
アンドゥ。
単位は「挿入モードからノーマルモードに戻るまでの間に入力した変更」。
アンドゥ単位を意識すると便利。
手が止まるなら挿入モードから抜けるなど,中断セーブ的に扱うといいかもね。

<C-a>
数値の加算を行う。10<C-a>で+10など。 減算は<C-x>。
C言語などと同じで8進数などをVimは認識する(「set nrformats =」で10進数認識)。

dap
d{motion}の一種。pでパラグラフ指定。

g~
大文字小文字の入れ替え。
guとgUだね。

オペレータ待機モード
dwコマンドを使う場合,dとwの間にあるモード。

第3章 挿入モード

いわゆる一般的なエディタとしての機能。
<C-h>などを使いこなせるとモード切替不要かつ,手の移動も少なくできるかもね。

<C-h>
挿入モードで直前の1文字を削除(BackSpaceと同等)。

<C-w>
挿入モードで直前の1単語を削除。

<C-u>
挿入モードで行頭まで削除。

<C-[>
が信念上使えない人用(嘘)。

<C-o>
挿入モードで挿入ノーマルモードに切り替え。
(Visual Studioで<C-k><C-o>を酷使する自分は,キーバインドの悩みどころ。)

zz
画面再描画とカーソル行を中央に移動。

Caps Lockキーの再マッピング
CapsLockをキーに割り当てるべきかの議論。
Emacsでもたびたび上がるよね。

<C-r>{register}
挿入モードでレジスタの内容をペースト。

<C-r>=
挿入モードでExpressionレジスタを呼び出す。
<C-r>=33*4で134が挿入される。

<C-v>{code}
挿入モードで指定文字コードを挿入。
<C-v>u{code}で16進数指定。

ga
カーソル上の文字コードを表示。

<C-k>{char1}{char2}
挿入モードでダイグラフを入力。
<C-k>12で½など。

R
置換モード。と同じ。
gRで仮想置換モード。

第4章 ビジュアルモード

V
行指定。

<C-v>
ブロック指定。

gv
直前のビジュアルモード範囲を再選択。

o
ビジュアルモードで始点と終点をトグル。

第5章 コマンドラインモード

:で始まるモード。

GUICUIのどちらでVimを使うかの議論も書かれてる。
シェルをVimで利用したいならCUI一択。
(ちなみに,サスペンド(Ctrl-z)についても言及されてる。)

:h vi-differences
viとvimは違うものです。間違えないようにしましょう。

:{num1},{num2}p
{num1}行と{num2}行の範囲を表示。

:/{pattern1}/{offset1},/{pattern2}/{offset2}p
{pattern1}と{pattern2}の範囲を表示。
{offset}に+1とか指定できて超便利。

<C-r><C-w>
コマンドモードでカーソル上の単語をコマンドラインプロンプトに挿入。

set history={num}
Exコマンド履歴保持数を変更。

q:
コマンドラインウィンドウ表示。

第2部 ファイル

第6章 複数ファイルの管理

:ls
メモリに読み込まれてる全バッファを表示。
:bnextなどで移動。

<C-w>s
水平分割。<C-w>vで垂直分割。
<C-w>wと<C-h,j,k,l>で画面移動。
<C-c>と<C-o>で閉じる。

:lcd {path}
現在のウィンドウごとに作業ディレクトリを設定。

<C-w>T
タブ移動。

第7章 ファイルのオープンとディスクへの保存

:set path+=**/**
パスを追加する。
:findでファイルを開きたいときによく使う印象。

netrw
Vimのネイティブファイルエクスプローラー。
set nocompatible
filetype plugin on
の記述が必要。

<C-^>
代替ファイルを編集する。
大抵は1つ前に編集してたファイルのはず?

<C-g>
現在のファイル名をエコーする。

第3部 スピードアップ

懺悔: ここを読むまではhjkl移動してました。

第8章 モーションによるファイル内の移動

h,j,k,l
お馴染み。昔のキーボードが発祥の地。
ホームポジションをずらしてまで多用するコマンドではない。
論理行を移動する。表示行はgをつける。

w,b,e,ge
単語移動。

f{char}
文字検索。;と,でがんばれ。
t{char}やF{char}などある。

m{a-z,A-Z}
マークを付ける。`{mark}で移動。

自動マーク
'{', ., ^, [, ], <, >}に読み込まれてる。

%
対応する括弧に移動。
``(ジャンプ前の位置へ移動)を組み合わせると便利。
matchitで機能拡張可能。
set nocompatible
filetype plugin on
runtime macros/ matchit. vim

第9章 ジャンプによるファイル間の移動

<C-i>
進む的な奴。対は<C-o>。

gf
テキスト中のファイルに飛ぶ。イメージはハイパーリンク
:set suffixesadd +=. cpp
サフィックスを指定すること。

m{letter}
小文字でローカル,大文字でグローバルなマーク。
ファイル間移動の際はグローバル。

第4部 レジスタ

懺悔: ここを読むまではクリップボードコピーをOSの機能に頼ってました。

第10章 コピー&ペースト

"{register}
使用するレジスタを指定。
指定しない場合は無名レジスタ("")が使われる。

"0
ヤンクレジスタ。y{motion}専用。

"_
ブラックホールレジスタ
"_d{motion}でコピーすることなく削除。

"+
システムクリップボードレジスタ
普通にコピペしたのをVimに張り付けるときに使用する。
"+pで貼り付け,挿入モードでは<C-r>+。
"+にヤンクすると逆にシステムクリップボードにコピーできる。

"=
Expressionレジスタ。計算に使ったやつ。

<C-r>{register}
挿入モードでレジスタ内容を貼り付け。

:set paste
システムレベルのクリップボードでインデントがおかしいとき使うと気持ち良くなれるやつ。

第11章 マクロ

q{register}
qを押すまでマクロ保存。:reg {register}でレジスタ内容表示。
@{register}でマクロ再生。@@で直前に呼び出されたマクロ再生。

:set visualbell
ビープ音の代わりに可視化表示する。

:normal @{register}
選択範囲に対してマクロを実行(並列)。
ちなみに,VSCodeVimプラグインでは「Command: norm[al] is not yet implemented(PRs are wellcome!)」と表示された(220705, 現在)。

qA
マクロに追記を行う(Aは大文字の{register}と読み替えてね)。
実際は,:put {register}でレジスタ内容を吐出しから編集し,"{register}yでヤンクし直すのが良い(と思う)。

:wall
バッファリストの全ファイルを保存する。

第5部 パターン

第12章 パターンとリテラルのマッチ

:set ignorecase
大文字小文字を無視。
smartcaseで小文字検索で大文字小文字を無視。

\v
/検索でvery magicを使用する。
スラッシュ多すぎ問題(vim標準はmagic検索なので)を回避したい場合に利用する。

\V
/検索でnomagic検索を利用する。
メタ文字回避に使用する。

\v{strings}
/検索で{strings}に完全一致するものだけを対象とする。
theで検索するときに,theとthereなどを区別したい時に利用。
(ちなみに,VSCodeVimプラグインでは使えなかった(220705))

第13章 検索

:set incsearch
インクリメンタルサーチを有効化(まんま)。便利。

<C-r><C-w>
/検索で検索文字を全部入力しなくても補完してくれる。

:%s///gn
:substituteコマンドを呼び出している。マッチ数をカウントするのと同じ。
nでキャンセルしているので置換はされない。

*
カーソル位置の単語を検索。

第14章 置換

:[range]s[ubstitute]/{pattern}/{string}/[flags]
置換コマンドの構文。
特殊文字は:h sub-replace-specialで確認してね。

:set hlsearch
検索結果をハイライトする。

cフラグ
マッチした結果に対して,置換してよいか聞いてくれる。
l回答はこのマッチを置換して終了。a回答はこのマッチとこれ以上の全マッチを置換など。

<C-r>/
置換コマンドで直前の検索レジスタの内容をペーストする。
<C-r>{register}で任意のレジスタ内容を挿入。

%s//\=@0/g
置換フィールドに\=要素でVimスクリプト式を評価。
この場合は@0(ヤンクレジスタ)の内容を返している。複数行ヤンクされている場合に便利。

g&
:%s//~/&と同じ。ファイル全体に対して直前の置換を繰り返すように指示。
置換時に%Sの%を忘れたときなどに便利。

第15章 グローバルコマンド

:[range] global[!] /{pattern}/ [cmd]
指定したパターンにマッチする各行に,Exコマンドを実行する。
:vglobalで逆を行う(:v/abc/dでabc以外を削除)。

第6部 ツール

Unix哲学の根源とか,いろいろ書いてあった。
自分は基本的に流し見ぐらいで,必要そうならまた読み返す感じ。

第16章 ctagsを使ってソースコードのインデックスを作成し、ナビゲーションを行う

ctagsはVimのバージョン6から独立したらしい。
デフォルト機能ではないので,特に自分は触れない。

第17章 quickfixリストを使って,コードのコンパイルとエラー発生箇所への移動を行う

quickfixリストは外部ツールをVimで行う作業に組み込むための機能。
makeコマンドの例で説明されてた。

第18章 grep/vimgrepなどを使ってプロジェクト全体を検索する

:grep
外部プログラムのgrepのラッパー。
プログラマ用のgrepにackとかも紹介されてた。

:vim[ grep][!] /{pattern}/[ g][ j] {file} ...
Vimのネイティブ正規表現エンジン。
*ワイルドカードディレクトリ内の全ファイルにマッチ。
**ワイルドカードは指定ディレクトリまたはそのサブディレクトリにある全ファイルにマッチ。
##もいける。

:grepとの差別点は,Vimの検索コマンドと同じパターンで検索可能なこと。
(:grepを使う場合はPOSIX正規表現に変換する必要があるなど。)

第19章 ダイヤルXを廻せ! 自動補完だ

Vimとは関係ないけど,「cd -」で直前の作業ディレクトリに移動できることを知った。
<C-p>
挿入モードで自動補完起動。<C-n>で汎用キーワードなど。
ポップアップメニュー操作でも<C-p>と<C-n>などは使う。

<C-e>
挿入モードで自動補完時に終了する。

<C-x><C-i>
挿入モードでインクルードされているファイルのキーワード。

<C-x><C-k>
挿入モードで辞書のルックアップ。
Vimに単語リストを与える必要がある(:set spell)。

<C-x><C-l>
挿入モードで行単位の自動補完。

<C-x><C-o>
挿入モードでオムニ補完。

第20章 Vimのスペルチェッカを使ってタイプミスを発見,修正する

スペルチェッカがあることを知らなかった...

:set spell
スペルチェッカ起動。
デフォルトでは英単語辞書に対してスペルチェック。
移動は]sや[sなど。

:set spelllang
スペルチェッカの変更。
:set spelllang=en_usでアメリカ綴りだけをチェック。
自分のシステムに入っていないスペルファイルを有効にしようとすると,インストーラーが起動する。
(set nocompatible
filetype plugin onを忘れずに。)

第21章 それからどうする

実践を続けよう!
:x
:wqみたいなもん。ファイルに変更があった時だけ保存する。


感想

自分はVimを使いこなせていないことが理解できる良書でした。
エディタ操作は作業速度に直結するので,Vimの理解度が自分と同等の人は読んでおいて損はしないはず。

この本を読むまでは,テキストファイルの修正などはVSCode(+Vimプラグイン)で行ってましたが,結構対応していないコマンドが多かったので素vimに戻ろうかな~と考えています。
Vimプラグインも便利だけど,シェル+素vimの方が使いやすいかも。

あとは,お仕事ではVisual Studio(+Vimプラグイン)を使用しているので,キーバインドをどうするかを検討しなければ。