2017-12-12 5 views
0

私はlexics(例えば、自動的に閉じ括弧/引用符、ファイルタイプ固有のルールなど)を強化するためのプラグインを書いていた文字を貼り付けると、いくつかのものは私のために予期しない動作があります。プラグインのルールはこの1つのようになります(:ヘルプtextlock)私はキーが押されたものを検出するために、InsertCharPreイベントに耳を傾けておりますので強制feedkeysはすぐ

{"key": "'", "pattern": '...', "keys": "'\<Left>"} 

、いくつかの制限が直接例えば、setlineを使用して編集バッファにあり。ですから、v:charを変更するか、feedkeysの代わりに電話する必要があります。 v:charの問題は、プラグインで頻繁に使用される "\"、 "\"などの特殊キー(ただし、\が正しく処理されているように見える)のようなエスケープシーケンスを挿入することができないことです。だから私の唯一のオプションはフィードキーですが、もしkeykeys(上記参照)にあれば、vimは再帰を開始します。私は<C-v>の挿入モードのマッピングについて知っていますが、新しいルールを追加するためのキーがもっと複​​雑になることがあります。他のオプションがない場合は、set pasteオプションを使用することをお勧めしますが、件名には問題があることが示されています。

... 
set paste 

call feedkeys("'\<Left>") 

set nopaste 
... 

関数の全身が最初に実行され、pasteが既にnopasteあるときに文字が瞬間バッファに挿入されると思われます。 feedkeysのさらなる読書は成功しなかった(私は異なるモードを試みた)。

function! s:Foo() 
    startinsert 

    call feedkeys("ff") 

    stopinsert 
endfunction 

nnoremap <silent><CR> :call <SID>Foo()<CR> 

バッファを入力しますが、あなたはstopinsertコマンドをコメントする場合は、すべてが期待どおりになっ押した後、任意のテキストを含めるべきではありません:あなたは私が何を言っているか確認するために、この単純なコードを試すことができます。

Ps:わかりましたleximaプラグインですが、使用したくないです。私はleximaのソースコードを探索し、問題を解決しようとしましたが、私も:)使用したくないinoremap <expr>あります。

答えて

1

feedkeys()は、先読みバッファにのキーを挿入することについてです。このバッファからのキーのみを消費している現在のコマンド/機能は終了しました(または明示的に、例えばgetchar()を経由して、キーを読めば)。これは、キーを直ちに処理するという苦労を説明しています。その機能はそれのためのものではありません:-)すぐにキーを送信するには、:normalを使用します。はい、それはテキストロックでは動作しません。

あなたの問題に基づいて、私は(すなわちキーを再マッピングしていない)nモードでfeedkeys()を使用して動作するはずだと思います。キーはユーザーマッピングの影響を受けませんので、エスケープする必要のある正確な(組み込みの)キーがわかります。あなたが本当にあなたのキーをブレースする必要があれば、 'paste'を変更し、あなたが同様にfeedkeys()内のトグルコマンドを置く必要があるだろう:

:call feedkeys(":set paste\<CR>\<Left>:set nopaste\<CR>") 
+0

はい、これは動作します。しかし、挿入モードで動作するプラグイン以降があるはず '\ \ 'や '\ = SomeFunction()' \設定ペースト。私にとっては、カーソルが1文字左へ移動する挿入モードを残さないため、最後の方が優れています。また、 ':set paste'を' feedkeys'関数に移動する必要はありませんので、私の最終コードは 'set paste' ' let output = printf( "%s \ = lexics#setNoPaste()\ "、rule.keys)' 'call feedys(出力、" n ") – Evgeniy

+0

コードはすでに動作していますが、' v:char'変数を使っていくつかのトリックがあれば良いでしょう。あなたはいくつか知っていますか?私は前にそれを言いましたが、パーサーはこれを台無しにしました。 'v:char'は' \ 'キーを含むことができます(改行が正しく挿入されていることを意味します)。 – Evgeniy

関連する問題