質問
私は最近 Vim をテキスト エディタとして使い始め、現在独自のカスタマイズに取り組んでいます。
キーボード マッピングはほとんど何でもできると思いますが、今のところ、私はほぼ独占的にスニペット機能の一種としてキーボード マッピングを使用しています。
たとえば、次のように入力すると、 def{TAB}
(:imap def{TAB} def ():<ESC>3ha
)、次のように展開されます。
def |(): # '|' represents the caret
これは期待どおりに機能しますが、「def」を含む単語を入力しているときに Vim が完全なコマンドを待機するのは煩わしく感じ、それを展開することに興味がありません。
- これを回避する方法、またはこの目的のためにこの機能をより効果的に使用する方法はありますか?
- これに適した他の Vim 機能はありますか?
ざっと見てみたあと、 スニペットエミュ, 、これが最良のオプションであり、最初に考えていたよりもはるかに簡単にカスタマイズできるようです。
前の例を続けるには:
:Snippet def <{}>():
定義したら、次のように入力してスニペットを展開できます。 def{TAB}
.
解決
スニペットエミュ 便利なスニペットプラグインです。
他のヒント
Snipmate - texmate のような :)http://www.vim.org/scripts/script.php?script_id=2540
snippet def
""" ${1:docstring} """
def ${2:name}:
return ${3:value}
vim の組み込み機能を使用する別の提案として (少し異なりますが):
:iabbrev def def(): #<LEFT><LEFT><LEFT><LEFT><LEFT>
これで、def の後にスペースまたはその他の単語以外の文字を入力すると、SnippetsEmu の出力として指定した内容と同じ内容に展開されます (スペースは、補完をトリガーするために入力したスペースに由来します)。
このアプローチは、:inoremap を使用したときに発生した「ラグ」問題の影響を受けず、vim に組み込まれています。この機能の詳細については、以下を参照してください。 :help abbrev
.
タブではなくスペースでトリガーすると不必要にトリガーされるのではないかと心配するかもしれませんが、一般に vim はトリガーをいつトリガーするかについて非常に賢明です。この問題は、特定のファイル タイプ (Python など) に対してのみ省略形を有効にすることでさらに軽減できます。
au filetype python :iabbrev ... etc
Snip[ets] (Manager|Emu|Mate|.vim) ももちろん完璧なソリューションですが、代替手段 (特に組み込みの場合) を知っておくとよいでしょう。
SnippetsEmu が必要なものに対して重すぎる、または野心的な場合は (私にとってはそうでした)、ファイルタイプに基づいてスニペットを管理するプラグインを作成しました。スニペットを選択するときにタブ補完も可能です。:)
ここから入手してください: スニペット.vim
インストールしたばかりです ウルトラスニップス. 。UltiSnips を選択する理由を説明した優れた記事があります。 UltiSnips を選ぶ理由
他のスニペット プラグインは使用したことがありません。私は、フル機能を備えていて、Vim のスキルをさらに身につけ、より高度な作業を実行したいと考えたときに対応できそうなものを思い切って採用することにしました。
MDCore が指摘しているように、 スニペットエミュ は、それ以上のことを行う人気の Vim スクリプトです。(キャレットを戻さずに) 展開するだけの場合は、標準の :ab[breviate]
指示。
:ab[breviate] [<expr>] {lhs} {rhs}
add abbreviation for {lhs} to {rhs}. If {lhs} already
existed it is replaced with the new {rhs}. {rhs} may
contain spaces.
See |:map-<expr>| for the optional <expr> argument.