vimの操作方法の一覧

## カーソル移動
- 四方移動
	- `[n]h`,`j`,`k`,`l`
- 折り返しの上下移動
	- `[n]gj`,`gk`
- 画面上の最上に移動
	- `H`
- 画面上の最下に移動
	- `L`
- 画面上の真ん中に移動
	- `M`
- n%の位置に移動
	- `n%`
- 次の単語
	- `[n]w`
- 前の単語
	- `[n]b`
- 次の単語の末尾に移動
	- `[n]e`
- 前の単語の末尾に移動
	- `[n]ge`
- 次の単語 スペース区切り
	- `[n]W`
- 前の単語 スペース区切り
	- `[n]B`
- 次の単語の末尾に移動 スペース区切り
	- `[n]E`
- 前の単語の末尾に移動 スペース区切り
	- `[n]gE`
- 行頭に移動
	- `0`
- 行末に移動
	- `$`
- 空白でない行頭に移動
	- `^`
- 折り返しの移動
	- `g0`
	- `g$`
	- `g^`
- 上の行頭の非空白文字に移動
	- `[n]-`
- 下の行頭の非空白文字に移動
	- `[n]<CR>`,`+`
- 行の中央に移動に移動
	- `gm`
- 一行目に移動
	- `gg`
- 最後の行に移動
	- `G`
- n行目に移動 
	- `[n]G` 
- 対応する括弧に移動
	- `%`
- 編集した場所の一覧
	- `:changes`
- 前回編集した場所に戻る
	- `[n]g;`
- 前回編集した場所に進む
	- `[n]g,`
- 行上の指定した文字に対しての操作
	- [n][d,y,c][f,t,F,T][a-Z,0-9,記号群]
	- [n]:数
	- [d,y,c]:オペレータ
	- [f,t,F,T]:
		- fは前方に探し移動
		- Fは後方に探し移動
		- tは前方に探し直前の文字に移動
		- Tは後方に探し直前の文字に移動
	- [a-Z,0-9,記号群]:探す文字
	- 次の一致に移動
		- `;`
	- 前の一致に移動
		- `,`

## マーク
- 現在のカーソル位置をaにマーク
  - `m[a-Z]`
- aにマークした行の頭に移動
  - `'[a-Z]`
- aにマークした行列に移動
  - `` `[a-Z] ``
- ジャンプリストを変更しない移動
  - `g'[a-Z]`
  - `` g`[a-Z] ``
- マークの一覧
  - `:marks`
- マークの削除
  - `:delmarks[a-Z]`
- マークの全削除
  - `:delmarks!`
- マークの種類
   - 0~9 過去に閉じたファイルのその時点でのカーソル位置
   - " カレントバッファを前回閉じた際のカーソル位置
   - [ カレントバッファで直前に変更またはヤンクしたテキストの先頭
   - ] カレントバッファで直前に変更またはヤンクしたテキストの末尾
   - ^ カレントバッファでの直前のインサートモード終了位置
   - . カレントバッファでの最後に変更した位置
   - < 直前にビジュアルモードで選択したテキストの先頭
   - > 直前にビジュアルモードで選択したテキストの末尾
- 前の位置に戻る
  - `[n]<C-o>`
- 進む
  - `[n]<C-i>`
- ジャンプリストを表示
  - `:ju(mps)`
- このファイルで最後に変更した場所に移動
  - `'.`, `` `. ``
 
## ページ移動
- ページを現在行が中央になるように移動
  - `zz`,`z.`
- ページを現在行が最上になるように移動
  - `z<CR>`,`zt`
- ページを現在行が最下になるように移動
  - `z-`,`zb`
- 次のページ
  - `<C-f>`
- 前のページ
  - `<C-b>`
- 半ページ次
  - `<C-d>`
- 半ページ前
  - `<C-u>`
- 画面を一行下に移動
  - `<C-e>`
- 画面を一行上に移動
  - `<C-y>`

## カット＆ヤンク＆ペースト
- 行削除
  - `[n]dd`
- カーソル位置から行頭まで削除
  - `d0`
- カーソル位置から行末まで削除
  - `d$`
