Open40
vimのキーバインド
基本モード
モード名 | 切り替えキー |
---|---|
normal mode | Esc |
insert mode |
i / a / o など |
visual mode |
v / V / C-v
|
command mode | : |
replace mode | R |
select mode | gV |
ex mode | Q |
- 編集の基本は
normal
↔︎insert
の切り替え - 矩形選択に
visual
- コマンド入力に
command
- その他は、あまり使わない
文字の削除
コマンド | 動作 |
---|---|
x |
1文字を削除する |
5x |
5文字削除する |
dl / dh
|
1文字削除する |
dw |
1単語削除する |
dd |
1行削除する |
d$ |
行末まで削除する |
- 文字を削除するコマンドは
x
とd
の2種類がある -
x
はEmacsのC-d
に似ている -
d
は続けて範囲を指定できる - どちらのコマンドも削除した文字がレジスタ(
"
)に保存される
文字のコピー(ヤンク)
コマンド | 動作 |
---|---|
yl / yh
|
1文字コピー |
yw |
1単語コピー |
yy |
1行コピー |
y$ |
行末までコピー |
-
y
もd
と同じように範囲の指定が必要なコマンド
文字のペースト
コマンド | 動作 |
---|---|
p (小文字) |
カーソルの後にペースト |
P (大文字) |
カーソルの前にペースト |
ヤンク&ペースト
コマンド | 動作 | Emacs |
---|---|---|
d$ → p
|
行末まで削除 & ペースト |
C-k → C-y or C-SPC C-e C-w → C-y
|
y$ → p
|
行末までコピー & ペースト |
C-SPC C-e M-w → C-y
|
v → y → p
|
選択範囲をコピー & ペースト |
C-SPC カーソル移動 C-w → C-y
|
- Emacsでよく使う
<C-k>
→<C-y>
に相当
レジスター
記号 | レジスター名 |
---|---|
" |
無名レジスター |
"0 |
last yanked |
"1 - "9
|
delete history |
"a - "z
|
名前付き |
"- |
small delete |
"+ |
システムのクリップボード |
"* |
X11のクリップボード |
"_ |
black hole |
": |
last command |
"= |
expression |
". |
last inserted text |
"/ |
last search pattern |
"% |
編集中のファイル名 |
"# |
直前に開いていたファイル |
-
d
やy
した内容は"
(無名レジスター)に保存される -
"0
は直前にyankした内容が保存される -
"1
-"9
は削除した内容の履歴 -
"a
-"z
はユーザーが定義できる -
"_
は保存されない
Emacsキーバインド
- Emacsキーバインドを割り当てる
- 基本は次の形
nnoremap Emacsバインド vimバインド
xnoremap Emacsバインド vimバインド
inoremap Emacsバインド <C-o>vimバインド
cnoremap Emacsバインド <C-c>vimバインド
-
C-o
はinsertモードで一時的にnormalモードに抜けるコマンド -
C-c
はcommandモードでコマンドをキャンセルしてnormalモードにするコマンド
C-a : 行頭に移動
" C-a: beginning of the line
nnoremap <C-a> 0
xnoremap <C-a> 0
inoremap <C-a> <Home>
cnoremap <C-a> <Home>
-
vim
には^
(空白でない行頭に移動)があるが、使わないことにする
vim操作
-
normal
:0
を押す -
insert
:<C-o>0
C-e : 行末に移動
" C-e: end of the line
nnoremap <C-e> $
xnoremap <C-e> $
inoremap <C-e> <End>
cnoremap <C-e> <End>
C-n : 次の行に移動
" C-n: next line
nnoremap <C-n> j
xnoremap <C-n> j
inoremap <C-n> <Down>
cnoremap <C-n> <Down>
C-p: 前の行に移動
" C-p: previous line
nnoremap <C-p> k
xnoremap <C-p> k
inoremap <C-p> <Up>
cnoremap <C-n> <Down>
C-f: 次の文字に移動
" C-f: forward char
nnoremap <C-f> l
xnoremap <C-f> l
inoremap <C-f> <Right>
cnoremap <C-f> <Right>
C-b: 前の文字に移動
" C-b: backward char
nnoremap <C-b> h
xnoremap <C-b> h
inoremap <C-b> <Left>
cnoremap <C-b> <Left>
C-v: 次のページに移動
" C-v: page down
nnoremap <C-v> <PageDown>
xnoremap <C-v> <PageDown>
inoremap <C-v> <PageDown>
cnoremap <C-v> <PageDown>
M-v: 前のページに移動
" M-v: page up
nnoremap <M-v> <PageUp>
xnoremap <M-v> <PageUp>
inoremap <M-v> <PageUp>
cnoremap <M-v> <PageUp>
- Meta / Optionキーを使う
C-s: 前方検索
" C-s: search forward
nnoremap <C-s> /
xnoremap <C-s> /
inoremap <C-s> <Esc>/
cnoremap <C-s> <C-c>/
- insertモードで
<C-o>
ではなく<Esc>
にしたほうが、そのあと(normalモードで)連続で検索できてよい
C-r: 後方検索
" C-r: search backward
nnoremap <C-r> ?
xnoremap <C-r> ?
inoremap <C-r> <Esc>?
cnoremap <C-r> <C-c>?
-
<C-r>
は insertモードやcommandモードで、レジスターの値を挿入するコマンド - そちらをよく使う場合は、この割り当てはしないほうがよいかもしれない
C-x C-f: ファイルを開く
nnoremap <C-x><C-f> :e<SPACE>
xnoremap <C-x><C-f> :e<SPACE>
inoremap <C-x><C-f> <C-o>:e<SPACE>
cnoremap <C-x><C-f> <C-c>:e<SPACE>
-
C-x C-f
を:e (:edit)
に割り当て -
<SPACE>
まで含めることで、ファイル名をそのまま入力できるようにしてある
C-x C-s: ファイルを保存する
" C-x C-s: save file
nnoremap <C-x><C-s> :w<CR>
xnoremap <C-x><C-s> :w<CR>
inoremap <C-x><C-s> <C-o>:w<CR>
cnoremap <C-x><C-s> <C-c>:w<CR>
C-x C-c: ファイルを閉じる
" C-x C-c: close file
nnoremap <C-x><C-c> :q<CR>
xnoremap <C-x><C-c> :q<CR>
inoremap <C-x><C-c> <C-o>:q<CR>
cnoremap <C-x><C-c> <C-c>:q<CR>
- insertモードでは
Type :qa!
というエラーがでてうまくいかないかもしれない
C-k: 行末までカット
" C-k: kill-line
nnoremap <C-k> d$
xnoremap <C-k> d$
inoremap <C-k> <C-o>d$
cnoremap <C-k> <C-c>d$
- Emacsでよく使うバインドのひとつ(
C-y
とセットでよく使う) -
d$
でカットした内容は"
(無名レジスター)に保存される
C-y: ヤンク(ペースト)
" C-y: yank
nnoremap <C-y> p
xnoremap <C-y> p
inoremap <C-y> <C-o>p
cnoremap <C-y> <C-c>p
-
C-k
(=d$
)した内容は"
(無名レジスター)に保存されるのでp
でペーストできる - 外部のクリップボードの内容も使いたい場合は
"+p"
(もしくは<C-r>+
にするとよい-
set clipboard=unnamedplus
していればp
のままでもOKなはず
-
" C-y: yank from clipboard
nnoremap <C-y> "+p
xnoremap <C-y> "+p
inoremap <C-y> <C-r>+
cnoremap <C-y> <C-r>+
-
"+p
で+
レジスター(=クリップボード)からペースト -
<C-r>
はnormalモードではredo
に割り当てられているので"+p
を使う必要がある - insertモード、commandモードでは
<C-r>
のまま使える
言語表示の設定
set langmenu=en
language messages en
language messages en_US.UTF-8
- 日本語設定になっているとモード名が「挿入」「置換」などと表示される
-
:language en
で「Insert」「Replace」に変更できる
set langmenu=en
language messages C
-
:language en
と:language en_US.UTF-8
したら「言語にenは設定できません」とエラー -
:language C
で英語表示に変更できることを確認 -
.vimrc
にはlanguage messages C
を追加した
AddEmacsKey
.vimrc
function! AddEmacsKey(lhs, rhs)
execute 'nnoremap' lhs rhs
execute 'xnoremap' lhs rhs
execute 'inoremap' lhs '<C-o>' . rhs
execute 'xnoremap' lhs '<C-c>' . rhs
endfunction
" C-x C-f: open file
call AddEmacsKey('<C-x><C-f>', ':e<SPACE>')
- Emacsのキーを複数のモードに
nomap
できる関数を作成した -
function!
で関数を定義し、endfunction
で閉じる -
execute
でコマンドを実行する
.vimrc
をGistに整理した
autocmd
-
autocmd
の設定で特定のイベントが発生したときに自動的にコマンドを実行できる
ファイルタイプごとの設定
.vimrc
" Python: use 4 spaces for indent
autocmd FileType python setlocal expandtab shiftwidth=4 tabstop=4
" Markdown: enable text wrap
autocmd FileType markdown setlocal wrap
ファイルの再読み込み
.vimrc
" Reload files edited outside vim editor
autocmd FocusGained,BufEnter * checktime
" Reload specific filetype
autocmd BufEnter *.log checktime
保存時のメッセージ
.vimrc
" Warn before you leave
autocmd BufLeave,FocusLost * if &modified | echo "File is not saved" | endif
カーソル位置を復元
.vimrc
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal! g`\"" |
\ endif
行末の空白を削除
.vimrc
" Remove extra spaces at the end of the line
autocmd BufWritePre * :%s/\s\+$//e
-
BufWritePre
: ファイルを保存する直前 -
*
: すべてのファイルに適用-
:s/foo/bar/g
: 現在の行にある すべて(g) の foo を bar に置換 -
:%s/foo/bar/g
: 現在のファイル(%) のすべて(g) の foo を bar に置換
-
-
:[範囲]s/検索パターン/置換文字列/フラグ
-
[範囲]
:%
(=全バッファ)を指定 - 検索パターン:
\s\+$
=\s\+$
:\s
(空白)、\+
(1つ以上)、$
行末 - 置換文字列:
なし
=削除 - フラグ:
e
: エラーを抑制
-
フラグ | 動作 |
---|---|
g |
すべて置換(デフォルトは最初の1つだけ) |
c |
置換前に確認(y で置換、n でスキップ) |
i |
大文字・小文字を無視して検索 |
I |
大文字・小文字を区別して検索 |
e |
エラーを無視 |
ヘルプウィンドウを閉じる
.vimrc
" Close help window with q
autocmd FileType help,qf,man nnoremap <buffer> q :close<CR>
- helpやquickfixのウィンドウはデフォルトで
:q
や<C-w> q
で閉じることができる -
q
で閉じられるようにしておくと便利 - ただしすべてもモードでは設定したくないので
autocmd
でファイル指定(バッファーの種類)を指定する
ステータスライン
.vimrc
function! GetMode()
let l:mode = mode()
highlight StatusLine ctermfg=Grey ctermbg=Black
if l:mode ==# "n"
highlight StatusLine ctermfg=Red ctermbg=Black
return "NORMAL"
elseif l:mode ==# "i"
highlight StatusLine ctermfg=Green ctermbg=Black
return "INSERT"
elseif l:mode ==# "v"
highlight StatusLine ctermfg=DarkMagenta ctermbg=Black
return "VISUAL"
elseif l:mode ==# "V"
highlight StatusLine ctermfg=DarkMagenta ctermbg=Black
return "V-LINE"
elseif l:mode ==# "\<C-v>"
highlight StatusLine ctermfg=DarkMagenta ctermbg=Black
return "V-BLOCK"
elseif l:mode ==# "R"
return "REPLACE"
elseif l:mode ==# "c"
return "COMMAND"
elseif l:mode ==# "t"
return "TERMINAL"
else
return "UNKNOWN"
endif
endfunction
set showmode " Show status line
set laststatus=2 " Always show status line
set showcmd " Show command at status line
set statusline=%#StatusLine#\ [%{GetMode()}]\ %F%m\ \(%l,%c\)[%p%%\ %LL]%<%=%r%h%w%y[%{&fileencoding}][%{&fileformat}]%=[b=%n][t=%{&tabstop}][i=%{&shiftwidth}]
- モードごとに表示名と色を変更できる
- デフォルトのモード名は
n/i/v/V/c
のように省略形
モードと色の設定
-
GetMode()
関数では次のように色を設定している - モードごとに色を変更できるようにしてある
- また、万が一、モードを取得できない場合には
UNKNOWN
と表示されるようにしてある
モード | 表示名 | 色 |
---|---|---|
n |
NORMAL |
Red (編集NGの意味) |
i |
INSERT |
Green (編集OKの意味) |
v |
VISUAL |
DarkMagenta |
V |
V-LINE |
DarkMagenta |
V-BLOCK |
DarkMagenta |
|
r |
REPLACE |
Yellow |
c |
COMMAND |
Cyan |
t |
TERMINAL |
Blue |
else | UNKNOWN |
ローカル変数と比較演算子
-
l:mode
-
l:
はローカル変数であることを表すprefix -
mode()
の戻り値をl:mode
に格納している
-
-
==#
- 大文字と小文字を区別する比較演算子
演算子 | 大文字・小文字の区別 |
---|---|
== |
区別しない |
==# |
区別する |
==? |
区別しない(== と同じ) |