人権真骨頂

とくがたかいことでゆうめい

Vimのコマンドライン上でEmacs風の動作をさせる

コマンドライン上で長めのコマンドを入力したときに先頭にパッと飛ぼうと思ってCtrl-Aを押しても飛べなかったのでその設定をメモ。

cnoremap <C-A> <Home>

これでCtrl-Aで先頭に飛べるようになる。デフォルトでCtrl-Eで末尾には飛べるのでちょっと謎。


追記

Ctrl-k も使いたかったのでこの設定も追記した。ちなみにカーソルから行末まで削除。

cnoremap <C-K> <C-\>e<SID>KillLine()<CR>
function! <SID>KillLine()
  call <SID>saveUndoHistory(getcmdline(), getcmdpos())
  let l:cmd = getcmdline()
  let l:rem = strpart(l:cmd, getcmdpos() - 1)
  if ('' != l:rem)
    let @c = l:rem
  endif
  let l:ret = strpart(l:cmd, 0, getcmdpos() - 1)
  call <SID>saveUndoHistory(l:ret, getcmdpos())
  return l:ret
endfunction
let s:oldcmdline = [ ]
function! <SID>saveUndoHistory(cmdline, cmdpos)
  if len(s:oldcmdline) == 0 || a:cmdline != s:oldcmdline[0][0]
    call insert(s:oldcmdline, [ a:cmdline, a:cmdpos ], 0)
  else
    let s:oldcmdline[0][1] = a:cmdpos
  endif
  if len(s:oldcmdline) > 100
   call remove(s:oldcmdline, 100)
  endif
endfunction

vim-emacscommandline VimScript書けないのでここから拝借した。このプラグインいれてもいいのだけれど、この2つで十分なので。