Vim

VimをちょっとだけEmacsキーバインドに近づけるための.vimrc

More than 1 year has passed since last update.

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