今からはじめるvim入門 コマンドライン編（２）


## はじめに
前回は [vim入門 基礎編](https://qiita.com/aomc/items/a62c4b0199db647f63e8)を解説しましたが、今回はコマンドラインモードについて詳しく説明していこうと思います。筆者も普段から使用していますが、とても便利なので是非覚えて欲しいです。

## コマンドラインモードについて

：（コロン)を入力することで移行する事ができ、ここで実行するコマンドのことを「Exコマンド」と言います。
雑談ですが、素はexというラインエディタがあり、そこにvisualモードが追加されviとなった模様。
Exコマンドには前回紹介したような:w(ファイルの保存)、:{数字}(行移動)の他にも新たにウィンドウを開いたり、コピー、置換、シェルコマンドの実行など色々なことが出来ます。それでは筆者が使用している便利なコマンドを解説していきます。

--------

### helpコマンド

| | 　|
|--|--|
|:help　{コマンド}| 指定したコマンドのヘルプを表示 |

例えば、:help :?と入力するとexコマンドの説明が表示されます。
:qでhelpを閉じることができます。
実は筆者はあまり使用していません（汗)、なぜなら英字でかつ読みにくいと感じたからです。ですが、皆さんならきっと使いこなしてくれると信じています！
一応、プラグインで日本語化することも出来るみたいなので興味のある方は調べてみてください。

<br>

### ファイルの保存、終了

| | 　|
|--|--|
|:w | ファイルに保存 |
|:q | 現在のウィンドウを閉じる |
|:q! | 現在のウィンドウを強制的に閉じる |
|:wq | ファイルに保存して現在のウィンドウを閉じる |
|:wa | 全てのウィンドウを閉じる |
|:wqa | 全てのウィンドウをファイルに保存して閉じる |
|:e {ファイル}| ファイルを編集 |


:qは開いてるウィンドウがなくなるとvimが終了します。また編集中のファイルを:qした場合エラーになりますが、:q!だと強制的に閉じることができます。

<br>

### コピー、移動コマンド

| | 　|
|--|--|
| :{行数範囲}y　|　{行数範囲}をコピー |
| :{行}pu　|　{行}の下に貼り付け |
|:{行数範囲}t{行}(:copy) |　{行数範囲}を{行}の下にコピー |
|:{行数範囲}m{行}(:move) | {行数範囲}を{行}の下に移動 |

:の後の{行数範囲}を入力しないと現在行として扱われます。また、{行数範囲}は:の後に{行数,行数}と指定すると行数範囲になります。行数は数字の他にも0(先頭)、$(末尾)が使用できます。
<br>
例1：現在行を5行目の下にコピー
```
:t5
```
例2：1行目から5行目をファイル末尾の下にコピー
```
:1,5t$
```
例3：10行目をファイル先頭の下にコピー
```
:10t0
```
例4：ファイル全体を現在行の下にコピー
```
:%t.
```

<br>

### 置換

| | 　|
|--|--|
|:%s/{変換元}/{変換先}/g | 現在開いているファイルの{変換元}を全て{変換先}に置換 |

%を取ると、現在のカーソル行に対して行います。
```
:s/{変換元}/{変換先}/g
```
また、gを取ると１つだけ変換します。
```
:s/{変換元}/{変換先}/
```
最後に/のあとにcを入力すると毎回確認画面が表示されます。
```
:s/{変換元}/{変換先}/gc
```

ちなみにvisualモードで選択後:を押すと'<,'>という文字が挿入されますが、これは範囲選択という意味です。<br>
```
:'<,'>%s/{変換元}/{変換先}/g
```

<br>

###  ウィンドウ(ファイル)を開くコマンド

| | 　|
|--|--|
|:vs | 垂直に分割 |
|:sp | 水平に分割 |
|:new | バッファ(ファイル)を開く(水平) |
|:vnew | バッファ(ファイル)を開く(垂直) |
|:tabnew | タブを新規に開く |

コマンドの後ろにファイルパスを指定するとそのファイルを開くことが出来ます(カレントディレクトリから)。:pwdと入力することでカレントディレクトリを確認できます。
ウィンドウを閉じるには:wq,:qで閉じます。<br>
そして複数のウィンドウを使用するにあたって移動手段が必要になります。それが下記のコマンドです。

| | 　|
|--|--|
|{Ctrl+w}j | 下に移動 |
|{Ctrl+w}k | 上に移動 |
|{Ctrl+w}h | 左に移動 |
|{Ctrl+w}l | 右に移動 |

{Ctrl+w}を覚えたら、あとはノーマルモードのカーソル移動をするとウィンドウを移動できます。また{Ctrl+w}は他にもウィンドウの幅調整にも使用されます。

| | 　|
|--|--|
|{数字}{Ctrl+w}< | 左に{数字}文字分幅移動 |
|{数字}{Ctrl+w}> | 右に{数字}文字分幅移動 |
|{数字}{Ctrl+w}+ | 上に{数字}行幅移動 |
|{数字}{Ctrl+w}- | 下に{数字}行幅移動 |

<br>

### タブを操作するコマンド