- カーソル位置から最初まで削除
  - `dgg`
- カーソル位置から最後まで削除
  - `dG`
- 文字削除
  - `[n]x,dl`
- 文字削除(カーソルの左)
  - `[n]X`
- 単語削除
  - `dw db de da" di( ...`
  - `dab daB dap`
- 範囲削除(7行目から20行目まで削除)
  - `:7,20d`
- ヤンク(カットと同じ)
  - `yl yy yw y$ y0 3yy :4,89y`
- 次に貼り付け
  - `[n]p`
- 前に貼り付け
  - `[n]P`
- 次に貼り付けてカーソルを移動
  - `[n]gp`
- 前に貼り付けてカーソルを移動
  - `[n]gP`
- インデントを合わせて次に貼り付け
  - `[n]]p`
- インデントを合わせて前に貼り付け
  - `[n][p`
- レジスタ履歴
  - `:reg`
- 共有
  - `""p`
- ヤンク専用
  - `"0p`
- デリート専用
  - `"1p`
- 直近の検索語を貼り付け
  - `"/p`
- 編集中ファイル名を貼り付け
  - `"%p`
- 直近のコマンド
  - `":p`
- クリップボード
  - `"+ +レジスタに入っているデータを外で貼り付けできる`
  - `"* 外でコピーしたデータの格納場所`
- コマンドモード,インサートモード時の貼り付け
  - ヤンクした文字列
     - `<C-r>0`
  - 外でコピーしてきた文字列
     - `<C-r>*`
  - 最前の検索語
     - `<C-r>/`

## visualモード
- 領域選択 
  - `v`
- 領域選択 行
  - `V`
- 領域選択 矩形 
  - `<C-v>`,`<C-q>`
- 直前の選択範囲を再選択
  - `gv`
- 始点変更
  - `o`
- 文字置換
  - `r[a-Z,0-9,記号群]`
- 行頭に追記 矩形選択
  - `I`
- 行末に追記 矩形選択
  - `A`
- パラグラフ選択
  - `ip`
- 小文字にする
  - `u`
- 大文字にする
  - `U`
- 大文字、小文字反転
    - `~` 

## インサートモード
- インサートモード 
  - `[n]i`
- 非空白文字の行頭にインサートモード
  - `[n]I`
- 行頭にインサートモード
  - `[n]gI`
- 次の桁でインサートモード
  - `[n]a`
- 行末にインサートモード
  - `[n]A`
- 下の行にインサートモード
  - `[n]o`
- 上の行にインサートモード
  - `[n]O`
- 一文字消してインサートモード
  - `[n]s`,`[n]cl`
- 一行消してインサートモード
  - `[n]S`,`[n]cc`
- 単語消してインサートモード
  - `cw ci( ca" cB ...`
- カーソル位置から行末まで削除してインサートモード
  - `C c$`
- 直前の挿入箇所でインサートモード
  - `gi`

## インサートモード時の操作
- インサートモードからノーマルモード
  - `<ESC>`,`<C-[>`,`<C-c>`
- 一度だけコマンドを実行
  - `<C-o>{cmd}`
- インデントを一つ下げる
  - `<C-d>`
- インデントを一つ上げる
  - `<C-t>`
  - `<tab>`
- backspce
  - `<C-h>`
- 前の単語削除
  - `<C-w>`
- カーソル位置から行頭まで削除
  - `<C-u>`
- ヤンクした文字列
  - `<C-r>0`
- 外でコピーしてきた文字列
  - `<C-r>*`
- 最前の検索語
  - `<C-r>/`
- 直前に挿入した文字列を挿入
  - `<C-a>`
- 直前に挿入した文字列を挿入してノーマルモード
  - `<C-@>`
- 計算を入力
  - `<C-r>=20*20+20`
  - 420
- ファイル名を入力
  - `<C-r>=argv()`
  - vim.txt
- 前の行列の複製
     - `<C-y>`
- ダイグラフ
  - `<C-k>a5` あ
  - `<C-k>A6` ア
  - `<C-k>te` て
  - `<C-k>Te` テ
  - `<C-k>n5` ん
  - `<C-k>SE` §
  - `<C-k>PI` ¶
