LoginSignup
15

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-10-07

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15