W bardzo długim pliku z (dokładnie) wciętym kodem pomocne może być przejście bezpośrednio do wiersza tekstu powyżej lub poniżej kursora, który ogranicza wcięcie.
(Jednym ze sposobów na to może być metoda wcięcia, składając bieżący poziom wcięcia, który zwija linie ograniczające poziom wcięcia na odległość tylko a j
lub k
od kursora. Znalazłem jednak przypadki, w których składanie wcięcia nie mogłem pracować nad wcięciem, które mnie interesuje).
Oto przykład, z kursorem zaznaczonym podkreśleniem _
(w kolumnie drugiego znaku między definicjami class Bazz
i class Qux
), ale wyobraź sobie, że liczba akapitów lub linii w ciągu module
s jest nieznana lub zmienna:
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
... w jaki sposób mogę szybko nawigować do o
z module Bar
nad kursorem, lub n
z end
poniżej kursora w ostatniej linii? Zauważ, że pionowa kolumna zawiera białe spacje, ale także żadnych znaków w drugiej kolumnie pomiędzy class
definicjami.
źródło
Odpowiedzi:
A co z tą funkcją?
Możesz
nnoremap gU :call FloatUp()<CR>
(gU
dla „iść w górę”), a następnie wywołać za pomocągU
.Oto wyjaśnienie:
norm k
) tak długo, jak długowhile
warunek się utrzymuje.while
Warunek jest spełniony, jeśli nie jest to pierwsza linia (line(".") > 1
) i albogetline(".")
znak bieżącej linii ( ) w bieżącej kolumnie ([col(".") - 1]
) to biały znak (=~ '\s'
tzn. pasuje do wzorca białych znaków).źródło
FloatDown
funkcję. Wchodzi w moje .vimrc, dzięki! github.com/alxndr/dotfiles/commit/0e25a302Lubię używać wyszukiwania tych rzeczy, ponieważ wyrażenia regularne Vima zawierają niesamowitą liczbę rzeczy, których możesz szukać, na przykład konkretne numery wirtualnych kolumn, w tym przypadku:
nnoremap cd /\%<C-R>=virtcol(".")<CR>v\S<CR>
nnoremap cu ?\%<C-R>=virtcol(".")<CR>v\S<CR>
Użyj,
cd
aby zejść icu
zejść. Myślę tutaj o „kolumnie w górę” i „kolumnie w dół”. Jestem prawie w 100% pewien, że domyślnie nie są to operacje. Lub wybierz własne mapowania.Powinno to działać niezależnie od tego, czy używasz tabulatorów, spacji, czy obu.
źródło
=
Rejestr jest rejestrem wyrażenie który ocenia wyrażenia w miejscu. Jest to bardzo przydatne, jeśli nie trochę dziwne.:let searchbak=@/<CR>
dodać je i dołączyć:let @/=searchbak<CR>
. Ale w tym momencie robi się to dość długie i niedostępne i może powinno być tylko funkcją.Możesz użyć wtyczki JumpToVerticalOccurrence (domyślnie zmapowane do ]|i [|). Istnieje kilka innych podobnych, ]V{char}które działają jak f, ale pionowo. Możesz oczywiście ponownie przypisać je w razie potrzeby.
Jeśli nie chcesz korzystać z wtyczek, można spróbować skorzystać
:search
zvirtcol(.)
, na przykład:gdzie:
virtcol('.')
daje bieżącą kolumnę,\S
oznacza spacjebW
służy do wyszukiwania wsteczSprawdź,
:help search
aby dowiedzieć się więcej.Aby ułatwić obsługę, możesz go zmapować, np .:
Alternatywnie, jeśli kod zawiera wsporniki, korzystanie %skakać między dopasowując je (na przykład
{
,}
,[
,]
, itd.) Lub wykorzystać cały ustęp skoki ( {, }o Shiftile to konieczne).Linki / źródła:
źródło
:h search()
:w
środkiwrap around the end of the file
iW
środkidon't wrap around the end of the file
. Ale dlaczego umieściłeś je razem:map
?w
nie powinno tam być, więc usunąłem go, dzięki. Prawdopodobnie byłem zdezorientowany znaczeniem klawiszy ruchu.Używam zmodyfikowanej wersji wtyczki vim-indent-object, aby zapewnić takie zachowanie. Moje modyfikacje można zobaczyć tutaj .
To pozwala mi mapować,
[i
aby przejść do początku bieżącego poziomu wcięcia i]i
przejść do końca.źródło
To nie jest dokładnie to, co prosiłeś, bo to nie jest ruch pionowy, ale coś, co jest podobny, szybki i może być wystarczająco dobre dla ciebie jest w ruchu do tyłu 2 akapity: {{. To zabierze Cię do linii tuż przed
module Bar
.źródło
module
linią najwyższego poziomu jest nieznana liczba linii i / lub akapitów . (W szczególności sytuacja ta pojawiła się, gdy ostatnio nawigowałem po kodzie innej firmy o długości kilku tysięcy wierszy, z dokładnym wcięciem, ale bez pustych linii, i próbowałem znaleźć zewnętrzny kontekst definicji modułu.)jeetsukumaran / vim-indentwise działa dobrze w przypadku ruchów względnych, bezwzględnych lub w zakresie bloków w wciętych blokach.
źródło
Używam do tego własnej wtyczki move_until_char_changes.vim .
Mapuję to na
gK
igJ
.Przeskoczy przez wiele wierszy o tym samym znaku w bieżącej kolumnie (nie tylko białe znaki), co może być przydatne w plikach dziennika lub zrzutach SQL z powtarzającymi się ciągami.
Domyślnie najpierw przesuwa się o jedną linię, a następnie podnosi znak „wyszukiwania”.
Działa w trybie wizualnym, pod warunkiem, że nie spróbujesz użyć go dwa razy i nie jesteś w trybie wizualnym liniowym lub blokowym ... (poprawki mile widziane!)
źródło
Ponieważ nie widzę tego tutaj jako odpowiedzi ( edycja zauważyła, że superjer wspomniał o czymś bardzo podobnym). Możesz po prostu / lub? Szukaj.
Na przykład możesz wyszukać znak spacji w drugiej kolumnie w dół w następujący sposób:
Podział jest następujący:
Następnie możesz użyć zwykłych operatorów, aby powtórzyć wyszukiwanie.
Aby uzyskać więcej informacji na ten temat, patrz
:help \%c
i:help \%v
.źródło