Vimでインサートモードに入ったときにEmacsキーバインドでカーソル移動ができるようにするための.vimrcの設定を記す。
この.vimrcは、本当に最低限のカーソル移動ができるようにするためのものである。これ以上Emacsに近づけると、EmacsユーザがEmacs使えよって言ってきて面倒な宗教戦争談話に巻き込まれるので絶対にやめておこう!絶対にだ。
この.vimrcでできることは以下の通り:
キーバインド | 動作 |
---|---|
Ctrl-p | カーソルを上の行へ移動 |
Ctrl-n | カーソルを下の行へ移動 |
Ctrl-b | カーソルを左の行へ移動 |
Ctrl-f | カーソルを右の行へ移動 |
Ctrl-a | カーソルを行の先頭へ移動 |
Ctrl-e | カーソルを行の末尾へ移動 |
Ctrl-d | カーソルの右の文字を削除 |
Ctrl-h | カーソルを左の文字を削除 |
Ctrl-k | 現在のカーソル位置から行末尾までを切り取り |
.vimrc
" insert mode
imap <C-p> <Up>
imap <C-n> <Down>
imap <C-b> <Left>
imap <C-f> <Right>
imap <C-a> <C-o>:call <SID>home()<CR>
imap <C-e> <End>
imap <C-d> <Del>
imap <C-h> <BS>
imap <C-k> <C-r>=<SID>kill()<CR>
function! s:home()
let start_column = col('.')
normal! ^
if col('.') == start_column
¦ normal! 0
endif
return ''
endfunction
function! s:kill()
let [text_before, text_after] = s:split_line()
if len(text_after) == 0
¦ normal! J
else
¦ call setline(line('.'), text_before)
endif
return ''
endfunction
function! s:split_line()
let line_text = getline(line('.'))
let text_after = line_text[col('.')-1 :]
let text_before = (col('.') > 1) ? line_text[: col('.')-2] : ''
return [text_before, text_after]
endfunction
以下の通り、Plugin化した。
vim-emacs-bindings