Vim

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
    • 置換(文字数)
    • 0123456789
    • 仮想置換(文字幅)
    • 0126789

ファイル

  • ファイルを開く
    • :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はちょっとこっち来い

折りたたみ

折り畳みの設定
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を使う

"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