Ich bin ein C # -Entwickler, der sich kürzlich entschlossen hat, mein Wissen über die mir zur Verfügung stehenden Tools zu erweitern. Das erste Tool, das ich lernen möchte, ist Vi / Vim. Bisher ist alles gut gelaufen, aber es gibt ein paar Fragen, auf die ich anscheinend keine Antwort finde:
Nehmen wir an, ich wollte eine Reihe von Zeilen ziehen. Ich weiß, dass es viele Möglichkeiten gibt, dies zu tun, aber ich würde es gerne anhand der Zeilennummer tun. Ich dachte, es wäre ähnlich wie die Ersatzbefehle, so etwas wie
81,91y
. Gibt es eine Möglichkeit, dies zu tun?Ich bin etwas verwirrt über den
g
Befehl im normalen Modus. Es scheint eine Vielzahl von Dingen zu tun, und ich kann nicht wirklich bestimmen, was der Befehl g im Kern tut. Ich bin verwirrt darüber, ob es sich um einen Bewegungsbefehl oder eine Art "Alles fangen" für andere Befehle handelt, die im normalen Modus ausgeführt werden. Kann jemand dies bitte erklären oder mich auf eine Referenz verweisen, die eine gute Erklärung desg
Befehls enthält?
Antworten:
Rucklinien 81-91
Wenn Ihre Finger die Tasten
:
und nicht finden,
möchten, funktioniert dies ebenfalls (gehen Sie zu Zeile 81, ziehen Sie 11 Zeilen).Meine einzige Verwendung
g
ist5gg
. In die 5. Zeile gehen.22gg
: 22. Zeile. Wie Jimbo sagte, ist es wirklich nur ein Modifikator für einige andere Befehle.Der Vollständigkeit halber erklärt ( http://vim.wikia.com/wiki/Power_of_g ) viel darüber, wie
g
im Befehlsmodus funktioniert.quelle
gg
wird in die erste Zeile undG
in die letzte Zeile gewechselt. Außerdem5G
geht 5. Marks Linie kann auch anstelle von Zeilennummern verwendet werden (gut für Makros), dh::'a,52y
81G11Y
ist diese sogar "kürzer".mx
vor und'x
nach, aber dann wird die Befehlsmodus-Version viel prägnanter. Humm ... kaum hatte ich das geschrieben, sah ich die Antwort von @Asta.Sie können die aktuellen Zeilen auch mit 't' an Ihre aktuelle Cursorposition kopieren.
Dadurch werden die Zeilen 81-91 unter der Zeile eingefügt, auf der sich der Cursor befindet.
Ich habe dies von http://vimcasts.org gelernt, einer hervorragenden Ressource für VIM.
quelle
t.
hier?t
kann man sich alst
krank odert
o vorstellen und.
ist die Adresse der aktuellen Zeile.:copy
Ich verwende auch gerne die Option für die relative Zeilennummer von vim, was bedeutet, dass ich einfach Folgendes eingeben kann:
um den Text in den benannten Puffer zu ziehen a.
NB Wenn Sie A angeben, wird das, was Sie ziehen, an den aktuellen Inhalt von Puffer a angehängt.
Vergessen Sie nicht, dass Sie mit den folgenden Befehlen auch Textblöcke kopieren und Textblöcke verschieben können:
bedeutet, die vier Textzeilen 10 Zeilen über bis unter die aktuelle Zeile zu kopieren und
bedeutet, dass die vier Textzeilen 10 Zeilen über die aktuelle Zeile verschoben werden.
quelle
Der
G
Befehl geht zu einer bestimmten Zeilennummer, wenn er von einem Zählwert begleitet wird.81G
bringt Sie in die Linie 81.Der
y
Befehl kann mit einer Bewegung wie kombiniert werdenG
. Also, um alles bis zur Zeile 91 zu ziehen, können Sie verwendeny91G
.Zusammen erhalten Sie:
Gehen Sie zu Zeile 81 und ziehen Sie dann, während Sie zu Zeile 91 gehen.
quelle
81G"+y91G
81,91y
und irgendwie auf das Register zielen?:81,91y +
:81,91y +
funktioniert nicht. Es funktioniert für andere Register wie:81,91y a
zum Beispiel, scheint aber das+
Register nicht zu mögen . Funktioniert das definitiv für andere Leute?g
macht nichts von selbst. Es ist eines von mehreren Meta-Befehlen, die eine Reihe von sorta-unabhängigen Befehlen enthalten.z
ist noch ein Befehl wie dieser.quelle
Vims
:help index
beschreibtg
als:Scrollen Sie nach unten (oder
:help g
) für eine Liste.quelle
Die beste Lösung wäre, durch Drücken von v in den "visuellen Modus" zu wechseln. Nach Auswahl der Zeilen kopieren Sie sie einfach durch Drücken von y. Fügen Sie dann kopierte Zeilen ein, indem Sie p drücken.
quelle
Zusätzlich zu
:91,96y a
den yanks (y
) Zeilen 91 bis 96 in das Registera
(eingefügt mit"ap
) können die gezogenen Zeilen an das Register angehängt werden mit:Das heißt, die Großschreibung des
A
Registers bewirkt, dass eine Operation an das Register angehängt wird,a
anstatt sie zu überschreiben. Die Großschreibung des Registers funktioniert immer so, z. B.:let @A=';'
hängt ein;
Register ana
.Mit Plus (+) oder Minus (-) werden Zeilen relativ zur aktuellen Cursorposition referenziert:
Das heißt, es würde (
y
) 21 Zeilen um die aktuelle Cursorposition ziehen und sie in das Register einfügenb
.Das Fehlen einer Eingabe repräsentiert tatsächlich auch die aktuelle Cursorposition, was bedeutet, dass dies:
würde den Text von 5 Zeilen oben zur aktuellen Cursorposition in den benannten Puffer ziehen
a
und:würde die 5 Zeilen nach der aktuellen Cursorposition in den Puffer ziehen
a
.Hinweis: Wenn Sie ein Makro im Puffer
a
haben, wurde es gerade vom vorherigen Yank überschrieben, da Yank-Register und Makro-Register wirklich dasselbe sind. Aus diesem Grund können Sie zufällig ein Makro einfügen, bearbeiten und dann wieder in sein Register ziehen. Ich persönlich verwende Buchstaben, die von meiner linken Hand erreicht werden, für Amis und Buchstaben, die von meiner rechten Hand erreicht werden, für Makros.Das Verschieben von Textblöcken sieht folgendermaßen aus:
Dies bedeutet, dass die vier Zeilen, die 10 Zeilen vor dem aktuellen Cursor positioniert sind, unter die aktuelle Zeile verschoben werden.
Nachtrag
Ich verwirrte zuvor
ya
in:91,95ya a
seine irgendwie auch mit ,ya{motion}
wo die Bewegung von geliefert wurde91,95
. Dies war falsch und das "a" inya
ist völlig unnötig. Zu meiner Verteidigunghelp yank
vermittelt mein nicht, dass diesya
ein möglicher Alias von istyank
.quelle
:ya
ist eine Abkürzung von:yank
, daher bin ich mir nicht sicher, wie ich mich dabei fühle, alle Zeilen zu ziehen . Aber gute Arbeit, um einige der verstreuten Informationen zu verdichten:help yank
. Es gibt keinen Aliasya
füryank
. Sie haben Recht, dasa
steht nicht für "alle", sondern technisch für "a". Ich sage aber trotzdem lieber "alles", da es für mich sinnvoller ist.:[range]y[ank] [x] Yank [range] lines [into register x]
Die eckigen Klammern iny[ank]
zeigen an, dass die[ank]
optional sind.:y
,:ya
Und:yan
sind implizit Aliase für:yank
:ya
und nicht den normalen Befehl verwendeny
Als langjähriger Vi / Vim-Benutzer verwende ich eher "Markierungen" anstelle von Zeilennummern (oder "Linienmarkierungen"). Es funktioniert so:
m
ist das 'Zeichen'-Zeichen; Verwenden Sie dann einen beliebigen Buchstaben, um die Marke zu identifizieren / zu benennen. Um zu einer Marke zurückzukehren, stellen Sie der benannten Marke ein einfaches Anführungszeichen vor ('a
). Diese Marken können als Bereich verwendet werden. Beispiele:Bewegen Sie den Cursor im Befehlsmodus auf Zeile 2 und geben Sie ein
ma
. Scrollen Sie zu Zeile 4 und geben Sie einmb
. Um von Markierung a zu Markierung b zu ziehen, geben Sie Folgendes ein :So löschen Sie von Markierung a bis Markierung b Typ:
So suchen Sie von Markierung a nach Markierung b und ersetzen 'ine' durch 'ink':
So kopieren Sie Markierung a bis Markierung b und fügen sie unterhalb der aktuellen Position ein (der 'Punkt' verweist immer auf die Linie, in der sich der Cursor gerade befindet):
Verschieben Sie die Codezeilen zwischen Markierung a und Markierung b , eine Lasche nach rechts (verwenden Sie den gegenüberliegenden Chevron
<
, um sich nach links zu bewegen):Im Befehlsmodus können Sie zu Markierungen zurückkehren, indem Sie einfach eingeben
'a
, um zur markierten Zeile zurückzukehrena
. Durch Tippen''
kehren Sie zur vorherigen Position zurück (leider werden nur die vorherige Position gespeichert, nicht zwei zurück).Sie können in benannte Puffer ziehen, Zeilen kopieren, löschen, nur Teile Ihres Codes suchen und ersetzen usw., ohne die Zeilennummern kennen zu müssen.
quelle
So ziehen Sie Zeilen von Zeile 81 bis 91:
Ansatz 1:
81gg11yy
Ansatz 2:
81gg
dannshift+v
dann91gg
danny
quelle