Vim Rucking Reihe von Linien

83

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:

  1. 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?

  2. Ich bin etwas verwirrt über den gBefehl 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 des gBefehls enthält?

jnadro52
quelle
1
Kennen Sie den Befehl ": help" in vim (1)?
Steve Emmerson
Ja, aber ich konnte es nicht in allen Referenzen finden. Es stellte sich heraus, dass ich dachte, ich würde es im normalen Modus tun, aber Hometoast zeigte, wie es im Befehlsmodus gemacht werden musste. Für den Befehl g stelle ich nur fest, dass die Hilfe nicht alles zusammenhält, wie ich es von den anderen Befehlen erwarten würde.
jnadro52
3
Nebenbei möchte ich vielleicht einen Beitrag pro Frage verfassen.
Dana
1
Ich werde es in Zukunft tun. Ich war mehr mit der ersten Frage beschäftigt, ich dachte nur an die andere, als ich die erste tippte.
jnadro52

Antworten:

139

Rucklinien 81-91

:81,91y<enter>

Wenn Ihre Finger die Tasten :und nicht finden ,möchten, funktioniert dies ebenfalls (gehen Sie zu Zeile 81, ziehen Sie 11 Zeilen).

81gg11yy 

Meine einzige Verwendung gist 5gg. 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 gim Befehlsmodus funktioniert.

Hometoast
quelle
2
Die Verwendung von Großbuchstaben bietet ebenfalls Variationen: Es ggwird in die erste Zeile und Gin die letzte Zeile gewechselt. Außerdem 5Ggeht 5. Marks Linie kann auch anstelle von Zeilennummern verwendet werden (gut für Makros), dh: :'a,52y
NVRAM
1
Wenn Sie keine Angst vor der Umschalttaste haben, 81G11Yist diese sogar "kürzer".
Jens
1
Der Nachteil der normalen Modusmethode ist, dass Sie Ihren "Platz" verlieren. Sie könnten mxvor und 'xnach, aber dann wird die Befehlsmodus-Version viel prägnanter. Humm ... kaum hatte ich das geschrieben, sah ich die Antwort von @Asta.
Eric Smith
1
@WilliamRoss Dies legt die Zeilen tatsächlich in einem Puffer zur Verwendung in vim ab, nicht unbedingt in der Zwischenablage Ihres Systems, in die Sie beispielsweise mit STRG + V in den Editor einfügen können. Siehe verwandte Frage: Wie man Text von vi in ​​verschiedene Anwendungen kopiert /
einfügt
1
Das amüsiert mich, denn der ganze Grund, warum ich nach der ersten Lösung gesucht habe, war zu vermeiden, Linien zu zählen oder eine Subtraktion in meinem Kopf durchzuführen.
Paul Parker
22

Sie können die aktuellen Zeilen auch mit 't' an Ihre aktuelle Cursorposition kopieren.

:81,91t.<enter>

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.

Asta
quelle
Was bedeutet das t.hier?
CivFan
2
Nach meinem Verständnis tkann man sich als tkrank oder to vorstellen und .ist die Adresse der aktuellen Zeile.
Asta
1
@CivFan ist ein Synonym für:copy
D. Ben Knoble
11

Ich verwende auch gerne die Option für die relative Zeilennummer von vim, was bedeutet, dass ich einfach Folgendes eingeben kann:

:-10,-7ya a

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:

:-10,-7co .

bedeutet, die vier Textzeilen 10 Zeilen über bis unter die aktuelle Zeile zu kopieren und

:-10,-7mo .

bedeutet, dass die vier Textzeilen 10 Zeilen über die aktuelle Zeile verschoben werden.

Rob Wells
quelle
8

Der GBefehl geht zu einer bestimmten Zeilennummer, wenn er von einem Zählwert begleitet wird. 81Gbringt Sie in die Linie 81.

Der yBefehl kann mit einer Bewegung wie kombiniert werden G. Also, um alles bis zur Zeile 91 zu ziehen, können Sie verwenden y91G.

Zusammen erhalten Sie:

81Gy91G

Gehen Sie zu Zeile 81 und ziehen Sie dann, während Sie zu Zeile 91 gehen.

etw
quelle
1
Ich wünschte, ich könnte dies mehr als einmal positiv bewerten. Etwas, das mir geholfen hat, war, dies zu verwenden, um an ein Register zu ziehen (in meinem Fall Register + dh die Zwischenablage):81G"+y91G
mgarey
1
@mgarey gibt es keine Möglichkeit, mit der Zeilenbereichssyntax direkt in ein Register zu ziehen? 81,91yund irgendwie auf das Register zielen?
Diplosaurus
1
@diplosaurus Wahrscheinlich, aber ich weiß es nicht. Das klingt nach einer Frage, die Sie auf vi.stackexchange.com stellen könnten, wenn sie nicht bereits vorhanden ist oder hier auf SO. Das würde mich interessieren. Ich bin kein Vim-Experte.
mgarey
2
@mgarey Musste mit der Google-Suche kreativ werden, aber ich fand sie hier: stackoverflow.com/questions/16225366/… . :81,91y +
Diplosaurus
@diplosaurus :81,91y +funktioniert nicht. Es funktioniert für andere Register wie :81,91y azum Beispiel, scheint aber das +Register nicht zu mögen . Funktioniert das definitiv für andere Leute?
Ojunk
4

