vimでのコマンドのエイリアス


151

Vim 私がプログラムするときに私のお気に入りのテキストエディターなので、常に特に迷惑な問題に遭遇します。

頻繁に、バッファを保存して他の雑多なタスクを続ける必要があるとき、私は典型的な

:w

しかし、私は–時間の50%以上のように思えます–常にそれをうまく利用してい:wます。当然、Vim Wは無効なコマンドであるため、私に怒鳴りつけます

E492: Not an editor command: W

私の質問は、vimでコロンコマンドをエイリアスする方法です。特に、あなたはどのようにエイリアスを例示できWw

キーを特定のコマンドマップするプロセスを知っています。残念ながら、それは私が探しているものではありません。



1
回避するために:W、キーをマップして保存を実行できます。あなたはCtrl-Sキーで保存し、いくつかのプログラムに使用されている場合は、$ VIM / mswin.vimからこれらのマッピングがあります" Use CTRL-S for saving, also in Insert mode noremap <C-S> :update<CR> vnoremap <C-S> <C-C>:update<CR> inoremap <C-S> <C-O>:update<CR>
mMontu

Vi Stack交換に関する同様の質問:vi.stackexchange.com/q/2665/7244
Flimm

回答:


127

そのまま完成させるには、

cnoreabbrev W w

、それはWコマンドラインでと置き換えられますがw、単語の文字が後に続かず、前に付いていない場合に限り、で:W<CR>置き換えられますが:w<CR>、置き換えられ:Writeません。(これは、予期しないものも含めて、一致するすべてのコマンドに影響することに注意してください。たとえば、コマンド:saveas W Zはに置き換えられる:saveas w Zため、これには注意してください。)

更新

これが私がそれを書く方法です:

cnoreabbrev <expr> W ((getcmdtype() is# ':' && getcmdline() is# 'W')?('w'):('W'))

関数として:

fun! SetupCommandAlias(from, to)
  exec 'cnoreabbrev <expr> '.a:from
        \ .' ((getcmdtype() is# ":" && getcmdline() is# "'.a:from.'")'
        \ .'? ("'.a:to.'") : ("'.a:from.'"))'
endfun
call SetupCommandAlias("W","w")

これは、コマンドタイプがで:あり、コマンドがWであることを確認するので、だけより安全ですcnoreabbrev W w


2
この答えは私にとって最も安全で信頼できるものです。
Sean、

2
あなたが推奨ソリューションを使用する場合は、注意してください。両方のコマンドの下の2つは、実際のバッファの内容とVIMの設定によっては、予期しない結果を提示することができる低一つとして動作しますの::%s/W/foo/g<CR> :%s/w/foo/g<CR>
cprn

2
実際、これはWがコマンドバーの任意の場所(検索など)で置き換えられることを意味するため、s / W foo / bar / gはs / w foo / bar / gに変換されます。これは本当に煩わしくなります。包括的なソリューションについては、私の回答を参照してください。
空爆

4
絶対に; これは恐ろしい考えです。決してこれまでこれを行うべきではありません
Chris Morgan

4
:cnoreabbrev <expr> W getcmdtype()==':'&&getcmdline()=~#'^W'?'w':'W'
kev '27

97

補足検索で、誰かが私とほぼ同じ質問をしたことがわかりました。

:command <AliasName> <string of command to be aliased>

トリックを行います。

Richoが指摘しているように、ユーザーコマンドは大文字で始める必要があることに注意してください。


5
:commandの使用は良い解決策です。:cnoreabbrevはcmd1 | cmd2を認識しませんが、:commandは認識します。
Pavel Strakhov、2011

1
これを書くのにそれほど混乱しない方法:command AliasName string of command to be aliased
アレックジェイコブソン

8
これは、などのcommand引数を処理/転送しません-nargs-complete
ブルーイングされた

どう:Q!:W!
ジャック

5
置く:ただ非常にリテラルであることを:command W wして.vimrcファイル。
同型写像

20

;キーをにマッピング:する方がより良い解決策であり、他のコマンドを入力する際の生産性を高めることがわかりました。

nnoremap ; :
vnoremap ; :

これは、vimの単一の最良のヒントです。今は慣れているので、通常の行動に出くわすたびに、心を鍛え直そうとする人が数人います。
2015

これは質問に対する答えではありません。
Flimm

5
@Flimmいいえ。ただし、OPの問題は解消されます。
ダンカンXシンプソン

1
tまたはを使用する場合f、通常はを使用;して次のオカレンスに移動できます。セミコロンをコロンにマップした場合でも、逆に安全にマップできます。エイリアスループはありません。nnoremap : ;
Luc

9

最良の解決策は、コマンドバーの先頭でのみ発生する略語を処理するためのカスタム関数記述することです。

これには、次のvimrcファイルまたは他の場所を追加します。

" cabs - less stupidity                                                      {{{
fu! Single_quote(str)
  return "'" . substitute(copy(a:str), "'", "''", 'g') . "'"
endfu
fu! Cabbrev(key, value)
  exe printf('cabbrev <expr> %s (getcmdtype() == ":" && getcmdpos() <= %d) ? %s : %s',
    \ a:key, 1+len(a:key), Single_quote(a:value), Single_quote(a:key))
endfu
"}}}

 

" use this custom function for cabbrevations. This makes sure that they only
" apply in the beginning of a command. Else we might end up with stuff like
"   :%s/\vfoo/\v/\vbar/
" if we happen to move backwards in the pattern.

" For example:
call Cabbrev('W', 'w')

私がこれを見つけたソース資料からのいくつかの有用な略語

call Cabbrev('/',   '/\v')
call Cabbrev('?',   '?\v')

call Cabbrev('s/',  's/\v')
call Cabbrev('%s/', '%s/\v')

call Cabbrev('s#',  's#\v')
call Cabbrev('%s#', '%s#\v')

call Cabbrev('s@',  's@\v')
call Cabbrev('%s@', '%s@\v')

call Cabbrev('s!',  's!\v')
call Cabbrev('%s!', '%s!\v')

call Cabbrev('s%',  's%\v')
call Cabbrev('%s%', '%s%\v')

call Cabbrev("'<,'>s/", "'<,'>s/\v")
call Cabbrev("'<,'>s#", "'<,'>s#\v")
call Cabbrev("'<,'>s@", "'<,'>s@\v")
call Cabbrev("'<,'>s!", "'<,'>s!\v")

1
string()あなたと同じことをする組み込み関数がありますSingle_quote()
ZyX 2012年

6

たぶん、ファンクションキー(F1..F12)の1つを:wにマッピングしたいと思います。次に、これを.vimrcに入れます。

noremap  <f1> :w<return>
inoremap <f1> <c-o>:w<return>

(挿入モードのctrl-oは一時的に通常モードに切り替わります)。


6

gvimでtabnewコマンドのエイリアスを追加するとします。.vimrcファイルに次のコマンドを入力するだけです(ホームフォルダーにない場合は作成する)。

cabbrev t tabnew

1
これにより、次のようなコマンド:saveas t exampleが置き換えられます:saveas tabnew example
Flimm

5

最も安全で簡単なのは、cmdalias.vimや私の最近の更新vim-aliasなどのプラグインです。

  • 前の空白または:sil(ent)(!)or :redi(r)
  • '<,'>現在のビジュアル選択などの範囲修飾子
  • 引用符などの特殊文字をエスケープし、
  • 選択したエイリアスが有効なコマンドラインの省略形であるかどうかを確認してください。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.