:e ~/path/to/filename
した時に以下のエラーになって、:e! ~/path/to/filename
でやり直すことになる場合が時々あります。
E37: No write since last change (add ! to override)
- 再度
~/path/to/filename
を入力するのは面倒。 - 上カーソルキーでヒストリを戻ってコマンドラインを編集
(
:<Up><Home><Left>!
。もしくは:cnoremap <C-A> <Home>
等を設定しておいて:<C-P><C-A><C-F>!
) :e! !$
(bashやzshでの操作と同様)
2.の操作をしていたのですが、どうもまどろっこしい印象なので、
3.の操作でやりたい、と思ったので少し調べてみました。
(実は2.の方が打鍵数は少ないですが)
以下の記事が見つかりました。
Is there a vim equivalent to bash's '!$'? - Stack Overflow
.vimrc
cnoreabbr <expr>!$ getcmdtype()==':' ? split(@:,'\s\+')[-1] : '!$'
cnoreabbr <expr>!* getcmdtype()==':' ? join(split(@:,'\s\+')[1:],' ') : '!*'
cnoreabbr <expr>!! getcmdtype()==':' ? @: : '!!'
cnoreabbr <expr>!-2 getcmdtype()==':' ? histget(':',-2) : '!-2'
stackoverflowの記事でも指摘されていますが、
スペースで分割しているだけなので、
""等でくくられていてもスペースが含まれていると分割されます。
(vimlparserを使ってきちんと解析することはできそうです。)
ちなみに、シェルのヒストリ展開で個人的によく使うのは以下なのですが、
シェルに合わせた操作をVimでできるようにするよりも、Vimに合わせて、
上カーソルキーでヒストリをたどって編集するか、
さらに複雑な変更をしたい場合は、q:
でコマンドラインウィンドウを
使うことでいいかと思っています。
CTRL-R
によるヒストリ検索!v
等で再実行^str1^str2
による置換実行(たまに)
その他、Vimのコマンドラインモードでのファイル名補完が、
シェルの補完と違うとわずらわしいので、Vim側で以下の設定をしています。
.vimrc
setwildmode=longest:full
setwildmenu