- (挿入)スクロール
  - `C-x C-e`
  - `C-x C-y`
- 補完
  - `C-n`で次
  - `C-p`で前
  - `C-e`で中止
  - `C-y`,`Space`,`Return`で決定
  - キーワード補完(前方)
     - `<C-n>`
  - キーワード補完(後方)
     - `<C-p>`
  - 局所キーワード補完
     - `C-x C-n`
     - `C-x C-p`
  - ファイル名補完
     - `C-x C-f`
  - パスパターン補完
     - `C-x C-i`
  - 行(全体)補完
     - `C-x C-l`
  - 綴り修正候補
     - `C-x s`
     - `set spell`
     - `set spelllang=en,cjk


## 置換モード
- 一文字置換
  - `[n]r`
  - `[n]gr`(仮想)
- 全て置換
  - `[n]R`
  - `[n]gR`(仮想)
- 例(0123456789
  - 置換(文字数)
    - ０１２3456789
  - 仮想置換(文字幅)
    - ０１２6789

## ファイル
- ファイルを開く
  - `:e(dit) {file}`
  - `:e +23 {file}` 開始位置が23行目
  - `:enew`
- ファイルエクスプローラを開く
  - `:e .`
  - `:browse e`
     - `-` 一つ上のディレクトリに移動
     - `c` 現在のディレクトリをカレントディレクトリとする
     - `i` 詳細を表示
     - `s` 詳細表示時にソート
- ウィンドウを水平分割してファイルエクスプローラを開く
  - `:Sex`
- change directory
  - `:cd`
- 編集中バッファのみカレントディレクトリを変える
  - `:lcd`
- カーソル位置にある単語をファイル名と見なして開く
  - `gf`
- 階層位置
  - `:pwd`
- バッファの移動
  - `:b[n]`
- 次のバッファへ
  - `:bn`
- 前のバッファへ
  - `:bp`
- 直前のバッファへ
  - `:b#,<C-^>,bb`
- 編集中のバッファ一覧
  - `:buffers`
  - `:ls`
- バッファ削除
  - `:bd(elete)[n]`
  - `:bd![n]` 強制削除
- 既に開いているバッファを開く
  - `:b {file}`
- 全バッファに対してコマンドを実行
  - `:bufdo %s/function/func/`
- 1行目から20行目までを{file}に書き込み
  - `:1,20 w {file}`
- 1行目から20行目までを{file}に追記
  - `:1,20 w>> {file}`
- {file}の内容を現在行に挿入
  - `:[n]r {file}`
- コマンドの実行結果を挿入
  - `:r!{command}`
- 複数ファイルの操作
   - ファイルを指定
     - `:ar(gs) {file1} {file2} {file3}`
     - `:ar dir1/dir2/dir3/dir4/dir5/*`
     - `` :ar `find . -name \*.txt` ``
     - `:ar **/*.txt`
   - 指定ファイルの確認
     - `:ar(gs)`
   - ファイルの追加
     - `:argadd`
   - 実行
     - `:argdo %s/function/func/g`
   - 保存
     - `:argdo update`
   - 実行保存
     - `:argdo %s/function/func/g | update`

## ウィンドウ
- ウィンドウを横に分割 
  - `:sp(lit)`
- ウィンドウを横に分割(読み取り専用)
  - `:sview {file}`
- ウィンドウを縦に分割 
  - `:vs(plit)`,`<C-w>v`
  - `:vs {file}`
- 新規ファイル 水平
  - `:new`
- 新規ファイル 垂直
  - `:vnew`
- すべてを閉じる
  - `:wqa`
  - `:qa`
- 閉じる
  - `:close`,`<C-w>q`,`:hide`
- 現在ウィンドウ以外閉じる
  - `:on(ly)`,`<C-w>o`
- ウィンドウ間を移動
  - `<C-w>[j,k,h,l]`
- ウィンドウの位置を入れ替え
  - `<C-w>[J,K,H,L]`
- 次のウィンドウ
  - `<C-w>w`
