カーソル移動
- 四方移動
-
[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,
- 行上の指定した文字に対しての操作
マーク
- 現在のカーソル位置を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=\
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