馬鹿の一つ覚え: Vim

# 設定

#### 初期設定
設定ファイル `$HOME/.vimrc` を利用できるように `sudo dnf -y vim-enhanced` などにより vim-common や vim-enhanced をインストールしておく。
初期設定のための `set` や `map` などは `$HOME/.vimrc` に書き込んでおく。
コメントは `"` で。
環境変数 VIMINIT を設定していると `$HOME/.vimrc` が無視されるので注意。

#### キーマッピングに使える文字
個人的には大文字の `Z` `X` `C` `B` キーはコマンドとしての使用頻度が低いので、キーマッピングの割り当てに使用可能。

#### 設定状況の確認
設定状況を確認するには `:set` とする。

#### 行番号の表示
行番号を表示するには `:set nu` (number) とする。消すには `:set nonu` (nohumber) とする。

#### OSのペースト機能を利用
Vimのヤンクではなく、OSのペースト機能を使った時に自動的なインデントでテキストが崩れるような場合は `:set paste` とする。

#### 日本語の文字化けを修正
日本語が文字化けしている場合 `:set enc?` (encoding?) とタイプすることで現時点で認識されている文字コードの種類を確認することができる。 `encoding=latin1` などと表示されるが、実際の文字コードがUTF-8ならば `:set enc=utf-8` (encoding=utf8) とタイプする。

#### タブ幅の変更
タブ幅はデフォルトでは8文字になっていると思うが変更する場合は `:set ts=11` (tabstop=11) のように指定する。

#### シェルからの実行時にVimのコマンドを実行
シェルから編集するファイルを開く際、オプション `-c` により複数のVimのコマンドを実行させ、設定などを行うことができる。 `$ vim -c 'set ts=15' -c 'set enc=utf-8' -c 'syntax on' index.html` などなど。エイリアスにしておいてもよい。

#### 構文による色分けの配色変更
プログラムを構文に従って色分けしたい場合は `:syntax on` とするが、背景が白だったり黒だったりで非常に見にくいことがある。そのような場合は `:colorscheme delek` などとして配色を変更することができる。選択可能なリストは `:colorscheme` の後にタブキーを叩けばよい。

#### カーソルの位置を表示
背景の色の関係などでカーソルの位置、特に検索した際のカーソルの位置が見にくく、見つけづらいことがある。`:set cursorline` とするとカーソルのある行に線が引かれて分かりやすくなる。

#### タブや改行の表示
`:set list` とすればよい。元に戻す、つまり解除するには `:set nolist` とする。

#### 自動インデント
独自のインデントを強行する場合は `:set noautoindent` とすると良い。

# ファイル

#### 複数のファイルの扱い
起動する際にコマンド引数で複数のファイルを指定する、あるいは `:e` または意外と便利な `:E` で別なファイルを追加で開くことができる。開かれた個々のファイルはbufferと呼ばれ、ファイルとbuffer番号との対応を確認したい場合は `:ls` とタイプする。例えばbuffer番号3のファイルを編集したい場合は `:b3` (buffer 3) とタイプ、control + ^ でもbuffer間を渡ることができ、開いているbufferを閉じたい場合は `:bd` (bdelete) とタイプする。bufferにある情報は補完に利用されるので、関連するファイルは多数開いておいた方が良い。

#### 編集不可でファイルを開く
コマンドオプション `-R` で変更できなくなる。

# 画面の分割

#### 画面の分割
複雑な分割はさておき `:sp` (split) で画面を上下に `:vsp` (vsplit) で左右に2分割することができる。上の画面に移動したい場合は control + w, k とする。上下左右の移動はそれぞれおなじみの k, j, h, l なので分かりやすい。それぞれでまた別なファイルを開くことができる。分割を終了する場合は `:q` とする。

# 移動

