ユーザーがカスタムオペレーターを作成できるようにするプラグインに取り組んでいます。オペレーターは、移動するモーションまたはテキストオブジェクトにVimL式を適用します。
クリーンなユーザーインターフェイスを維持する
カスタムオペレーターを定義するための最もクリーンなインターフェイスは、コマンドを使用することだと思います。:MapExpress
次のようなコマンドを呼び出すコマンドを定義しました。
:MapExpress cd '/* ' . v:val . ' */'
これはcd
、Cスタイルのコメント区切りでモーションまたは選択を囲むために、ノーマルモードオペレーターとビジュアルモードマッピングを作成します。
もちろん、ここに問題があります。プラグインで定義されているコマンドを.vimrc
ファイルから呼び出すことはできません。
不十分な回避策
私は完全に満足していないいくつかの回避策を考え出しました。
ユーザーautocmd VimEnter *
がコマンドを呼び出すために使用する
これは機能しますが、多くの「精神的オーバーヘッド」が追加されます。多くのVimユーザーはどのようにautocmd
機能するかをしっかりと把握していないと思います。
ユーザーが~/.vim/after/plugin/
コマンドを呼び出すファイルを作成します
これも機能しますが、この構成の一部が独自のファイルでオフになり、簡単に失われて忘れられるという欠点があります。
コマンド定義をプラグインのautoload/
ディレクトリに移動し、ユーザーがファイルのロードをトリガーするいくつかのメソッドを呼び出して、コマンドを定義します
これは次のようになります。
call express#init()
MapExpress cd '/* ' . v:val . ' */'
少し良いですがexpress#init()
、プラグインが機能するためにメソッドが必要かどうかについて混乱を招きます。
コマンドを使用する代わりの方法
オペレーターを定義するコマンドを使用するいくつかの代替案も検討しましたが、それぞれに注意点があります。
ユーザーは関数を呼び出して演算子を定義します
これは次のようになります。
call express#operator('cd', '"/* ".v:val." */"')
これはひどいことではありませんが、引用符で囲まれた式が必要になるという欠点があります。式で引用符を使用したい場合は、煩わしいことがあります。
ユーザーが<expr>
マッピングを使用
このような:
nmap <expr> cd express#nmap('"/* ".v:val." */"')
xmap <expr> cd express#xmap('"/* ".v:val." */"')
これは同じ退屈な引用式の要件があり、変数を導入しない限り(理想的ではない)、DRYにも違反します。
さて、それで何?
ここに私のアイデアのすべてと、それらのどれも好きではない理由があります。私はうるさいですか?私が考えていないいくつかのより良い解決策はありますか?
<q-args>
実際にどのように機能するかを学びました。ありがとう
call express#initMapCommands()
?ただし、追加の引用が必要なものはすべて、非常に悪い考えです。