Dans un fichier très long avec du code en retrait (précis), il peut être utile de se déplacer directement vers une ligne de texte au-dessus ou en dessous du curseur qui délimite le retrait.
(Une façon de le faire pourrait être via la méthode de pliage en retrait, en pliant le niveau de retrait actuel, ce qui réduit les lignes délimitant le niveau de retrait pour être seulement à j
ou k
loin du curseur. Cependant, j'ai trouvé des cas où le pliage en retrait n'a pas pu travailler sur le tiret qui m'intéresse.)
Voici un exemple, avec le curseur marqué par le trait de soulignement _
(dans la deuxième colonne de caractères entre les définitions de class Bazz
et class Qux
), mais imaginez que le nombre de paragraphes ou de lignes dans le module
s est inconnu ou variable:
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
... comment pourrais - je accéder rapidement au o
de module Bar
dessus du curseur, ou n
du end
dessous du curseur à la dernière ligne? Notez que la colonne verticale contient des espaces, mais également aucun caractère dans la deuxième colonne entre les class
définitions.
la source
Réponses:
Et cette fonction?
Vous pouvez
nnoremap gU :call FloatUp()<CR>
(gU
pour "monter"), puis invoquer avecgU
.Voici une explication:
norm k
) tant que lawhile
condition est maintenue.while
condition est vérifiée si ce n'est pas la première ligne (line(".") > 1
) et quegetline(".")
) dans la colonne en cours ([col(".") - 1]
) est un espace ((=~ '\s'
c'est-à-dire, correspond au modèle d'espace)).la source
FloatDown
fonction également. Dans mon .vimrc il va, merci! github.com/alxndr/dotfiles/commit/0e25a302J'aime utiliser la recherche pour ces choses, car les expressions régulières de Vim ont une quantité insensée de choses que vous pouvez rechercher, comme des numéros de colonnes virtuelles spécifiques, dans ce cas:
nnoremap cd /\%<C-R>=virtcol(".")<CR>v\S<CR>
nnoremap cu ?\%<C-R>=virtcol(".")<CR>v\S<CR>
Utilisez
cd
pour descendre etcu
pour monter. Je pense "colonne vers le haut" et "colonne vers le bas" ici. Je suis presque sûr à 100% qu'il ne s'agit pas d'opérations par défaut. Ou choisissez vos propres mappages.Cela devrait fonctionner que vous utilisiez des tabulations, des espaces ou les deux.
la source
=
registre est le registre d'expression qui évalue une expression en place. C'est très pratique, sinon un peu bizarre.:let searchbak=@/<CR>
ajouter et ajouter:let @/=searchbak<CR>
. Mais à ce stade, cela devient un peu long et inaccessible et devrait peut-être juste être une fonction.Vous pouvez utiliser le plugin JumpToVerticalOccurrence (mappé par défaut à ]|et [|). Il y en a peu d'autres ]V{char}qui fonctionnent comme f, mais verticalement. Vous pouvez bien sûr les remapper au besoin.
Si vous ne souhaitez pas utiliser de plugins, vous pouvez essayer de l'utiliser
:search
avecvirtcol(.)
, par exemple:où:
virtcol('.')
vous donne la colonne actuelle,\S
signifie non-blancbW
est pour la recherche en arrièreCochez
:help search
pour en savoir plus.Pour le rendre plus facile à utiliser, vous pouvez le cartographier, par exemple:
Par ailleurs, si votre code contient des crochets, utilisez %pour sauter entre eux correspondant (par exemple
{
,}
,[
,]
, etc.) ou utiliser des sauts tout le paragraphe ( {, }avec le Shiftcas échéant).Liens / sources:
la source
:h search()
:w
moyenswrap around the end of the file
etW
moyensdon't wrap around the end of the file
. Mais pourquoi les avez-vous réunis le deuxième:map
?w
ne devrait pas être là, donc je l'ai supprimé, merci. J'ai probablement été confondu par le sens des touches de mouvement.J'utilise une version modifiée du plugin vim-indent-object pour fournir ce comportement. Mes modifications sont visibles ici .
Cela me permet de mapper
[i
pour aller au début du niveau de retrait actuel et]i
pour aller à la fin.la source
Ce n'est pas exactement ce que vous avez demandé parce que ce n'est pas un mouvement vertical, mais quelque chose qui est semblable, rapide, et peut - être assez bon pour vous est en mouvement 2 arrière paragraphes: {{. Cela vous amènera à la ligne juste avant
module Bar
.la source
module
ligne de niveau supérieur . (Plus précisément, cette situation s'est produite lorsque je naviguais récemment dans un code tiers de plusieurs milliers de lignes, avec une indentation précise mais pas de lignes vides, et en essayant de trouver le contexte externe de la définition d'un module.)jeetsukumaran / vim-indentwise fonctionne bien pour les mouvements relatifs, absolus ou de portée de bloc à travers les blocs en retrait.
la source
J'utilise mon propre plugin move_until_char_changes.vim pour cela.
Je le mappe à
gK
etgJ
.Il sautera par-dessus de nombreuses lignes avec le même caractère dans la colonne actuelle (pas seulement les espaces blancs), ce qui peut être utile dans les fichiers journaux ou les vidages SQL avec des chaînes répétées.
Par défaut, il déplace d'abord une ligne, avant de prendre le caractère "recherche".
Il fonctionne en mode visuel à condition de ne pas l'utiliser deux fois et que vous ne soyez pas en mode visuel en ligne ou en bloc ... (correctifs bienvenus!)
la source
Puisque je ne le vois pas ici comme une réponse ( edit vient de remarquer que superjer a mentionné quelque chose de très similaire). Vous pouvez simplement le / ou? chercher.
Par exemple, vous pouvez rechercher vers le bas un caractère non blanc dans la 2ème colonne comme ceci:
La répartition est la suivante:
Ensuite, vous pouvez utiliser les opérateurs normaux pour répéter la recherche.
Pour plus d'informations sur le sujet, voir
:help \%c
et:help \%v
.la source