#### 行内の1文字検索による移動
行内で `f` `t` `F` `T` を利用した1文字検索、さらに `;` `,` の繰り返し検索を活用すると高速に移動することができる。 `fx` とすると行内右側で次にある文字xのところまでカーソルが移動する。 `tx` ではその1文字手前まで。大文字 `F` `T` にした場合は左側へ検索。 `;` は直前の検索方向へ繰り返し、 `,` は逆方向へ繰り返し。 つまり `Tx` に続き `,` とした場合は、逆方向右側へ検索を行う。

#### 折り返されている長い行内での移動
通常の移動に `g` を添えることで折り返されて表示されている長い行内での移動ができる。下の行へは `gj` 、上の行へは `gk` 、折り返されて表示されているその行の先頭へは `g0` 、その行末へは `g$` とする。

#### 現在のカーソル位置を基準に表示されている画面を移動
1ページよりも小さな範囲でのスクロールには `z` が便利。現在のカーソルの位置を最も上に、真ん中に、最も下に位置させるように画面をずらすには、それぞれ `zt` `z.` `z-` とする。

#### 表示画面を半分だけ移動
表示画面を半分だけ移動する場合は control + u または control + d とする。それぞれ、表示画面が下がり、あるいは上がり、それぞれ上側が、あるいは下側が見えるようになる。
 
#### 上下の行の先頭へ移動
下の行の先頭へは `+` 、上の行の先頭へは `-` 、それぞれ1文字で移動できる。

#### 単語の末尾に移動
単語の末尾の文字に移動するには `e` 記号なども含めてまとめて扱う場合は `E` とするが、これらを `ge` または `gE` とすると、直前の単語の末尾に、つまり左側に移動することができる。

#### マークを利用した移動
コマンド `mm` で現在のカーソル位置にマークを付け、その場所に `` `m `` または `'m` で移動することができる。編集中に一時的に違う場所に移動したくなった場合などに便利。2文字目の m は m である必要はなくアルファベットの小文字と大文字のどちらでも指定することができ `:marks` で使ったマークの一覧を確認することができる。

# 削除、コピー、ペースト、置換

#### 行内の特定の文字までの削除
行内の1文字検索 `f` `t` `F` `T` を利用し、特定の文字までの文字列を削除することができる。例えば `dfx` とするとカーソルのある位置から次のxまでの文字列を削除することができる。もし、もっと向こうのxまで削除したい場合は `.` を何回か連打すればよい。

#### 行番号を指定して複数行の削除
例えば34行目から91行目までを削除したい場合は `:34,91d` とする。

#### cdyおよびwWbBeEfFtTを組み合わせてテキストの置換、削除、コピー
置換、削除、ヤンクを行なうコマンド `c` `d` `y` を、行内の移動コマンド `w` `W` `b` `B` `e` `E` `f` `F` `t` `T` と組み合わせることで、さまざまな置換、削除、コピーが可能となる。

#### 行内の特定の文字までの置換
行内の1文字検索 `f` 等を利用し、特定の文字までの文字列を別な文字列に置換することができる。例えば `cfx` とするとカーソルのある位置から次のxまでの文字列をこれからタイプする文字列で置換することができる。

#### 1文字置換と1行置換
置換したい文字にカーソルがある時に `s` をタイプすると、その後に入力する任意の文字列でその1文字を置換することができる。カーソルが空白行にある場合は `a` や `i` と同じ動作になる。その場所から8文字の文字列を置換したい場合は `8s` とする。行内の任意の場所で `S` をタイプすると、その行全体の置換となる。

#### 名前付きregisterの利用
クリップボードに相当するregisterのうち、名前付きregisterは `"a` `"b` `"c"` ... `"y` `"z` というように26領域を利用することができる。コピーやカットに相当する処理を実行する直前に `"x` などを付ければよい。 `"dyy` `"edd` `"f8x` などなど。ペーストする場合は `"dp` などとする。registerの一覧を表示するには `:reg` とする。

