Como mover a tela sem mover o cursor no Vim?

598

Eu descobri recentemente Ctrl+ Ee Ctrl+ Yatalhos para Vim que respectivamente mover a tela para cima e para baixo com um passo uma linha, sem mover o cursor .

Você conhece algum comando que deixa o cursor onde está, mas move a tela para que a linha que contém o cursor se torne a primeira linha? (Ter um comando para a última linha seria um bom bônus).

Eu posso conseguir isso pressionando manualmente Ctrl+ E(ou Ctrl+ Y) o número adequado de vezes, mas ter um comando que de alguma forma faça isso diretamente seria bom.

Alguma ideia?

ereOn
fonte
Esta pergunta não deveria estar na seção Vim?
João

Respostas:

877
  • zz- mova a linha atual para o meio da tela
    ( cuidado comzz , se você tiver uma Caps Lockligação acidental, salvará e sairá vim!)
  • zt - move a linha atual para o topo da tela
  • zb - move a linha atual para a parte inferior da tela
Kevin Vaughan
fonte
9
@HappyGreenKidNaps Mapa que fecha a tecla de bloqueio para controlar o mais rápido possível!
Aaron
Estou muito apegado ao meu caps lock, especialmente lidando com muitas macros C, mas você tem outras opções. Primeiro, encontre uma chave não mapeada (verifique se há letras nos dois casos; tente adicionar um modificador ou líder, usando um símbolo ou tecla de função etc.) e mapeie-o para a combinação 'arriscada' sensível a maiúsculas e minúsculas. Segundo, configure o vimundo ao seu gosto para que você possa se recuperar de um oops. (Hackes não portáteis recebidos :) Terceiro, faça o mesmo, mas a partir da configuração do teclado do usuário, por exemplo, tecla Windows + Z; para mapas para sequências, tente xdotoolou triggerhappy. Finalmente, mostrar seus Caps Lock estado (não pode ser feito em Vimscript.) ...
John P
2
A consulta do estado do caps lock é muito dependente do ambiente. Ouvi dizer que isso não pode ser feito no Vimscript e, neste momento, eu o aceitei. Se você quiser seguir esse caminho, há xev -q, cat /proc/bus/input/devicespara encontrar o dispositivo para consultar e / evtestou thd ... --dump /dev/input/event<#>verificar o estado, etc. Se você absolutamente precisar fazer um remapeamento em todo o sistema, pelo menos troque dois bloqueios como caps <--> num - mas a questão é mais esquecê-la, porque se você a quisesse antes, continuará usando-a, seja qual for o mapa. Risco de quebrar o Vim antes dos arquivos / usuário / sistema.
John P
Outras opções de script do Vim: ative 'confirm' para confirmar sair / sair / etc .; para escrever, acredito que você precisaria de um comando automático para o BufWritePre with confirm(). Além disso, em vez de mapear caps lock para ctrl, você pode mapeá-lo para uma chave ou combinação entendida, mas não mapeada pelo Vim, e então emular caps lock exclusivamente no modo de inserção / substituição, manualmente ou por algo como github.com/tpope/ vim-capslock . Você provavelmente não vai precisar dele fora do Vim, mas se o fizer, escrever um roteiro xmodmap para reverter as alterações, ou ver se os apoios do programa mapeamentos de seus próprios (e fazer anotações.)
John P
3
zt / zz / zb - cursor fixo e o ecrã de movimento t op / centro (alemão: ' z Entrum') / b ottom <---> H / H / L - tela fixa e move cursor para H IGH / M iddle / L posição
eli
626

Além disso:

  • Ctrl- yMove a tela uma linha acima
  • Ctrl- eMove a tela uma linha abaixo
  • Ctrl- uMove o cursor e a tela para cima ½ página
  • Ctrl- dMove o cursor e a tela para baixo ½ página
  • Ctrl- bMove a tela para cima uma página, o cursor para a última linha
  • Ctrl- fMove a tela para baixo uma página, cursor para a primeira linha

Ctrl- ye Ctrl- eapenas altere a posição do cursor se for retirado da tela.

Cortesia de http://www.lagmonster.org/docs/vi2.html

