私は多くのJSONを扱っています。JSON のブロック全体を操作したいというのは非常によくあることです。ブロック全体の選択、ブロックの削除、移動などです。キーとその値を組み合わせて操作する方法はありますか?
モックアップ:
この場合、次のようなモーションviB
は機能しません。これは、同じネスト レベル内のすべての子を選択するためです (私が望むものではありません)。完全なブロックと、カーソルが置かれているブロックのみが必要です。
私は多くのJSONを扱っています。JSON のブロック全体を操作したいというのは非常によくあることです。ブロック全体の選択、ブロックの削除、移動などです。キーとその値を組み合わせて操作する方法はありますか?
モックアップ:
この場合、次のようなモーションviB
は機能しません。これは、同じネスト レベル内のすべての子を選択するためです (私が望むものではありません)。完全なブロックと、カーソルが置かれているブロックのみが必要です。
vim-textobj-userを使用すると、textobject を定義して、必要なものを選択できます。これは、私が書いたばかりの基準に一致するブロックを選択するためのものです。
call textobj#user#plugin('textobj-syntax-is-garbage', {
\ 'regex_j': {
\ 'select': 'aj',
\ '*pattern*': '^\s*"\?\w\+"\?\s*:\s*{\_[^}]*}.*\n\?',
\ })
これは、ネストされたjsonブロックでは機能しません:(しかし、ユースケースでは機能します
aj
あなたが実行できる手段vaj、またはあなたのdaj小さな心が望むものは何でも。
説明:
^\s*"\?\w\+"\?\s*:\s*{
オプションの二重引用符を使用して、行頭からキー (単語文字) まで一致させます
\_[^}]*
閉鎖ニップル ブラケット以外のものと一致します。\_
複数行にわたる一致を意味します。
}.*\n\?
ブロックを削除した後に改行が残らないように、閉じニップルブラケットとオプションの改行を一致させます。
この正規表現は間違いなく改善される可能性があります。正規表現でネストされたブロックの選択を正しく行うことはおそらく不可能ですが、 textobj-entire を使用すると、実行する関数も指定できると思います。
Argumentativeという引数/パラメータで動作するプラグインを作成しました。Argumentative は、新しいテキスト オブジェクトi,
とa,
. >,
と を介して引数をシフトすることもできます<,
。同様のことを行うプラグインが他にもあると確信しています。