#### ヤンク
行内の一部の文字列をコピーしたい場合、 `yl` で1文字をコピー、 `y8l` とすればそこから8文字、 `yw` とすればそこから単語の末尾まで、 `y8w` で8単語、 `y$` で行末まで、 `y^` で直前の文字から行頭まで、 `yb` で直前の文字から単語の先頭までがヤンクされる。

#### registerに保存されている文字列で置換
挿入モードでregisterに保存されている文字列を出力するには control + r を使う。どのregisterかを示す `"` が表示されるので、続けてregisterの領域名を打てばよい。やや大きな領域を置換する場合は `cw` `c$` `S` などとして挿入モードに移行すると、無名registerから目的の文字列が `"0` に移動したりしているので、たいていの場合は続けて `0` を打てばよい。

#### タブや改行の検索と置換
タブの検索には `\t` を、その一方、置換には `^I` (control + v, i) を用いる。
改行の検索には `\n` を、その一方、置換には `^M` (control + v, m) を用いる。

# 検索

#### 大文字と小文字の区別
大文字と小文字を区別しない場合は `set: ignorecase` で、この設定を解除したい場合は `set: noignorecase` とすればよいが、検索の際に `/\c` に続けて文字列を打てば、大文字と小文字を区別せずに検索が行われる。

# 挿入

#### 前回挿入した文字列を挿入
挿入モードを抜けようとcontrol + [を打とうとしていつも変になっていた原因は、右手の小指が届いておらずcontrol + @となっていたことであった。これにより、挿入モードで前回挿入した文字列をそこに挿入して、挿入モードを抜けることになる。

# 正規表現

正規表現を利用する場合、メタ文字はバックスラッシュでエスケープする必要がある。例えば、空白文字の並びを1つのタブで置換する場合は `:%s/ \+/^I/g` (`^I` は control + v, i) とする。 

# 補完

#### 単語補完
変数名などを途中まで入力し control + p とすると、その後に続く文字列をbuffer中から探して補完してくれる。これは前方検索で control + n とすると後方検索になるので p か n のどちらかを使えばよい。1つに決まらない場合は候補が表示されるので、同じく control を押したまま p または n を連打し、その次に入力したいキーを続けて叩けばその候補が選択される。bufferにあるファイルから候補が挙げられるので、関連するファイルは多数開いておいた方が良い。

# 制御文字等の編集

オプション `-b` を使ったバイナリモードでファイルを開くと byte order mark (BOM) や carriage return (CR) を表示することができ、削除することが可能になる。
ちなみにBOMの有無を確認するには `:set bomb?` とする。bomではなくてbombというのが... VimでBOMを付加するには `:set bomb` 削除するには `set: nobomb` でも可能。

# ビジュアルモード

#### 行単位で置換
`V` で行単位で操作できるビジュアルモードに移行。例えばテキストファイルの連続する20行の行頭に # などの文字列を入れるには、下へ行く `j` で行を選択して行頭の^を利用して置換s。

#### 矩形選択で挿入
矩形選択後に大文字 `I` あるいは `A` で矩形領域のそれぞれ左側、右側に同一文字列を挿入することができる。

#### 行末に文字列を追加
矩形選択後に `$A` で選択されている全ての行の末尾に文字列を追加することができる。

#### 矩形選択のカット、ヤンク、ペースト
カットは `d` または `x` で、ヤンクは `y` で、ペーストは `p` または `P` で可能。

#### 矩形選択領域の文字置換
矩形選択して `r` を使えば、全文字を変更することができるので、伏せ字にしたい場合などに利用可。

# バージョンの確認
Vimか否かを含め、バージョンはオプション`--version`で確認。

```
$ vi --version | head -n1
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Oct 30 2018 19:56:57)
```

# コマンドlessからVimを起動
コマンドlessで`v`とタイプするとVimが起動し、編集することが可能になる。lessで日本語表示に問題があり、Vimで可読となる場合にも有用。