2012-03-26 3 views
2

VIMでXML CDATAセクション全体を選択しようとしています。 XMLに慣れていない人のために、CDATAセクションは、次のようになります。VIM:CDATAセクション全体の選択をスクリプトする

<someTag><![CDATA[ 
This text is escaped in a Character Data section! 
Look, I can use <and> characters freely! 
]]></someTag> 

<anotherTag><![CDATA[More escaped text!]]></anotherTag> 

私は視覚的に選択するには、このマッピングを試してみましたが、CDATAセクション内のテキストをヤンクが、コール機能は、視覚的な選択を無効にすることが表示されます:

inoremap <F9> <Esc>:call searchpair('<!\[CDATA\[', '', ']]>', 'b')v:call searchpair('<!\[CDATA\[', '', ']]>')y 

CDATAセクション全体を選択する方法はありますか?

inoremap <F7> <Esc><C-V>aBy 

ありがとう:これは私が参考のために、Cベースの言語での方法を選択するために使用するものです。

答えて

3

この固定されたバージョンは、私のため

:inoremap <F9> <Esc>:call searchpair('<!\[CDATA\[', '', ']]>', 'b')<CR> 
     v:<C-u>call searchpair('<!\[CDATA\[', '', ']]>')<CR>v`<o 

(現実の生活の中で無改行)

トリック作品:クリアするキー

  • <C-u>を入力し、必要なため

    • <CR>をコマンドラインの範囲
    • v`視覚的な選択の終わりに

    カーソルを移動するために視覚的な選択

  • oの先頭に再選択するために、私は私はあなたが持っていると仮定しています、これは挿入モードのマッピングだろうと驚いていますノーマルモードのマッピングも。中

    編集更新:ところで

    、おそらくあなたも '適切な' テキストオブジェクトのセマンティクスのためoperator pendingモードのマッピングに興味があると思いますコメントへの返信:

    次のように表示されます検索パターンに\zs\zeの詐欺行為)。 1つの位置をバックトラックすることができます(マッピングの最後に<BS>を追加します)。また、これまでのところ、タイプマッピングがより魅力的になるように思われました(operator-pending)。あなたが作っているときにテキストが、それはファイルをラップアラウンドしないことが重要だオブジェクトだけでなく

  • +0

    ありがとう、これは私が必要とする方法の99%です!私は ''文字の必要性を認識しませんでした。しかし、このマッピングは先頭の '<![CDATA ['テキストと末尾の ']'を選択します。適切な場所に '8l'と' 2h'を挿入することは、CDATA区切り文字がそれぞれの行にある場合は機能しません。これらの文字の選択を防止する方法はありますか? – dotancohen

    +1

    @dotancohen更新の回答 – sehe

    +0

    ありがとうございます。 '['と ']'を(まだ複数行と単一行のCDATAセクションでは違っています)捕捉しています。これは選択されたテキストを 'x 'で見ることができます。私は演算子を保留中の型マッピングについて今読んでいますが、これまで聞いたことはありません。ありがとう。 – dotancohen

    1

    検索パターン内で明示的な魔法レベル(例えば\V)を適用することもできます。:

    :inoremap <F9> <Esc>:call searchpair('<!\[CDATA\[\zs', '', '\ze]]>', 'b')<CR> 
        v:<C-u>call searchpair('<!\[CDATA\[\zs', '', '\ze]]>')<CR>v`<o 
    

    PS。

    :call searchpair('<!\[CDATA\[', '', ']]>', 'bW')|call searchpair('<!\[CDATA\[', '', ']]>', 'sW')|norm v''o 
    

    's'フラグを使用すると、「いい」マークが設定されます。

    'W'フラグを使用すると、EOFラッピングが行われないことが保証されます。これは重要です。

    また、挿入モードマッピングは一般に<C-O>から恩恵を受けますが、この場合はそれほど多くありません。それでも、慣れるのはいい習慣です。だから:

    :inoremap <F9> <C-O>:<C-U>call searchpair('<!\[CDATA\[', '', ']]>', 'bW')|call searchpair('<!\[CDATA\[', '', ']]>', 'sW')|norm v''o 
    
    +0

    ラッピングフラッグについての良い点 – sehe

    +0

    ありがとうございます。 seseのコードと同様に、このマッピングは '<![CDATA ['と ']]>'から '['と ']'文字をキャッチします。私はそれらの文字を確実に取り除くことができるかどうか確認するためにそれを試しています。 'h'と' l'は単にカーソルを動かすことができないので、マルチラインCDATAセクションは問題です。 – dotancohen

    関連する問題