: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.の方が打鍵数は少ないですが)
(その他有効な場面としては、:'a,.w ~/path/to/newfile
した後、:e !$
)
以下の記事が見つかりました。
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
set wildmode=longest:full
set wildmenu