web-dev-qa-db-ja.com

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

Vimは、私がプログラミングする際に私が好むテキストエディターであり、したがって、特に厄介な問題に遭遇します。

多くの場合、バッファをすぐに保存して他のさまざまなタスクを続行する必要があるとき、私は典型的な

:w

しかし、私は-時間の50%以上のように見える-常にそれを大文字にすることに成功しています:w。当然、Wは無効なコマンドであるため、vimは私に怒鳴ります

E492: Not an editor command: W

私の質問は、どうすればvimのエイリアスコロンコマンドができるのかということです。特に、Wwにエイリアスする方法を例示できますか。

map keys特定のcommandsへのプロセスを認識しています。残念ながら、それは私が探しているものではありません。

141
Sean

完了をそのままにするには、次を使用してみてください

cnoreabbrev W w

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

更新

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

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よりも安全です。

117
ZyX

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

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

トリックを行います。

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

91
Sean

; への鍵 :はより良い解決策であり、他のコマンドを入力する際の生産性を高めます。

nnoremap ; :
vnoremap ; :
19
fent

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

このために、次の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('[email protected]',  '[email protected]\v')
call Cabbrev('%[email protected]', '%[email protected]\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("'<,'>[email protected]", "'<,'>[email protected]\v")
call Cabbrev("'<,'>s!", "'<,'>s!\v")
9
Andy Terra

ファンクションキー(F1..F12)のいずれかを:wにマップしたい場合がありますか?次に、これを.vimrcに追加します。

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

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

6
Benoit

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

cabbrev t tabnew
6
Sandip

最も安全で簡単なのは、 cmdalias.vim などのプラグインまたは最近の更新 vim-alias を考慮したプラグインです

  • :sil(ent)(!):redi(r)などの先行する空白または修飾子、
  • 現在の視覚的な選択に対する'<,'>などの範囲修飾子、
  • 引用符などの特殊文字をエスケープする
  • 選択したエイリアスが有効なコマンドラインの略語かどうかを確認してください。
3
Enno