Paul Wheeler
fonte
91
@ulidtko: efter (depois em sueco), outrora (significando o passado), para cima, para baixo, para trás, para frente. (As palavras trás e para a frente são mais longos do que para cima e para baixo, então naturalmente eles se movem na tela uma distância mais longa;)
Moberg
12
Eu acho que yester, como no dia de ontem seria um embora melhor mnemônico ^^
Moberg
Ctrl-u e Ctrl-d movem o cursor: " O cursor é movido para o mesmo número de linhas no arquivo (se possível; quando as linhas são quebradas e ao atingir o final do arquivo, pode haver uma diferença). "
Veja o que você
Obrigado @LexR, atualizei a resposta para refletir essa distinção.
Paul Wheeler
1
:help CTRL-EdizMnemonic: Extra lines.
Niko Bellic
39

O Vim exige que o cursor esteja na tela atual o tempo todo; no entanto, você pode marcar a posição atual como favorito e rolar para onde você estava.

mg  # This book marks the current position as g (this can be any letter)
<scroll around>
`g  # return to g
GWW
fonte
1
note que se você se importa apenas em ir para a linha marcada, você pode usar 'g
Matt Briggs
4
"O Vim exige que o cursor esteja na tela atual o tempo todo" Os usuários do Vim gostam de se gabar de que tudo é configurável no vim. Este não é. Não quero que meu cursor seja movido enquanto estiver percorrendo o arquivo. Dealbreaker for me
gadelat 8/16
8
Eu nunca tive uma situação em que queria que o cursor estivesse em algum lugar que você não pudesse vê-lo. Claro, o cursor se move quando você rola, mas você pode voltar para onde estava trivialmente (para que você possa ver onde realmente estava, não apenas um palpite). Duplo back-tick para um, Ctrl-Opara outro realmente ótimo, e "backtick, period" coloca você de volta ao local da última edição.
traço-tom-bang
3
@gedalat, é altamente irritante em outros editores quando você rolar para longe, não sabe mais onde está o cursor e precisa usar o mouse para clicar em algum lugar, apenas para recuperar o cursor. Ou você pensa que está "aqui", comece a digitar e, de repente, saltará de volta para onde estava o cursor; nesse ponto, você não poderá voltar para onde havia rolado, porque apenas as posições do cursor são rastreadas. Ter o cursor aonde você vai é sem dúvida uma coisa boa.
23416 Shahbaz
1
É configurável, @gadelat. Você só precisa mapear essa mesma resposta (marque a posição com mg, role ao redor, vá para marcar com 'ge pronto. Agora você pode chamar a tecla configurável para dar a volta e parecerá que o cursor nunca saiu da posição atual. Voilá!
Dr Beco
18

Aqui está a minha solução no vimrc:

"keep cursor in the middle all the time :)
nnoremap k kzz
nnoremap j jzz
nnoremap p pzz
nnoremap P Pzz
nnoremap G Gzz
nnoremap x xzz
inoremap <ESC> <ESC>zz
nnoremap <ENTER> <ENTER>zz
inoremap <ENTER> <ENTER><ESC>zzi
nnoremap o o<ESC>zza
nnoremap O O<ESC>zza
nnoremap a a<ESC>zza

Para que o cursor fique no meio da tela e a tela se mova para cima ou para baixo.

Henry
fonte
Acho que esta solução é mais do que o OP precisava. Eu apliquei e funciona como um encanto.
Gustavo Pinsard
9
Que tal apenas definir 'scrolloff' para metade do valor de 'linhas'?
rld.
infelizmente "nnoremap o <ESC> zza" perde o autoindent, mas isso funciona adicionando e removendo um caractere temporário '.' "nnoremap o. <ESC> zzxa"
Neil McGill
Obrigado @rld, o 'scrolloff' também é uma solução boa ou talvez melhor. Obrigado! Aqui está a referência: vim.wikia.com/wiki/…
Henry
14

Para deixar o cursor na mesma coluna quando você usa Ctrl+ D, Ctrl+ F, Ctrl+ B, Ctrl+ U, G, H, M, L,gg

você deve definir a seguinte opção:

:set nostartofline
Alexander Rumyantsev
fonte
2
Eu sempre esqueço / confundo: zt / zz / zb - cursor fixo e mova a tela para t op / center (alemão: ' z entrum') / b ottom <---> H / M / L - tela fixa e movo cursor para H IGH / M iddle / L ow posição
eli
8

Estou surpreso que ninguém esteja usando a Scrolloffopção que mantém o cursor no meio da página. Experimente com:

:set so=999

É o primeiro método recomendado no wiki do Vim e funciona bem.

Jesse Reza Khorasanee
fonte
3
E se você não quer que o cursor sempre estar certo no meio, você pode configurá-lo para um valor menor. Por exemplo, :set scrolloff=4exigirá que o cursor esteja sempre a pelo menos 4 linhas da parte superior ou inferior da janela, para que você tenha sempre pelo menos um pouco de contexto.
Soren Bjornstad 10/10/19
6

Eu usei esses atalhos no passado ( nota: pressionamentos de teclas separados, por exemplo, toque em z , solte, toque na tecla subseqüente):

z enter -> move a linha atual para o topo da tela

z . -> move a linha atual para o centro da tela

z - -> move a linha atual para baixo

Se não for óbvio:

entersignifica a tecla Returnou Enter.

.significa a tecla DOT ou "ponto final" ( .).

-significa a tecla HYPHEN ( -)

Pelo que vale, z.evita o risco de salvar e fechar o Vi digitando acidentalmente ZZse o caps-lock estiver ativado.

Razzle
fonte
5

Você pode prefixar o cursor mover comandos com um número e isso repetirá esse comando muitas vezes

10Ctrl+ Efará Ctrl+ E10 vezes em vez de uma.

yunzen
fonte
4

zEnter faz exatamente o que essa pergunta pede.

Funciona onde estranhamente zznão funcionaria (vim 7.4.1689 no Ubuntu 2016.04 LTS sem .vimrc especial)

Nicolas Raoul
fonte
2

Às vezes, é útil rolar o texto com as teclas Ke J, portanto, tenho essa função "modo de rolagem" no meu arquivo .vimrc (também vinculado azs ).

Consulte scroll_mode.vim .

Oleg Khalidov
fonte
2

meu mnemônico para rolar ...

Ao adicionar outras respostas, preste atenção também zee zs, significando: mova a tela para a esquerda / direita do cursor (sem mover o cursor)

+-------------------------------+
^                               |
|c-e (keep cursor)              |
|H(igh)             zt (top)    |
|                   ^           |
|           ze      |      zs   |
|M(iddle)  zh/zH <--zz--> zl/zL |
|                   |           |
|                   v           |
|L(ow)              zb (bottom) |
|c-y (keep cursor)              |
v                               |
+-------------------------------+

observe também a posição de he le te be (com o teclado qwertz) c-ee c-y(também o "y" de alguma forma aponta para o fundo) no teclado para lembrar para onde a tela está se movendo.

eli
fonte
1

Eu escrevi um plugin que me permite navegar no arquivo sem mover a posição do cursor. É baseado em dobrar as linhas entre a sua posição e a posição alvo e, em seguida, pular a dobra, ou abortá-la e não se mover.

É também fácil de fast-chave entre o cursor na primeira linha, a última linha e cursor no meio clicando apenas j, koul quando você está no modo do plugin.

Eu acho que seria um bom ajuste aqui.

estalar
fonte
1

Digite vim e digite:

:help z

zé o comando vim para redesenhar, portanto, redesenha o arquivo em relação a onde você posiciona o cursor. As opções que você tem são as seguintes:

z+- Redesenha o arquivo com o cursor na parte superior da janela e no primeiro caractere não em branco da sua linha.

z-- Redesenha o arquivo com o cursor na parte inferior da janela e no primeiro caractere não em branco da sua linha.

z.- Redesenha o arquivo com o cursor no centro da janela e no primeiro caractere não em branco da sua linha.

zt- Redesenha o arquivo com o cursor na parte superior da janela.

zb- Redesenha o arquivo com o cursor na parte inferior da janela.

zz- Redesenha o arquivo com o cursor no centro da janela.

Joe
fonte