Existe um objeto de texto para o buffer inteiro?

28

Costumo me digitar comandos como gg"+yGou ggdGe gostaria de uma maneira mais eficiente de fazer isso sem precisar mover o cursor duas vezes. Existe algum comando que eu possa usar, por exemplo, y[movement]para copiar todo o buffer sem mover o cursor?

Random832
fonte

Respostas:

36

Como o vim usa o sinal de porcentagem para fazer referência ao buffer atual, você pode usá-lo para obter tudo rapidamente.

:%yirá puxar todo o buffer :%y+para o +registrador (e presumivelmente a área de transferência, desde que o vim tenha sido compilado com as opções apropriadas).

:%de :%d+fará o mesmo para exclusão.

Em cada um desses casos, o cursor permanece no lugar.

SnoringFrog
fonte
Uau, todo esse tempo eu estava usando mmgg"+yG`me nunca pensei nisso. Obrigado, isso está indo bem no .vimrc.
Doorknob
@Doorknob, em vez de definir e usar marcas, você pode usar apenas C-oduas vezes para voltar.
Ruslan
10

Outra solução é usar um plugin chamado vim-textobj-whole . Por padrão, esse plug-in fornece o objeto de texto aepara todo o buffer, iepara todo o buffer, exceto linhas vazias à esquerda e à direita.

Este plugin depende do vim-textobj-user do mesmo autor, o que permite que os usuários definam qualquer objeto de texto confortavelmente. Existem muitos plugins que fazem bom uso disso.

Yosh
fonte
8

Por padrão, não há objeto de texto para o arquivo inteiro, mas é possível criá-los usando omap. Nesse caso, seria algo parecido com isto:

onoremap f :<c-u>normal! mzggVG<cr>`z

Aqui está um detalhamento de como funciona:

onoremap f " make 'f' the text object name
:<c-u> " use <c-u> to prevent vim from inserting visual selection marker at the beginning of the command automatically.
normal! " use normal to make key presses ignoring any user mappings
mzggVG<cr>`z " make a marker in register z, select the entire file in visual line mode and enter the normal command, and go back to the z marker

Notas:

Ctrlupode ser usado no modo de linha de comando para excluir tudo à esquerda da posição do cursor. A razão pela qual isso é feito é porque, se você inserir a linha de comando diretamente do modo visual, ela será inserida automaticamente '<,'>na linha de comando, e não é isso que queremos. Eu também sugiro que você use algo diferente f, porque fnormalmente é usado para passar para o próximo caractere pesquisado na linha. Por exemplo, fiirá para o próximo ina linha atual.

Tópicos de ajuda relevantes:

:help omap-info
:help :normal
:help c_CTRL-U
:help v_:
EvergreenTree
fonte
Existe uma maneira de fazer isso enquanto deixa o cursor sozinho?
usar o seguinte código
@ Random832 Adicionar um ``ao final retornará o cursor para o local anterior.
precisa saber é o seguinte
Estou preocupado que isso faça com que não aplique a seleção ao comando yank. Vou experimentar alguns hoje.
usar o seguinte código
1
Eu adicionei um comando de marcador ao mapeamento, ele deve deixar o cursor onde está agora.
EvergreenTree
2

Aqui estão alguns mapeamentos rápidos e sujos para realizar a tarefa:

nnoremap yY :%yank <c-r>=v:register<cr><cr>
nnoremap dD :%delete <c-r>=v:register<cr><cr>

Agora você pode usar yYe dDpara puxar / excluir respectivamente. Não é tão bom quanto usar um objeto de texto completo, mas às vezes as soluções mais simples são as melhores.

Para obter mais ajuda, consulte:

:h :y
:h :d
:h [range]
:h v:register
:h c_ctrl-r
:h @=
Peter Rincker
fonte