Pergunta

Alguém sabe de uma maneira de colar sobre uma área visualmente selecionada sem ter a seleção colocada no registo padrão?

Eu sei que posso resolver o problema sempre colando a partir de um registo explícito. Mas é uma dor no pescoço para digitar " x p em vez de apenas p

Foi útil?

Solução

"{register}p não vai funcionar como você descreve. Ele irá substituir a seleção com o conteúdo do registo. Você terá, em vez de fazer algo como:

" I haven't found how to hide this function (yet)
function! RestoreRegister()
  let @" = s:restore_reg
  return ''
endfunction

function! s:Repl()
    let s:restore_reg = @"
    return "p@=RestoreRegister()\<cr>"
endfunction

" NB: this supports "rp that replaces the selection by the contents of @r
vnoremap <silent> <expr> p <sid>Repl()

O que deve ser muito bem contanto que você não usar um plugin que tem uma VMAP não nore para p, e que espera um registo para ser substituído.

Este código está disponível como um script . Ingo Karkat também definiu um plug-in resolver o mesmo problema.

Outras dicas

Eu não gosto do comportamento vim padrão de copiar todo o texto eliminado com d, D, c, ou C no registo padrão.

Eu comecei em torno dele por mapeamento d para "_d, c para "_c, e assim por diante.

Do meu .vimrc:

"These are to cancel the default behavior of d, D, c, C
"  to put the text they delete in the default register.
"  Note that this means e.g. "ad won't copy the text into
"  register a anymore.  You have to explicitly yank it.
nnoremap d "_d
vnoremap d "_d
nnoremap D "_D
vnoremap D "_D
nnoremap c "_c
vnoremap c "_c
nnoremap C "_C
vnoremap C "_C

Use o seguinte:

xnoremap p pgvy

isso irá selecionar novamente e re-arrancar qualquer texto que é colado no modo visual.

Editar: para que isso funcione com "xp você pode fazer:

xnoremap p pgv"@=v:register.'y'<cr>

expande v:register para o último nome registo utilizado em um comando modo normal.

Em seu .vimrc

xnoremap p "_dP

Eu encontrei este a partir de uma resposta em um segmento semelhante, mas a fonte original http: // vim. wikia.com/wiki/Replace_a_word_with_yanked_text. Ele menciona algumas desvantagens, no entanto, ele funciona bem para mim.

A solução de Luc Hermitte funciona como um encanto. Eu estava usando-o para cerca de uma semana ou assim. Então eu descobri uma solução de Steve Vimrc Losh que funciona muito bem se YankRing faz parte do seu plugin lineup / pacote:

function! YRRunAfterMaps()                                                                                                      
    " From Steve Losh, Preserve the yank post selection/put.    
    vnoremap p :<c-u>YRPaste 'p', 'v'<cr>gv:YRYankRange 'v'<cr> 
endfunction  

Tente isto em seu ~/.vimrc:

xnoremap <expr> p 'pgv"'.v:register.'y'
  • meios xnoremap que este é apenas para o modo Visual, não modos Visual + Select.

  • meios <expr> que {rhs} da configuração xnoremap {lhs} {rhs} é avaliado como uma expressão.

  • Neste caso, a nossa expressão de 'pgv"'.v:register.'y' está usando . para concatenação.

  • v:register é avaliada para o registo a ser utilizada durante a realização do mapeamento.

O resultado da "xp iria avaliar a pgv"xy, onde x é o registro.

fui ajudado por uma resposta a esta pergunta stackoverflow: Vim - mapeamento com um registo opcional prefixo em conjunto com Benoit 's resposta desta página

função de Luc funcionou bem para mim depois que eu fiz uma mudança para apoiar o fato de que eu tenho clipboard = set Sem nome:

function! RestoreRegister()
    let @" = s:restore_reg
    if &clipboard == "unnamed"
        let @* = s:restore_reg
    endif
    return ''
endfunction

Luc Hermitte do fez o truque! Muito bom. Aqui está a sua solução colocados em uma função de alternância, para que possa alternar entre o comportamento normal e sem substituir a registar colocar.

o comando, u alterna o comportamento

let s:putSwap = 1 
function TogglePutSwap()
    if s:putSwap
        vnoremap <silent> <expr> p <sid>Repl()
        let s:putSwap = 0 
        echo 'noreplace put'
    else
        vnoremap <silent> <expr> p p 
        let s:putSwap = 1 
        echo 'replace put'
    endif
    return
endfunction
noremap ,p :call TogglePutSwap()<cr>

tentar -

:set guioptions-=a
:set guioptions-=A
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top