- 前のウィンドウ
  - `<C-w>p`
- 高さ調整
  - `<C-w>-`
  - `<C-w>+`
- 幅調整
  - `<C-w><` 現ウィンドウの幅を縮める
  - `<C-w>>` 現ウィンドウの幅を広める
- 大きさを等しくする
  - `<C-=>`
- 全ウィンドウに対してコマンドを実行する
  - `:windo`

## タブ
- タブ追加
  - `:tabnew`
  - `:tabe(dit) {file}`
  - `:tabe +33 {file}`
- 既存のファイルを開く
  - `:tabf(ind) {file}`
- タブ閉じる
  - `:tabc(lose)`
- 現在タブ以外閉じる(バッファは閉じない)
  - `:tabo(nly)`
- 次のタブ
  - `gt`
  - `:tabn(ext)[n]`
- 前のタブ
  - `gT`
  - `:tabp(revious)`
  - `:tabN(ext)`
- 最初のタブに移動
  - `:tabfirst`
  - `:tabr(ewind)`
- 最後のタブに移動
  - `:tabl(ast)`
- タブの一覧
  - `:tabs`
- タブの順番を変える
  - `:tabm(ove)[n]`
- 全てのタブで実行
  - `:tabdo`

## 検索
- .vimrcに下記を記入していると全検索になる
  - `set wrapscan`
- インクリメンタルサーチ
  - `set incsearch`
- 下方向に文字列を検索
  - `/<文字列>`   (インクリメンタルサーチ)
  - `:/<文字列>`
- 上方向に文字列を検索 wrapscanをonにしていると使わない
  - `?<文字列>`   (インクリメンタルサーチ)
  - `:?<文字列>`
- 最前の検索結果
  - `//`   (インクリメンタルサーチ)
  - `://`
- カーソル上の単語と同じ単語に下方向に移動
  - `*`, `g*`
- カーソル上の単語と同じ単語に上方向に移動
  - `#`, `g#`
- 次へ
  - `n`
- 前へ
  - `N`
- vimgrep grep
  - `:vim(grep) {pattern} {file}`
  - 次へ `:cn(ext)`
  - 前へ `:cN(ext)`,`:cp(revious)`
  - ワイルドカード
     - `?` 一つの文字
     - `*` 全て
     - `**` 全て 再帰的にディレクトリに入る
     - `[abc]` a,b,cのどれか
  - {pattern}
     - `/{pattern}/j` 検索後に移動しない
     - `/{pattern}/g` 一行に複数ある場合は全て表示(重複する)
  - {file}
     - `%` :カレントバッファ
     - `*` :カレントディレクトリにあるファイル
     - `**` :カレントディレクトリ以下の全てのファイル
     - `dir/**` :dir以下の全てのファイル
     - `dir/*` :dirからひとつ下の階層にある全てのファイル
     - `dir/**/*.txt`
     - `dir/**/a*.txt`
- Quickfixウィンドウ
  - `:cw(indow)`
  - `:ccl` 閉じる
  - `:vim {pattern} {file} | cw`
  - .vimrcに下記を追記すると検索後に:cwを実行しなくともQuickFixを表示
  
  ```
     augroup QuickFixCmd
       autocmd!
       autocmd QuickFixCmdPost *grep* cwindow
     augroup END
  ```

  - QuickFixWindow上の操作
       - :cdo %s/function/func/ | update

