In vim muss ich oft große Textblöcke löschen oder reißen / setzen.
Ich kann die Textzeilen zählen und so etwas wie 50dd
50 Zeilen löschen.
Aber das ist ein bisschen schmerzhaft. Wie kann ich diesen großen Textblock löschen, ohne vorher wissen zu müssen, wie viele Zeilen gelöscht werden sollen?
move
bis zum Ende können. Dann ist das Löschen bis zum Ende nicht anders als das Verschieben bis zum Ende.Antworten:
Gehen Sie zur Anfangszeile Ihres Blocks und geben Sie ein ma(markieren Sie "a", obwohl Sie natürlich auch verschiedene Buchstaben und sogar mehrere Buchstaben für verschiedene Markierungen verwenden können, vorausgesetzt, Sie können es in Ihrem Kopf gerade halten, wovon jeder Buchstabe eine Marke ist) .
Gehen Sie dann in die letzte Zeile und geben Sie d'a(Löschen, um "a" zu markieren) oder y'a(Ziehen, um "a" zu markieren) (a) ein .
Dadurch werden alle Zeilen von der aktuellen bis zur markierten Zeile (einschließlich) gelöscht / entfernt.
Dann können Sie es mit den normalen Einfügebefehlen wie poder an einer anderen Stelle einfügen P.
Es ist auch kompatibel mit
vi
undvim
, falls Ihre Umgebung nicht mit letzterem gesegnet ist.(a) Ich verwende dies auch, um meinen Platz in der Datei zu speichern, wenn ich nach etwas anderem suchen muss, zum Beispiel nach dem Einfügen der Definition einer Funktion, die ich aufrufen möchte.
Ich markiere einfach die aktuelle Zeile auf die gleiche Weise und magehe dann los, um zu finden, wonach Sie suchen.
Sobald ich es gefunden und in ein Register kopiert habe, 'agehe ich zurück und markiere "a", die zuvor gespeicherte Zeile, wo ich es dann einfügen kann.
quelle
v
Taste drücke, frage ich mich, ob ich es wirklich brauche oder ob es einen besseren Bewegungsweg gibt.Verwenden Sie in Vim den visuellen Linienmodus :
Zum Löschen großer Textblöcke ist dies dem einfachen visuellen Modus vorzuziehen, da Sie sich keine Gedanken darüber machen müssen, auf welcher Spalte sich der Cursor befindet.
quelle
}
mit ganzen Absatz oder)
für Sätze ausgewählt werden. Es gibt noch mehr, die könnt ihr in:h object-motions
/something<CR>
ist eine sehr effiziente Methode, um das Ende Ihres Auswahlblocks zu erreichenj
Sie auch die Zeilennummer eingeben, ohne wiederholt drücken zu müssen, um den Cursor nach unten zu bewegen (Schritt 3). Anschließend könnenG
Sie bis zu dieser Zeile auswählen. Beispiel:V150Gd
Sie können
:set relativenumber
, also müssen Sie nicht zählen. ;)quelle
:set number
, und verwenden Sie dann d35G, um bis Zeile 35 zu löschen.relativenumber
, aber besser :-)Sie können problemlos große Textblöcke löschen, wenn Sie die Struktur kennen.
Wenn es sich um einen Absatz handelt, verwenden Sie: d{(Sie können z. B. die Anzahl der Absätze voranstellen)
Wenn es sich um einen Codeblock in Klammern handelt, verwenden Sie: d%
Wenn der Text bis zum Ende der Datei erscheint, verwenden Sie: dG
Wenn Sie wissen, wie es endet, verwenden Sie: d/und geben Sie den Endtext gefolgt von ein Enter(Sie können auch reguläre Ausdrücke verwenden, sodass die Möglichkeiten endlos sind).
Verwenden Sie alternativ den visuellen Modus ( V) und die Bewegungstasten, um den Text schnell auszuwählen (z. B. durch {) und zu entfernen ( d).
Oder verwenden Sie, wie Lie Ryan vorgeschlagen hat
d/search-string/e
, um Text aus dem aktuellen Cursor in die gesuchte Zeichenfolge zu löschen.Siehe:
:help d
und:help motion
für mehr Infos.quelle
d/search-string/e
die Möglichkeit, vom aktuellen Cursor bis zum Ende des Suchstrings einschließlich des Suchstrings selbst zu löschen undc/search-query
nach dem Löschen in den Einfügemodus zu gelangen. Die Verwendung vond/
withset incsearch
ist eine übersichtliche Kombination, mit der Sie interaktiv herausfinden können, ob Sie im richtigen Textbereich arbeiten, und Sie wissen, wann Sie mit der Eingabe der Suchabfrage aufhören müssen, um zu vermeiden, dass Sie mehr als nötig eingeben.d
mita
(äußerlich) oderi
(innerlich) und einem Objektbezeichner sehr nützlich. Objekte wiew
für Wort,p
für Absatz,(
oderb
für(...)
,[
für[...]
,{
oderB
für{...}
usw. Dokumentation für Visual-Betreiber .Sie können Bewegungen und / oder Textobjekte verwenden. Zum Beispiel können Sie mit alles vom Cursor bis zur nächsten leeren Zeile löschen
d}
. Befindet sich der Cursor in einem Absatz, kann der Absatz mitdip
oder gelöscht werdendap
. Befindet sich der Cursor innerhalb eines HTML-Tags, können Sie ihn mitdit
oder löschendat
.Gute Mnemoniken für diese sind " d elete i nside" und " d elete a round" (Absatz / Tag / Klammer).
quelle
Normalerweise mache ich
Dadurch wird jede Zeile zwischen den angegebenen Start- und Endzeilennummern (einschließlich der angegebenen Zeilen) gelöscht.
Beachten Sie, dass beides
start
undend
absolute Zeilennummern, Muster oder Versätze von einer anderen Position sein können.Siehe auch Double Kommentar über das Anzeigen Vims Bereich Dokumentation, es einige nützliche Tipps hat.
Beispiel:
Angenommen, Sie haben die folgende Datei:
Wenn Sie dann den Befehl
:2,3d
oder:/fox/,/over/d
oder:/quick/+1,/lazy/-1
oder:+1,+2d
in der ersten Zeile oder:-1,.d
in der dritten Zeile verwenden, erhalten Sie:quelle
:set ruler
, dann nach oben und unten des Textes zu findenstart
undend
Zeilennummern, dann tun:<start>,<end>d
:+12,+24d
<start>
und<end>
für diesen. Referenz siehe:h [range]
. Es ist also viel flexibler, als Sie es sich vorgestellt haben.Wenn es sich um begrenzte Blöcke handelt (z. B. Code oder XML / HTML-Tags), können Sie den Cursor an den Anfang des Blocks setzen und den visuellen Modus zusammen mit verwenden,
%
um schnell ganze Codeblöcke auszuwählen und dann zu drückend
um sie zu löschen.quelle
dap
einen Absatz löschen zu,da(
,da{
,da[
, zu den Blöcken löschen delimeted durch Klammern, oder eckigen Klammern. Für HTML gibt esdat
, die ein Tag löscht, undda'
undda"
Zeichenfolgen löschen. Es gibt auch diedip
,di(
usw Varianten, die alles in den Trennzeichen löschen, aber die Trennzeichen intakt lassen. Alternativ können Sievap
(respvip
) verwenden, um alle (resp inneren) Absätze auszuwählen. (Und so gibt esva(
undvi(
.) Weiter gibt escap
undcip
(oderca(
undci(
) zum Löschen und zum Einfügen (dh "Ändern"). Undyap
zum reißenNeben all dem anderen guten Rat Ich füge d+ Shift+ Lfür auf dem Bildschirm alles von der aktuellen Cursorposition in die letzten sichtbaren Zeile zu löschen. Wenn Sie den Befehl wiederholen, werden Sie relativ schnell außer Gefecht gesetzt.
quelle
Das numbers.vim Plugin ist dafür sehr nützlich. Auf diese Weise können Sie jeder Zeile eine Zeilennummer voranstellen. Wie
'number'
und'relativenumber'
, beide haben sich zu einem zusammengerollt!Es ist standardmäßig nach der Installation aktiviert. Sie möchten es auch
set number
zu Ihrem vimrc hinzufügen , wenn Sie es noch nicht haben, da es sich auf seltsame Weise verhält, wenn Sie es nicht haben.Im normalen Modus sieht es ungefähr so aus
:set relativenumber
:Hier werden relative Zeilennummern angezeigt, mit Ausnahme der Zeile, in der sich der Cursor befindet, und der absoluten Zeilennummer (in diesem Fall 7).
Wenn wir dann in den Einfügemodus wechseln , verhält es sich so, als ob
number
immer absolute Zeilennummern angezeigt würden:Es gibt einige weitere Optionen und einige Befehle (siehe Homepage), aber die Standardeinstellungen sollten für die meisten Leute funktionieren.
quelle
set number
,set relativenumber
dannautocmd InsertEnter * :set norelativenumber
undautocmd InsertLeave * :set relativenumber
Ein weiterer Ansatz ist, dass Sie einfach eingeben können, wenn Sie versuchen, ein bestimmtes Muster zu löschen d/
delim
Enter.quelle
Sie können den normalen Vorgang der Eingabe dplus einer Bewegung verwenden (wie bereits in den anderen Antworten erläutert). Das EasyMotion-Plugin bietet neue Bewegungen, mit denen Sie Ihr Problem schnell und einfach lösen können.
Angenommen, Sie möchten von der aktuellen Cursorposition bis zum Ende eines bestimmten Worts auf dem Bildschirm löschen, dann lauten die Bewegungstasten
<Leader>
<Leader>
e(ähnlich der normalene
Bewegung). Geben Sie dann die hervorgehobenen Buchstaben ein, die am Ende des betreffenden Wortes erscheinen. Es gibt auch eine Linienbewegung, mit der Sie die aktuelle Linie bis zur betreffenden Linie löschen können<Leader>
<Leader>
j.Ich habe meinen
<Leader>
Schlüssel auf eingestellt ,. Der vollständige Befehl lautet also d<Leader>
<Leader>
e{markierte (r) Buchstabe (n)}.Von
:help easymotion
:Bearbeiten:
Das Github-Repository von EasyMotion finden Sie unter https://github.com/Lokaltog/vim-easymotion .
Dieser Reddit über Leute, die easymotion benutzen, könnte eine unterhaltsame Lektüre sein.
quelle
Es gibt eine einfache Lösung, die Ihr Problem lösen kann.
Stellen Sie den Cursor an den Anfang des Textblocks, den Sie entfernen möchten, und klicken Sie auf OK
d50gg
.Dadurch werden alle Zeilen von Ihrer aktuellen Position bis zur 50. Textzeile gelöscht.
eq: Wenn sich Ihr Cursor in Zeile 46 befindet ,
d50gg
werden 4 Zeilen gelöscht .quelle
G
anstelle von gg zu verwenden, da dies auch in vi funktioniert. Dies ist natürlich:set number
immer hilfreich, um herauszufinden, zu welcher Zeilennummer die Zeile gehört, zu der Sie wechseln möchten.Verwenden Sie den visuellen Modus mit Linienmarkierung.
Ich bevorzuge diese Methode zum Löschen von Codeblöcken, da sie ganze Zeilen löscht, verglichen mit der einfachen Verwendung des visuellen Modus, bei dem Sie den Cursor in der rechten Spalte positionieren müssen, um das zu löschen, was Sie möchten.
quelle
Ich mag es nicht, die
relativenumber
ganze Zeit zu haben, deshalb habe ich mein Vim so konfiguriert, dass es nur aktiviert wird, wenn ich mich im visuellen Modus befinde:Das macht Ihre Aufgabe einfach:
Denn nach einem Treffer können VSie sehen, wie weit die Ziellinie entfernt ist.
Dies mag sich auf lange Sicht als ärgerlich erweisen (der Text verschiebt sich nach rechts und links, wenn die relative Nummer aktiviert / deaktiviert ist), aber bisher gefällt es mir sehr gut.
quelle
v<Esc>d50j
?V
wenn ich weiß, dass ich eine zeilenweise Operation machen werde, und dann kann ich died
bis zuletzt verlassen, um mehr Vertrauen zu gewinnen.Was für mich gut funktioniert hat
vi
::set number
um die Nummer der Zeile anzuzeigen, bis zu der ich löschen wollte;Gehen Sie zurück zu der Zeile, in der der Löschvorgang beginnen musste
d1290G
quelle