4

Vimでこのマッピングの反対を行う方法を誰か教えてください:

nnoremap <leader>iw :let _s=@/<Bar>:let _s2=line(".")<Bar>:%s/^\s*/&&/ge<Bar>:let @/=_s<Bar>:nohl<Bar>exe ':'._s2<CR>

明確化として: このマッピング&& は、各行の先頭にある空白文字の数 (部分) を 2 倍にします。最初の通常の文字の前の空白のみが影響を受けます。_s 現在の検索文字列はそのまま保持されます (変数を介して)。カーソル位置は、この変換後に (_s2 変数を介して) 復元されます。

というわけで、基本的には、これを次々と実行すると元に戻すようなマッピングを探しています。

この新しい操作を最初の通常の文字の前の空白でのみ機能するように制限する方法を理解するのに苦労しています。

4

2 に答える 2

6

次の代替コマンドは、先頭の空白を 2 倍にする対応するコマンドの効果を逆にします。

:%s/^\(\s*\)\1/\1/

このコマンド用に構築されるマッピングは、質問で使用されているものと同じパターンに従う必要があります (もちろん、実行する置換を除きます)。定義の繰り返しを減らすために、状態を維持するコードを小さな関数に分けることができます。

nnoremap <silent> <leader>>    :call PinnedCursorDo('%s/^\s*/&&/')<cr>
nnoremap <silent> <leader><lt> :call PinnedCursorDo('%s/^\(\s*\)\1/\1/')<cr>

function! PinnedCursorDo(cmd)
    let [s, c] = [@/, getpos('.')]
    exe a:cmd
    let @/ = s
    call setpos('.', c)
endfunction
于 2012-02-03T06:48:57.210 に答える
2

元の置換はこれです(読みやすく/するために区切り記号をに置き換えました#):

%s#^\s*#&&#

そして、これが私の提案した逆置換です(深呼吸してください...):

%s#^\s*#\=matchstr(submatch(0),'^.\{'.string(float2nr(len(submatch(0))/2)).'\}')#

一致した文字列 ( submatch(0)) にn空白文字が含まれているとします。私がやっていることは、この数の半分 ( n/2= string(float2nr(len(submatch(0))/2))) を計算し、マッチからその数の文字を抽出することです (本質的にmatchstr(n/2))。これにより、開始時の空白スペース (スペースとタブが混在している可能性があります) の正確に半分が確保されます。

空白にスペースのみまたはタブのみが含まれることがわかっている場合は、次のように多少簡略化できます。

%s#^\s*#\=repeat(" ",indent(".")/2)#

別の注意として、マップを再構成して読みやすくし、変更と保守を容易にすることをお勧めします。私のアプローチは、2 つの関数を定義することです。

function! DoubleWS()
    let pos = getpos('.')
    let reg = getreg('@')
    exe '%s/^\s*/&&/e'
    call setreg('@',reg)
    call setpos('.',pos)
endfunction

function! HalfWS()
    let pos = getpos('.')
    let reg = getreg('@')
    exe '%s#^\s*#\=matchstr(submatch(0),"^.\\{".string(float2nr(len(submatch(0))/2))."\}")#e'
    call setreg('@',reg)
    call setpos('.',pos)
endfunction

get/set pos/reg関数は、カーソルの位置とレジスタを維持するためのより堅牢な方法であることに注意してください。その後、必要に応じてこれらの関数をマップできます。

nnoremap <silent> <leader>iw :call DoubleWS()<CR>
nnoremap <silent> <leader>rw :call HalfWS()<CR>

それが役立つことを願っています!

于 2012-02-02T20:35:15.033 に答える