ペアのバランスを崩さずに自動的にペアを削除


8

私は、挿入モードでは、ことができます、ということVIML機能を書いています<BS>(ペアの開口部を通じて[{それはカーソルの後に次の文字である場合(ペアの閉塞部を削除するなど、)のような多くの自動ペアをおよびvim-autoclose)。不均衡なペアがある場合、ペアの終了部分は削除されないため、この関数は異なります。

例:

形式は<initial> => <result-after-backspace>、カーソルがの前にある場所|です。

((|)    =>   (|)

((|))   =>   (|)

(|)     =>   |

(defn   =>   (defn
  (|)          |)

どうすればペアをアンバランスにするかどうかを判断してから、最後のペアを削除できますか?

自動ペアvim-autocloseの両方をテストしました。両方のプラグインを使用すると、ペアの終了部分は常に削除されます。


序文を明確にしていただけませんか?すべてのプラグインを回避しますか、それとも、2つのプラグインに類似したプラグインだけを回避しますか?後者の場合、それら2つについてはどうですか。
トム

これにはプラグインを使いたくありません。序文を更新しました。

1
この質問を閉じるために投票しました。基本的なトピック自体は問題ないと思いますが、あなたの制限により、「今すぐコードを書いてください」という質問になっています。ここでは、この種の質問を許可したくないと思います...
Martin Tournoij、2015

1
@Carpetsmokerこの質問の文言を超えて私が見たどのプラグインでもまだ解決されていない問題です。この質問への回答が成功すると、すべての自動クローズまたは自動ペアタイプのプラグインがそのソリューションから恩恵を受けることができるのは明らかです。表現を変更して受け入れられるようにするにはどうすればよいですか。

2
@ merb、pareditプラグインはまさにあなたが望むことをします。実際にプラグインを使用せずにその機能が必要な場合は、githubでソースを調べることをお勧めします。私はそれをここでバージョンを再現しようとするよりも有益だと思います。 github.com/kovisoft/paredit
Quincy Bowers、

回答:


1

あなたの質問を正しく理解した場合、重要なのは、カーソル上の文字が一致した区切り文字であるかどうかを判断することです。

通常モードのコマンドv%"zyとを検討してくださいv%%"zy

  • カーソルが一致する区切り記号の上にある場合、最初のコマンドは、長さが少なくとも2の文字列(区切り記号、そのペア、および中央のテキスト)をにヤンクします@z。もう1つは、長さの文字列を1に、つまり区切り文字自体をにヤンクします@z
  • カーソルが一致しない区切り文字の上にある場合、最初のコマンドは長さ1の文字列(区切り文字自体)をにヤンクします@z。アボート。
  • カーソルが区切り記号上になく、行に区切り記号がある場合、2番目のコマンドは、1より大きい長さの文字列をにヤンクします@z。アボート。
  • カーソルがデリミタ上になく、行に他のデリミタがない場合、最初のコマンドは長さ1の文字列(文字自体)をにヤンクします@z。アボート。

したがって、次の結果が得られます。

ノーマルモードコマンドがv%"zy少なくとも2 の長さの文字列をヤンクし@z、ノーマルモードコマンドがv%%"zy正確に1の長さの文字列をにヤンクする場合に限り、カーソルは一致した区切り文字上にあります@z

VIMLのヒント::norm ...strlen(@z)ここに役立ちます。


これはあなたの質問に答えますか、それとも何か不足していますか?
wchargin 2015

カーソル上の文字が一致するかどうかを判断することは、正確にはキーではありません。重要なのは、特定のフォームのバランスが取れているかどうかを判断することです。フォームのバランスが取れており、次の位置にいる場合:(|)を押す<BS>と両方が削除されます。ただし、トップレベルフォームが次のようにバランスが取れていない場合(defn (|)、を押す<BS>と、通常削除されるものだけが削除され(defn |)ます。この場合、このままです。

1

結局、私はparedit.vimを実行し、これを作成するためにいくつかの関数vim-pearを引き出しました。バランスの取れた状態を維持しながら、区切り文字をペアで挿入および削除します。


クール:-)どうやって使うの?インストールするだけでデフォルトで有効になりますか?これを特定のファイルタイプに対してのみ有効/無効にすることもできますか?
Martin Tournoij、2015

デフォルトではすべてに対して有効になっています。そのようなものが必要な場合は、PRを送信してください。私はいつか自分でそれをするかもしれません。

リンクは(現在)壊れています。
リッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.