gmacht 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.

Jimbo
quelle
Vielen Dank. Ich verstehe jetzt, dass es nur für verschiedene Zwecke verwendet wird. Wenn ich versuche, diese Tools zu erlernen, versuche ich, die Befehle mit etwas zu verknüpfen, das ich abstrahieren kann, damit ich mich daran erinnere, wie ich sie richtig verwende. Es scheint, dass der Befehl g nur eines der Dinge ist, die Sie sich merken müssen, um ihn richtig zu verwenden.
jnadro52
2

Vims :help indexbeschreibt gals:

|g|             g{char}            extended commands, see |g| below

Scrollen Sie nach unten (oder :help g) für eine Liste.

Matthew Slattery
quelle
1
Ich war mit der: help vertraut, aber ich war NICHT vertraut mit: help (Befehl). Das wird in Zukunft sehr nützlich sein. Vielen Dank, Sir.
jnadro52
2

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.

Taras Vaskiv
quelle
Nicht einverstanden, aber nur der visuelle Modus ist manchmal so langsam.
D. Ben Knoble
1

Zusätzlich zu :91,96y aden yanks ( y) Zeilen 91 bis 96 in das Register a(eingefügt mit "ap) können die gezogenen Zeilen an das Register angehängt werden mit:

:91,96y A

Das heißt, die Großschreibung des ARegisters bewirkt, dass eine Operation an das Register angehängt wird, aanstatt sie zu überschreiben. Die Großschreibung des Registers funktioniert immer so, z. B. :let @A=';'hängt ein ;Register an a.

Mit Plus (+) oder Minus (-) werden Zeilen relativ zur aktuellen Cursorposition referenziert:

:-10,+10y b

Das heißt, es würde ( y) 21 Zeilen um die aktuelle Cursorposition ziehen und sie in das Register einfügen b.

Das Fehlen einer Eingabe repräsentiert tatsächlich auch die aktuelle Cursorposition, was bedeutet, dass dies:

:-5,y a

würde den Text von 5 Zeilen oben zur aktuellen Cursorposition in den benannten Puffer ziehen aund:

:,+5y a

würde die 5 Zeilen nach der aktuellen Cursorposition in den Puffer ziehen a.

Hinweis: Wenn Sie ein Makro im Puffer ahaben, 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:

:+10,+13m.

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 yain :91,95ya aseine irgendwie auch mit , ya{motion}wo die Bewegung von geliefert wurde 91,95. Dies war falsch und das "a" in yaist völlig unnötig. Zu meiner Verteidigung help yankvermittelt mein nicht, dass dies yaein möglicher Alias ​​von ist yank.

Paul Parker
quelle
1
:yaist 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
D. Ben Knoble
Das dachte ich auch, bis ich es mir ansah :help yank. Es gibt keinen Alias yafür yank. Sie haben Recht, das asteht nicht für "alle", sondern technisch für "a". Ich sage aber trotzdem lieber "alles", da es für mich sinnvoller ist.
Paul Parker
2
:[range]y[ank] [x] Yank [range] lines [into register x]Die eckigen Klammern in y[ank]zeigen an, dass die [ank]optional sind. :y, :yaUnd :yansind implizit Aliase für:yank
D. Ben Knoble
Ich stehe korrigiert :) Das a ist nicht notwendig. Bearbeitet die Antwort entsprechend.
Paul Parker
1
Ihr Nachtrag ist nett, aber ich bezog mich auf Ihre allererste Zeile, in der Sie den Befehl ex :yaund nicht den normalen Befehl verwendeny
D. Ben Knoble
0

Als langjähriger Vi / Vim-Benutzer verwende ich eher "Markierungen" anstelle von Zeilennummern (oder "Linienmarkierungen"). Es funktioniert so: mist 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:

File:
    <line 1>
    <line 2>
    <line 3>
    <line 4>
    <line 5>

Bewegen Sie den Cursor im Befehlsmodus auf Zeile 2 und geben Sie ein ma. Scrollen Sie zu Zeile 4 und geben Sie ein mb. Um von Markierung a zu Markierung b zu ziehen, geben Sie Folgendes ein :

    :'a,'byank

So löschen Sie von Markierung a bis Markierung b Typ:

    :'a,'bdel

So suchen Sie von Markierung a nach Markierung b und ersetzen 'ine' durch 'ink':

    :'a,'bs/ine/ink/g

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):

    :'a,'bco . 

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):

    :'a,'b> 

Im Befehlsmodus können Sie zu Markierungen zurückkehren, indem Sie einfach eingeben 'a, um zur markierten Zeile zurückzukehren a. 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.

BentChainRing
quelle
0

So ziehen Sie Zeilen von Zeile 81 bis 91:

Ansatz 1: 81gg11yy

Nicht schlecht, aber Sie müssen ein bisschen rechnen, um herauszufinden, wie viele Zeilen Sie ziehen müssen

Ansatz 2: 81ggdann shift+vdann 91ggdanny

BEST IN MEINER MEINUNG, weil dies einfach ist, müssen Sie nur das Offensichtliche wissen, dh von welcher Zeilennummer zu welcher Zeilennummer Sie ziehen möchten

Firoj Siddiki
quelle