参考ページ[vimgrepとQuickfix知らないVimmerはちょっとこっち来い](https://qiita.com/yuku_t/items/0c1aff03949cb1b8fe6b)

## 折りたたみ
折り畳みの設定
`set foldmethod=marker foldmarker=>->,<-<`
折り畳み時のマーカーをコメントする際に使う記号の設定```
set commentstring=\ %s
autocmd FileType python set commentstring=\ #%s
autocmd FileType html set commentstring=\ <!--\ %s\ -->
autocmd FileType sh set commentstring=\ #%s
autocmd FileType vim set commentstring=\ \"%s
```

- 折り畳みの有無効の切り替え
  - `zi`
- 折り畳みの作成
  - `[n]zf`
- 折り畳みの削除
  - `zd`
- 再帰的に削除
  - `zD`
- 全削除
  - `zE`
- 折り畳みの開閉
  - `za`
- 折り畳みの再帰的開閉
  - `zA`
- 折り畳みを開く
  - `zo`
- 折り畳みを再帰的に開く
  - `zO`
- 折り畳みを閉じる
  - `zc`
- 折り畳みを再帰的に閉じる
  - `zC`
- 折り畳みの先頭に移動
  - `[z`
- 折り畳みの末尾に移動
  - `]z`
- 一つ下の折り畳みに移動
  - `zj`
- 一つ上の折り畳みに移動
  - `zk`
- 全ての折りたたみを閉じる
  - `zM`
- 全ての折りたたみを開く
  - `zR`

## 置換
`:%s/<置換元文字列>/<置換後文字列>/gce`

- 区切り文字は任意
- `%`はカレントバッファ
- `c`は確認
- `g`は一行に複数あってもすべて置換
- `e`はエラーを表示しない

置換ではないけど
testを含む行を削除
`:g/test/d`
testを含まない行を削除
`:v/test/d`

指定範囲をコマンドの標準入力として扱い、標準出力で上書きする
`:.!{シェルコマンド}`
`:3!date`
`:.!bc` 20*30が600で置換される
`:.,.+3!nl`　4行に行番号がつく
`:.-4!sed 's/ //g'`

## その他

現在の行と下の行を連結
 `J`
間に空白入れる
`gJ`

#### undo-tree
```
edit(1)-----edit(2,4)------edit(3)
                 |
                 -----------edit(5)
```

操作を元に戻す
`u` 一方向 edit3に行けない
`g-` ツリー
操作を進める
`<C-r>`
`g+`
undoリスト
`:undol(ist)`
通番を使ってundo
`:earlier {n}`
`:later {n}`

ハイライト解除
`:noh`

右にインデント
`[n]>>`
左にインデント
`[n]<<`

直近の変更操作を繰り返す
`.`

インクリメント
`<C-a>`
デクリメント
`<C-x>`

シェルコマンドの結果を挿入する
`:.+3r!{シェルコマンド}`
標準入力が必要な場合は実行後に入力する
`:r!bc`
\> `20+20*20`
\> `<C-d>`
420

コマンド履歴
`q:`
直前に実行したコマンドを再度実行
`@:`

### マクロ
記録開始
`:q[a-Z]`
記録終了
`q`
マクロの実行
`@[a-Z]`
例)カーソルにある値をコピーして貼り付けてインクリメントの動作を10回行う
`i`,`0`,`<ESC>`,`qa`,`yy`,`p`,`<C-a>`,`q`,`10@a`

ダイグラフ
`:dig(raphs)`

大文字にするオペレータ
`gu`
小文字にするオペレータ
`gU`
反転するオペレータ
`g~`

バイナリ
`:%!xxd`

選択モード 使いどころがわからない
`gh`
`gH`
`g<C-h>`

### spell
次のスペルミス
`]s`
前のスペルミス
`[s`
候補を表示
`z=`
正しいと登録
`zg`
誤りと登録
`zw`

### vimscriptでpythonを使う
```vimscript
"def,classの行にmarkを付ける
function! MARK_PYTHON()
python3 << py
import vim
import re
char = 97 #'a'の文字コード
vim.command("execute 'mark' 'a'")
nowRow = vim.current.buffer.mark('a')[0] #現在行番号を得る
for i in range( len(vim.current.buffer) ): #1行目から探索
    vim.command("normal " + str(i) + "G")
    if re.search("def |class ", vim.current.line):
        vim.command("execute 'mark' " + "\'" + \
                    char.to_bytes(1,"big").decode("utf-8") + "\'")
        char+=1
        if char >= 123: #zまで使ったらaに戻る
            char = 97
#コマンドを実行した行に移動
vim.command("normal " + str(nowRow) + "G")
py
endfunction
command! Mark call MARK_PYTHON()

augroup python_conf
    autocmd FileType python call MARK_PYTHON()
augroup END
```