Em um arquivo muito longo com código recuado (com precisão), pode ser útil mover diretamente para uma linha de texto acima ou abaixo do cursor que delimita o recuo.
(Uma maneira de fazer isso pode ser através do método de indent fold, dobrando o nível de indentação atual, que recolhe as linhas que delimitam o nível de indentação a ficar apenas a um distância j
ou k
fora do cursor. No entanto, encontrei casos em que a indentação não foi foi capaz de trabalhar no travessão no qual estou interessado.)
Aqui está um exemplo, com o cursor marcado pelo sublinhado _
(na segunda coluna de caracteres entre as definições de class Bazz
e class Qux
), mas imagine que o número de parágrafos ou linhas dentro de module
s seja desconhecido ou variável:
module Foo
# lots of code...
end
module Bar
class Baz
# ...
end
class Bazz
# lots of code...
end
_
class Qux
# ...
end
class Quux
# lots of code...
end
end
... como eu poderia navegar rapidamente para o o
de module Bar
cima do cursor, ou a n
do end
abaixo o cursor na última linha? Observe que a coluna vertical contém espaços em branco, mas também nenhum caractere na segunda coluna entre as class
definições.
fonte
Respostas:
E essa função?
Você pode
nnoremap gU :call FloatUp()<CR>
(gU
para "subir") e depois invocar comgU
.Aqui está uma explicação:
norm k
) enquanto awhile
condição se mantiver.while
condição é válida se esta não for a primeira linha (line(".") > 1
) e segetline(".")
) na coluna atual ([col(".") - 1]
) é um espaço em branco (=~ '\s'
; isto é, corresponde ao padrão de espaço em branco).fonte
FloatDown
função. No meu .vimrc vai, obrigado! github.com/alxndr/dotfiles/commit/0e25a302Eu gosto de usar a pesquisa por essas coisas, porque as regexs do Vim têm uma quantidade insana de coisas que você pode procurar, como números de colunas virtuais específicos, neste caso:
nnoremap cd /\%<C-R>=virtcol(".")<CR>v\S<CR>
nnoremap cu ?\%<C-R>=virtcol(".")<CR>v\S<CR>
Use
cd
para descer ecu
subir. Estou pensando em "coluna acima" e "coluna abaixo" aqui. Estou quase 100% confiante de que essas não são ops por padrão. Ou escolha seus próprios mapeamentos.Isso deve funcionar se você estiver usando guias ou espaços ou ambos.
fonte
=
registro é o registro de expressão que avalia uma expressão no local. É muito útil, se não um pouco estranho.:let searchbak=@/<CR>
e anexar:let @/=searchbak<CR>
. Mas neste momento está ficando meio longo e inacessível e talvez deva ser apenas uma função.Você pode usar o plugin JumpToVerticalOccurrence (padrão mapeado para ]|e [|). Existem poucos outros ]V{char}que funcionam f, mas verticalmente. É claro que você pode remapear conforme necessário.
Se você não quiser usar plug-ins, tente usar
:search
comvirtcol(.)
, por exemplo:Onde:
virtcol('.')
fornece a coluna atual,\S
significa espaço não em brancobW
é para pesquisa reversaVerifique
:help search
para saber mais.Para facilitar o uso, você pode mapeá-lo, por exemplo:
Alternativamente, se o seu código contém parênteses, o uso %de saltar entre combiná-los (por exemplo
{
,}
,[
,]
, etc.) ou usar parágrafo inteiro salta ( {, }com Shiftse necessário).Links / fontes:
fonte
:h search()
:w
meioswrap around the end of the file
eW
meiosdon't wrap around the end of the file
. Mas por que você os juntou no segundo:map
?w
não deveria estar lá, então eu o removi, obrigado. Provavelmente eu estava confuso com o significado das teclas de movimento.Eu uso uma versão modificada do plug - in vim-indent-object para fornecer esse comportamento. Minhas modificações podem ser vistas aqui .
Isso me permite mapear
[i
para ir para o início do nível de recuo atual e]i
para o final.fonte
Não é exatamente o que você pediu, porque não é o movimento vertical, mas algo que é semelhante, rápido, e pode ser bom o suficiente para você está se movendo para trás 2 parágrafos: {{. Isso levará você para a linha logo antes
module Bar
.fonte
module
linha de nível superior . (Especificamente, esta situação surgiu quando eu estava recentemente a navegação de código de terceiros vários milhares de linhas de comprimento, com recuo precisos, mas há linhas vazias, e tentando encontrar o contexto externo da definição de um módulo.)jeetsukumaran / vim-indentwise funciona bem para movimentos relativos, absolutos ou de escopo de bloco entre blocos recuados.
fonte
Eu uso meu próprio plugin move_until_char_changes.vim para isso.
Eu mapeio para
gK
egJ
.Irá pular muitas linhas com o mesmo caractere na coluna atual (não apenas espaço em branco), o que pode ser útil em arquivos de log ou dumps SQL com sequências repetidas.
Por padrão, ele primeiro move uma linha, antes de selecionar o caractere "pesquisar".
Funciona no modo Visual, desde que você não tente usá-lo duas vezes e não esteja no modo Visual em linha ou em bloco ... (correções bem-vindas!)
fonte
Como não vejo aqui como resposta (a edição acabou de notar que a superjer mencionou algo muito semelhante). Você pode simplesmente o / ou? procurar.
Por exemplo, você pode procurar para baixo por um caractere que não seja espaço em branco na 2ª coluna como esta:
A repartição é:
Em seguida, você pode usar os operadores normais para repetir a pesquisa.
Para mais informações sobre o assunto, consulte
:help \%c
e:help \%v
.fonte