| | 　|
|--|--|
|:tabnew {ファイル}| {ファイル}の新規タブを開く |
|gt(:tabnext) | 次のタブへ移動 |
|gT(:tabprevious) | 前のタブへ移動 |
|:tabc(:tabclose) | 現在のタブを閉じる |
|:tabr(:tabfirst) | 最初のタブに移動 |
|:tabl(:tablast) | 最後のタブに移動 |
|:tabo | 現在のタブ以外を閉じる |

:tabnewだけだと新規バッファ(ファイル)が開きます。
:tabcloseだけだと保存されないので:wを忘れずに行いましょう。また:wqや:qでも閉じる事ができます。これだけ見ると:tabcloseを使う場面はなさそうに見えますが、今後vimをカスタムしてコマンドにショートカットキーを設定するようになれば使うようになると思います。（たぶん

<br>

### コマンドラインの履歴表示

| | 　|
|--|--|
|:{Ctrl+p} | 前の実行コマンドを表示 |
|:{Ctrl+n} | 次の実行コマンドを表示 |
|:{Ctrl+f} | 実行コマンド履歴一覧を表示 |

実行コマンド履歴一覧はウィンドウが水平分割で表示されるので、検索やノーマルモードのカーソル移動ができます。また実行したいコマンドにカーソルを合わせてenterを押すと実行することが可能です。



### その他のコマンド

| | 　|
|--|--|
|:!{command}| 外部コマンド{command}の実行|
|:{数字} | {数字}行に移動 |
|:reg | レジスタ一覧の表示 |
|:pwd | 現在のディレクトリを表示 |
|:colorscheme | カラースキームの設定 |


外部コマンドの実行例：
```
:!cd ../
```

レジスタに関して筆者はあまり使用しておらず、ここでは軽く紹介だけさせていただきます。

![reg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758020/8f67fc1e-c496-593d-8c75-ecf586bd5ce9.png)

上記の画像のようにレジスタ一覧のnameに"","0という名前とContentにはレジスタに登録されている文字が表示されています。ノーマルモード時に名前を入力した後、yyを押すとその名前にyankした文字列が登録されます。yankの方法はノーマルモードで使用できるやり方ならどれでも使えると思います。
登録したレジスタを使用したい場合は、名前の後にpを入力するとペーストすることができます。詳しいことは[こちら](https://ylabdesk.com/vim-register-commands)のサイトが参考になるかと思います。

```
"0yy
"0p
```

カラースキームについては細かく設定しようとすると大変なのでここでは簡単な使い方だけ紹介します。

```
:colorscheme desert
```
:colorscheme{空白}を入力した後tabを押すと登録されているカラースキームが一つずつ表示されます。（されなかったらすみません）

## setコマンドについて
optionというvimの設定を変更できるコマンドになります。

例えば下記のように使用します。
```
:set {option}
```
設定を解除したい場合は{option}の前にnoを付けます。
```
:set no{option}
```
そして現在{option}がどんな設定をされているか確認したい場合、?を付けます。
```
:set {option}?
```
<br>

では具体的にどのようなoptionがあるか見てみましょう。


| | 　|
|--|--|
|number| 行番号の表示|
|list | 制御文字の表示(空白やタブ) |
|confirm | 閉じるファイルが編集中であると確認表示する|
|hlsearch | 検索文字をハイライト　|
|incsearch | インクリメントサーチ|
|clipboard | クリップボードの設定|
|smarttab | shiftwidthの数だけインデント|
|smartindent | いい感じに自動インデントしてくれる|
|ignorecase | 検索時に大文字と小文字を区別しない|
|mouse | マウスの設定|
|nobackup | バックアップファイルを作成しない|
|noswapfile | スワップファイルを作成しない|
|hidden | バッファ切り替え時に保存確認されない|
|encoding | vim自体の文字コード|
|fileencodings | ファイルに使用したい文字コード　|

```
:set number
:set list
:set hlsearch
:set incsearch
クリップボードをOSと共有
:set clipboard^=unnamed
:set smarttab
:set smartindent
:set ignorecase
マウスの入力を受け付ける
:set mouse=a
:set nobackup
:set noswapfile
:set hidden
vimの文字コードをutf-8にする
:set encoding=utf-8
ファイルを開いた際、左から順にエラーの出ない文字コードを使用
:set fileencodings=utf-8,sjis,euc-jp,iso-2022-jp
```

optionはただsetするだけでなく、=を使用するoptionもあります。最後尾に追加したい場合は+=を、最初に追加したい場合は^=を使用します。また、clipboardについてはOSによって異なるかもしれません。（筆者はMac)
他にも色々便利なoptionがあるので是非探してみてください。

## さいごに
exコマンドの他にも関係あるコマンドを紹介させて頂きました。最初からすべて覚えるのはとても大変なので使いながら少しずつ覚えていってもらえると嬉しいです。
最後にsetコマンドを紹介しましたが、毎回vimを立ち上げる際に入力するのはとても大変ですよね？ですので次回はvim起動時に設定を読み込んでくれる.vimrcについて解説できたらと思っています。
ここまでご観覧いただきありがとうございました。


## 参考サイト
https://gigazine.net/news/20200704-how-vim-become-popular/
https://vim-jp.org/vimdoc-ja/
https://vimate.jp/lessons/vim-03/commands
https://ylabdesk.com/vim-register-commands