Para o remapeamento condicional, você pode usar um mapeamento de expressão ( :help map-expr
). Não sei se isso já funciona para você, mas deve começar:
:vnoremap <expr> p (getregtype() ==# 'v' && col("'>") == col('$') ? '"_dp' : '"_dP')
Isso está relacionado a uma continuação de
Em resumo, vnoremap p "_dP
é usado para colar texto visualmente selecionado sem sobrescrever o registro "*
do texto substituído. Dessa forma, as pastas subseqüentemente selecionadas visualmente são mantidas iguais.
Esse remapeamento funciona como esperado exceto quando uma seleção visual de caracteres segue para o final da linha . Estou tentando descobrir uma maneira de lidar com isso condicionalmente, de modo que:
"_dp
"_dP
Estou pensando em vnoremap p
para uma função vimscript que verifica esse caso específico, ou seja, "se a seleção visual for caractere e o cursor estiver no final da linha", e execute adequadamente.
meta - se o vimscript for a resposta, talvez eu devesse postar no StackOverflow?
Atualizar
Funciona com:
vnoremap <expr> p (getregtype() ==# 'v' && col(".") == col("$") - 1 ? '"_dp' : '"_dP')
Usar o registro de buraco negro pode ser uma solução para dois problemas: você deseja manter seus registros numerados para conter apenas texto explicitamente extraído ou você deseja poder colar o mesmo texto várias vezes.
Para o primeiro problema, usar "_d
em vez de d
é a ferramenta certa porque nada do que você excluir aparecerá em qualquer registro.
Para o segundo problema, combinar "_d
e p
ou P
inevitavelmente cria problemas devido à posição do cursor e à orientação de p
e P
.
A resposta de Ingo parece ser um compromisso perfeito.
Mas se você não se importa com o estado de seus registradores numerados, uma alternativa é usar o "0
register que sempre contém o texto mais recente e não é afetado por c
ou d
?
Teste o yank: foo
, puxado com yiw
.
Linha de teste: Lorem [i]psum dolor sit amet.
, com o cursor na i
de ipsum
.
Seleção de teste: v$
.
"_dP
Loremfoo <-- trailing whitespace and mashed text, bad
"_dp
Lorem foo <-- good
"0p
Lorem foo <-- good
Seleção de teste: vee
.
"_dP
Lorem foo sit amet. <-- good
"_dp
Lorem foosit amet. <-- bad
"0p
Lorem foo sit amet. <-- good