Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?

More than 5 years have passed since last update.

@deton

Vimのコマンドラインモード(:)で、シェル同様のヒストリ展開(!$)を使う

:e ~/path/to/filenameした時に以下のエラーになって、
:e! ~/path/to/filenameでやり直すことになる場合が時々あります。

E37: No write since last change (add ! to override)
  1. 再度~/path/to/filenameを入力するのは面倒。
  2. 上カーソルキーでヒストリを戻ってコマンドラインを編集 (:<Up><Home><Left>!。もしくは:cnoremap <C-A> <Home>等を設定しておいて :<C-P><C-A><C-F>!)
  3. :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
7
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
7
Help us understand the problem. What is going on with this article?