Depois de copiar uma seleção visual para o teclado, retorne ao local original

18

Meu cursor está no meio de um parágrafo quando decido de repente que preciso copiar esse parágrafo:

começar

Então, digito vippara selecionar o parágrafo visualmente:

selecionado

Agora, clico cmd+Cem copiar para a área de transferência (isso pode variar no seu sistema, mas não deve ser relevante para a pergunta central da minha postagem), o que deixa meu cursor no início do parágrafo:

final

em vez da posição desejada, que era onde estava quando comecei.

Observe que o mesmo problema ocorre ao puxar a seleção não visualmente yip.

Eu gostaria que o comportamento padrão fosse "retornar à posição original do cursor" depois de executar ações de seleção / cópia como esta. Existe uma configuração que torne isso possível?

Jonah
fonte
11
Sim, também acho isso irritante. Eu só tendem a marcas de uso para esse fim: mm "+yap `m(Note que "+yarrancos para a área de transferência do sistema)
fruglemonkey
3
Acho muito útil colocar o cursor no início ou no final da zona arrancada. Afinal, o que posso fazer agora com o texto arrancado e o cursor dentro dele? Não faz muito sentido colocar / colar agora. Mas, se eu quiser fazer isso mais tarde, significa que eu também poderia puxar mais tarde ... talvez o que você precisa agora seja apenas uma marca.
VanLaser

Respostas:

14

Uma solução possível é usar saltos:

Antes de puxar ou selecionar visualmente, você pode definir um novo salto que poderá acessar depois que o cursor se mover. Para fazer isso, use m`.

Depois que o cursor foi movido por causa do uso dos puxões ctrlopara voltar à lista de saltos. Você também pode ver a lista dos saltos disponíveis :jumpse navegar nessa lista com ctrloectrli

Para resumir seu fluxo de trabalho, seria:

  • m`
  • yip
  • ctrlo

Como o uso de m` define uma marca, você pode pular para ela com, em ``vez de ctrlo.

Você pode ler :h mark-motionse :h :jumpsobter mais informações.

statox
fonte
Eu gosto disso. Existe uma maneira de fazer com que aspas simples se comportem como backtick em geral, ao pular? aspas simples é mais fácil de tipo e, normalmente, eu quero saltar para a posição da coluna correta, bem como a linha certa ...
Jonah
1
@ Jonah, eu mapeio <leader>'de ser `, o que funciona muito bem para mim. (Eu uso <space>como meu líder.)
Numeri diz Restabelecer Monica
@Jonah: Como Numeri disse que um mapeamento pode ser uma boa solução, caso contrário, se você quiser se livrar do backtick, pode dar uma olhada :h 'langmap'. Não estou dizendo que é a solução ideal, mas talvez possa ser interessante para você.
statox
@Johah, eu realmente trocar o apóstrofo e volta carrapato usando noremap ' ` noremap ` '... Esta é, na minha vimrc e funciona muito bem
Niko Bellic
10

Você pode evitar mover o cursor com:

:'{,'}y

Ver :help range, :help mark-motionse :help :y.

romainl
fonte
1
É bom saber, mas é isso que você realmente faz? Parece digitando os 8 keystrakes, com dois suportes, torna isso mais difícil do que as soluções da marca
Jonah
É o que eu faria se estivesse na sua posição. Mas eu não tenho nenhum problema com o comportamento que você descreve, então eu realmente não faço isso.
Romainl 4/16
2
@Jonah Você ainda tem a opção de criar um mapeamento. Algo como :nmap <key> :'{,'}y<CR>deve fazer o trabalho.
statox
10

Meu cursor está no meio de um parágrafo

Se você acabou de editá-lo, a solução mais simples é digitar o g ;que posicionará o cursor na última posição de edição.

E se você não tiver editado o parágrafo, poderá fazer uma operação simples de substituição com o mesmo caractere em que você está (por exemplo, você está hdigitando rh) para acionar um "evento" de edição sem realmente editar nada.

Al.G.
fonte
2
+1: eu sempre usei '., mas pode ser muito útil navegar entre as últimas alterações com g;e g,.
MMontu 03/03
2
Existe uma versão g;que leva você para a posição correta da coluna também?
Jonah
@ Jonah esse é o comportamento por padrão. Não está funcionando para você? Sempre me leva à posição correta da coluna e linha.
Al.G.
4

O plug-in vim-easyclip possui uma configuração para isso:

g:EasyClipPreserveCursorPositionAfterYank- Padrão 0 (ou seja, desativado). O comportamento padrão do Vim é posicionar o cursor no início do texto arrancado, o que é consistente com outros movimentos. No entanto, se você preferir que a posição do cursor permaneça inalterada ao executar puxões, ative esta opção.

É um pouco demais para eu instalar um plugin inteiro apenas para esse pequeno recurso, então prefiro usar marcas conforme meu comentário.

fruglemonkey
fonte
0

Estendendo a resposta de Al.G., podemos ir para o local necessário sem editar. Solução é gi. Chegamos à mesma posição em que estávamos no último modo de inserção anterior.

  • Você está no meio do parágrafo.
  • mude para o modo de inserção.
  • mude para o modo normal.
  • pressione vip.
  • pressione gi.
  • mude para o modo normal. ( ginos deixará inserir o modo)

Se queremos ir para o início ou final do texto destacado.

 :help v_o 

Ao puxar o texto realçado, você também retornará ao modo normal e poderá ou não manter a posição original do cursor.

  1. Se você começar a realçar da posição superior para a inferior do cursor (do número da coluna da linha inferior para o número da coluna da linha superior), manterá a posição original do cursor pressionando y
  2. O cursor permanecerá na posição atual se o realce começar da posição mais baixa para a mais alta do cursor.

Retornando ao local original após puxar:
gv para obter o destaque anterior.

Agora você pode alternar entre o local original e o atual no modo visual com a tecla
oou O.

O número da linha e da coluna da linha de status ajudará a saber a posição exata do cursor.
Documentação:

:help visual-change
vusan
fonte
Isso não funciona vipquando o cursor inicia no meio de um parágrafo.
Antony
Ah, sim, eu não percebi, pois agora vou editar minha resposta em vez de excluí-la.
vusan
@Antony Agora também funciona para vipverificar minha edição.
vusan