Apagar mas não cortar uma linha no Vim

6

Isso não é duplicado da linha de exclusão no vi , está fazendo uma pergunta diferente. Eu gostaria de excluir uma linha sem cortá-la (colocando-a na área de transferência).

Eu gostaria de copiar parte da linha, excluir uma linha e colar apenas essa parte da linha em outro lugar. Usando v3w , dd e, em seguida, p , cola toda a linha.

    
por Dread Boy 24.10.2018 / 07:44

2 respostas

8

Você está procurando o registro de buraco negro ( :help quote_ ). Se você prefixar "_ em um comando delete, o conteúdo simplesmente desaparecerá. Então, para apagar e manter as próximas três palavras, e então se livrar da linha inteira, você usaria d3w"_dd .

Mapeamento avançado

Esse caso de uso de manter uma parte da linha enquanto remove a linha completa é comum; Eu escrevi um conjunto de mapeamentos para isso:

"["x]dDD            Delete the characters under the cursor until the end
"                   of the line and [count]-1 more lines [into register x],
"                   and delete the remainder of the line (i.e. the
"                   characters before the cursor) and possibly following
"                   empty line(s) without affecting a register.
"["x]dD{motion}     Delete text that {motion} moves over [into register x]
"                   and delete the remainder of the line(s) and possibly
"                   following empty line(s) without affecting a register.
"{Visual}["x],dD    Delete the highlighted text [into register x] and delete
"                   the remainder of the selected line(s) and possibly
"                   following empty line(s) without affecting a register.
function! s:DeleteCurrentAndFollowingEmptyLines()
    let l:currentLnum = line('.')
    let l:cnt = 1
    while l:currentLnum + l:cnt < line('$') && getline(l:currentLnum + l:cnt) =~# '^\s*$'
        let l:cnt += 1
    endwhile

    return '"_' . l:cnt . 'dd'
endfunction
nnoremap <expr> <SID>(DeleteCurrentAndFollowingEmptyLines) <SID>DeleteCurrentAndFollowingEmptyLines()
nnoremap <script> dDD D<SID>(DeleteCurrentAndFollowingEmptyLines)
xnoremap <script> ,dD d<SID>(DeleteCurrentAndFollowingEmptyLines)
function! s:DeleteCurrentAndFollowingEmptyLinesOperatorExpression()
    set opfunc=DeleteCurrentAndFollowingEmptyLinesOperator
    let l:keys = 'g@'

    if ! &l:modifiable || &l:readonly
        " Probe for "Cannot make changes" error and readonly warning via a no-op
        " dummy modification.
        " In the case of a nomodifiable buffer, Vim will abort the normal mode
        " command chain, discard the g@, and thus not invoke the operatorfunc.
        let l:keys = ":call setline('.', getline('.'))\<CR>" . l:keys
    endif

    return l:keys
endfunction
function! DeleteCurrentAndFollowingEmptyLinesOperator( type )
    try
        " Note: Need to use an "inclusive" selection to make '] include the last
        " moved-over character.
        let l:save_selection = &selection
        set selection=inclusive

        execute 'silent normal! g'[' . (a:type ==# 'line' ? 'V' : 'v') . 'g']"' . v:register . 'y'

        execute 'normal!' s:DeleteCurrentAndFollowingEmptyLines()
    finally
        if exists('l:save_selection')
            let &selection = l:save_selection
        endif
    endtry
endfunction
nnoremap <expr> dD <SID>DeleteCurrentAndFollowingEmptyLinesOperatorExpression()
    
por 24.10.2018 / 10:04
2

você pode copiar a parte que você quer usar no buffer nomeado e colar a partir daí, por exemplo:

"ay3w

isto arrancará 3 palavras no buffer nomeado a e

"ap

colaria o buffer nomeado mais tarde; Você também pode deletar 3 palavras e depois apagar todas as linhas e depois colar com

"2p

isso colaria o segundo da última exclusão do buffer de exclusão; também seguindo sugestões de comentários, já que esta é uma pergunta marcada com VIM - existe uma solução VIM nativa para isso (não funciona no Vi):

y3w then in new place "0p

O VIM tem recurso nativo para manter o último yank no registro 0.

    
por 24.10.2018 / 07:54

Tags