In einer sehr langen Datei mit (genau-) eingerücktem Code kann es hilfreich sein, direkt zu einer Textzeile über oder unter dem Cursor zu wechseln, die den Einzug begrenzt.
(Eine Möglichkeit hierfür ist die Methode zum Falten von Einrückungen, bei der die aktuelle Einrückungsebene gefaltet wird. Dabei werden die Zeilen, die die Einrückungsebene begrenzen, so zusammengefasst, dass sie nur ein j
oder k
nicht vom Cursor entfernt sind. Ich habe jedoch Fälle gefunden, in denen das Falten von Einrückungen nicht erfolgt konnte an dem Gedankenstrich arbeiten, an dem ich interessiert bin.)
Hier ist ein Beispiel, bei dem der Cursor durch den Unterstrich markiert ist _
(in der zweiten Zeichenspalte zwischen den Definitionen von class Bazz
und class Qux
). Stellen Sie sich jedoch vor, dass die Anzahl der Absätze oder Zeilen innerhalb des module
s unbekannt oder variabel ist:
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
... wie kann ich schnell zu dem o
von module Bar
über dem Cursor oder dem n
von end
unter dem Cursor in der allerletzten Zeile navigieren ? Beachten Sie, dass die vertikale Spalte Leerzeichen, aber auch keine Zeichen in der zweiten Spalte zwischen den class
Definitionen enthält.
quelle
Antworten:
Wie wäre es mit dieser Funktion?
Sie könnten
nnoremap gU :call FloatUp()<CR>
(gU
für "steigen") und dann mit aufrufengU
.Hier ist eine Erklärung:
norm k
), solange diewhile
Bedingung erfüllt ist.while
Bedingung gilt, wenn dies nicht die erste Zeile ist (line(".") > 1
) und auch nichtgetline(".")
Zeichen der aktuellen Zeile ( ) in der aktuellen Spalte ([col(".") - 1]
) ist ein Leerzeichen (=~ '\s'
dh es entspricht dem Leerzeichenmuster).quelle
FloatDown
funktionieren und lässt sich auch leicht in eine Funktion umwandeln. In meine .vimrc geht es, danke! github.com/alxndr/dotfiles/commit/0e25a302Ich verwende gerne die Suche nach diesen Dingen, weil Vims reguläre Ausdrücke eine unglaubliche Menge von Dingen enthalten, nach denen Sie suchen können, z. B. nach bestimmten virtuellen Spaltennummern in diesem Fall:
nnoremap cd /\%<C-R>=virtcol(".")<CR>v\S<CR>
nnoremap cu ?\%<C-R>=virtcol(".")<CR>v\S<CR>
Mit
cd
runter undcu
rauf gehen. Ich denke hier "Spalte hoch" und "Spalte runter". Ich bin fast zu 100% davon überzeugt, dass dies standardmäßig No-Ops sind. Oder wählen Sie Ihre eigenen Zuordnungen.Dies sollte funktionieren, unabhängig davon, ob Sie Tabulatoren oder Leerzeichen oder beides verwenden.
quelle
=
Register ist das Ausdrucksregister, das einen Ausdruck an Ort und Stelle auswertet. Es ist sehr praktisch, wenn nicht ein bisschen komisch aussehend.:let searchbak=@/<CR>
und anhängen:let @/=searchbak<CR>
. Aber zu diesem Zeitpunkt wird es ziemlich lang und unnahbar und sollte vielleicht nur eine Funktion sein.Sie können das JumpToVerticalOccurrence- Plugin verwenden (standardmäßig ]|und zugeordnet [|). Es gibt nur wenige, ]V{char}die so funktionieren f, aber vertikal. Sie können sie natürlich nach Bedarf neu zuordnen.
Wenn Sie keine Plugins verwenden möchten, können Sie versuchen,
:search
mit zu verwendenvirtcol(.)
, z. B .:woher:
virtcol('.')
gibt Ihnen die aktuelle Spalte,\S
steht für non-whitespacebW
ist für die RückwärtssucheÜberprüfen Sie
:help search
, um mehr zu erfahren.Um die Verwendung zu vereinfachen, können Sie es zuordnen, z.
Alternativ, wenn Sie den Code Klammern enthält, verwenden Sie %zwischen passender sie springen ( zum Beispiel
{
,}
,[
,]
, etc.) oder benutzen ganzer Absatz springt ( {, }mit , Shiftfalls erforderlich).Links / Quellen:
quelle
:h search()
:w
bedeutetwrap around the end of the file
undW
bedeutetdon't wrap around the end of the file
. Aber warum hast du sie in der zweiten zusammengefügt:map
?w
sollte nicht da sein, also habe ich es entfernt, danke. Wahrscheinlich war ich durch die Bedeutung der Bewegungstasten verwirrt.Ich verwende eine geänderte Version des Plugins vim-indent-object , um dieses Verhalten bereitzustellen. Meine Änderungen zu sehen sind hier .
Auf diese Weise kann ich abbilden
[i
, um zum Anfang der aktuellen Einzugsebene und]i
zum Ende zu gelangen.quelle
Es ist nicht genau das, was Sie gefragt , weil es nicht eine vertikale Bewegung, sondern etwas , das ähnlich ist, schnell und kann gut genug sein für Sie rückwärts 2 Absätze bewegt: {{. Damit gelangen Sie direkt zur vorherigen Zeile
module Bar
.quelle
module
Zeile eine unbekannte Anzahl von Zeilen und / oder Absätzen befindet. (Insbesondere trat diese Situation auf, als ich kürzlich in mehreren tausend Zeilen langem Code von Drittanbietern mit genauem Einzug, aber ohne Leerzeilen navigierte und versuchte, den äußeren Kontext der Definition eines Moduls zu finden.)jeetsukumaran / vim-indentwise funktioniert gut für relative, absolute oder Block-Scope-Bewegungen über eingerückte Blöcke.
quelle
Ich benutze dafür mein eigenes Plugin move_until_char_changes.vim .
Ich ordne es
gK
und zugJ
.Es springt über viele Zeilen mit demselben Zeichen in der aktuellen Spalte (nicht nur über Leerzeichen), was bei Protokolldateien oder SQL-Speicherauszügen mit wiederholten Zeichenfolgen hilfreich sein kann.
Standardmäßig wird zuerst eine Zeile verschoben, bevor das Suchzeichen verwendet wird.
Es funktioniert im visuellen Modus, vorausgesetzt, Sie versuchen nicht, es zweimal zu verwenden, und Sie befinden sich nicht im zeilenweisen oder blockweisen visuellen Modus ... (Fehlerbehebungen erwünscht!)
quelle
Da ich es hier nicht als Antwort sehe ( Edit hat gerade gemerkt, dass Superjer etwas sehr ähnliches erwähnt hat). Du kannst einfach das / oder? Suche.
Beispielsweise können Sie in der 2. Spalte nach einem Nicht-Leerzeichen wie folgt nach unten suchen:
Die Aufteilung ist:
Dann können Sie die Suche mit den normalen Operatoren wiederholen.
Weitere Informationen zu diesem Thema finden Sie unter
:help \%c
und:help \%v
.quelle