0

コード/テキストを他のテキスト行で囲むことがよくあります。具体的な例として、テキストがあるとします。

this is 
some text

次に、それを(行を強調表示した後)に変換できるマクロがあります

if false then
    this is
    some text
end;

これを行うために使用するマクロは次のとおりです。

nmap <space>i ccif false then<CR><c-r>"end;<esc>
vmap <space>i cif false then<CR><c-r>"end;<esc>

ただし、マクロを作成して周囲のテキストを削除できるようにしたいと考えています。つまり、カーソルが「if false then」と「end;」の行で囲まれている場合です。次に、それらの行を削除する必要があります。

そのようなマクロを作成する方法はありますか?

私は Surround.vim を見てきましたが、そのパッケージを使用してそれを行う方法を見つけていないことに注意してください。

4

2 に答える 2

2

次のダーティ関数を試して、問題の解決に役立つかどうかを確認してください。カーソル位置から、それらの文字列を前方および後方に検索します。両方が一致する場合にのみ削除します。

function! RemoveSurrondingIfCondition()
    let s:current_line = line('.')
    "" Look backwards for the key string.
    let s:beginif = search( '\v^if\s+false\s+then\s*$', 'bWn' )
    if s:beginif == 0 || s:current_line <= s:beginif
        return
    endif
    "" Set a mark where the _if_ begins
    execute s:beginif 'mark b'
    "" Look forward for the end of the _if_
    let s:endif = search( '\v^end;\s*$', 'Wn' )
    if s:endif == 0 || s:endif <= s:beginif || s:current_line >= s:endif
        return
    endif
    "" Delete both end points if searches succeed.
    execute s:endif . 'delete'
    'b delete
endfunction

noremap <space>d :call RemoveSurrondingIfCondition()<CR>
于 2013-07-08T21:44:07.680 に答える
1

これを 1 行で行う回答をまとめました。あなたも私も、「正規表現」しか綴れないことを知っています。とにかく、これは と の最も近いセットで機能if false thenend;ます。そのようなペアの「範囲」にいない場合、おそらく奇妙な方法で、最も近い 2 つが削除されます! これを「未定義の動作」と自由に呼んでください。

:?^\s*if\ false\ then?,/^\s*end;/ g/^\s*if\ false\ then\|^\s*end;/d

そこを掘り下げて実際の文字列を見つけ、実際に自分に合ったものに変更できます。そして、正規表現を使いこなす気があるなら、たとえば、if false thens とif true thens の両方、本当にif <something> thens など、あらゆる種類の楽しいものに一致させることができます。

これがどのように機能するかについて、あまり大雑把な (存在しない) 説明が必要な場合は、遠慮なく言ってください。ここでは、少なくとも私と同じくらい :g について知識があると仮定しています。

于 2013-07-08T22:07:17.447 に答える