Kann ich das Einfügen in vim beschleunigen?


11

Ich habe einen Teil des HTML-Codes von einer Webseite kopiert und wollte ihn in einer Datei speichern. Dafür habe ich eine neue vim Sitzung in einem Terminalfenster mit einem (neuen) Dateinamen in der Befehlszeile gestartet , gedrückt, ium in den Einfügemodus zu gelangen, und dann CtrlShift+ Vund gewartet, während [-- INSERT --]unten angezeigt und gewartet ...

Da vimich nach einigen Sekunden nicht mehr reagierte, öffnete ich im Menü Anwendungen → Zubehör den Texteditor (fügte innerhalb eines Bruchteils einer Sekunde ein, speicherte ihn unter einem neuen Namen, schloss ihn und beendete die Vim-Sitzung, die Noch nicht fertig, 1,5 Minuten später. Die Textmenge betrug 186 KB in 3200 Zeilen, weder übermäßig, würde ich sagen, noch mit zu langen Zeilen.

Gibt es eine Möglichkeit, diese Art von Einfügungen zu beschleunigen, vimund / oder gibt es eine Erklärung, warum dies im Vergleich zur Verwendung des ansonsten schrecklichen und mausorientierten Texteditors so langsam ist?

(Die% CPU nach topkommt nicht über 5%, obwohl ich einige Prozessoren im System frei habe, so dass es sich möglicherweise um ein E / A-gebundenes Problem handelt, das beim Lesen des gleichen Textes aus einer Datei nicht besteht.)

Versionsinfo:
Ubuntu 12.04
Vim: 7.3, mit Patches wie von Ubuntu 12.04
bereitgestellt Bash: 4.2.25
Gnome-Terminal: 3.4.1.1


1
Ich denke, es ist langsam, weil es die Eingabe analysieren und versuchen muss, sie zu formatieren usw. Ich bin mir nicht sicher, ob dies möglich ist, würde aber davon ausgehen, dass Sie diese Funktion vorübergehend deaktivieren, vimeinfügen und dann einfügen können Aktivieren Sie es erneut. Versuchen Sie auch, die :set pasteFunktion zu verwenden, um festzustellen, ob sie die Dinge verbessert. Siehe :help pastees beschreibt, wie vimkeine Unterscheidung zwischen s / w-Eingabe und Einfügen erfolgt.
slm

Ich würde erwarten vi, dass ich versuche, die Datei beim Einlesen zu analysieren (nachdem ich den von @ l0b0 vorgeschlagenen Weg gespeichert habe). Das geht aber schnell.
Anthon

Stimmt, aber ich stelle mir vor, dass es alles reparieren muss, was bereits analysiert wurde + das neue Zeichen, während Sie es einfügen. Das scheint genau das zu sein, wenn Sie eine Datei bis zu einem gewissen Grad bearbeiten.
slm

Das :set pastescheint keinen wirklichen Unterschied zu machen (ich benutze keine Stoppuhr, nur die Wanduhr).
Anthon

OK, war nur ein Gedanke ...
slm

Antworten:


13

Um schnell viel Text aus der Zwischenablage in einer Datei zu speichern, können Sie ihn ausführen cat > file.txt, den Inhalt einfügen und dann Ctrl- drücken d.

Wenn Sie xsel installiert haben, können Sie die Auswahl:r !xsel "primär" (auch "Maus" genannt) in Vim :r !xsel -beinfügen oder den Puffer "Zwischenablage" ( Ctrl- c) einfügen . Sie können die Auswahl auch direkt in einer Datei mit xsel >file.txtoder speichern xsel -b >file.txt. Dadurch entfällt die Notwendigkeit separater Einfüge- und EOF-Aktionen, und es wird vermieden, dass der gesamte Kopierpuffer im Terminal gedruckt wird.

Wenn Sie kein xsel außer xclip haben, gelten die entsprechenden Befehle xclip -outfür die primäre Auswahl oder xclip -out -selection clipboardfür den Zwischenablagepuffer.


1
Vielen Dank, das funktioniert zumindest, ohne zur Maus zurückkehren zu müssen, und das Einfügen der Datei in vim (z. B. wenn ich nicht mit einer leeren Datei beginne) ist schnell genug.
Anthon

Ich verstehe nicht, warum dies nicht an Strg + Umschalt + V gebunden werden konnte. Das alles hat absolut keinen Sinn.
Mchid

2

Dies ist ein Puffer-Flush-to-Disk-Problem. Vim versucht, Ihre Arbeit sicher zu halten und geht nicht davon aus, dass Sie mehrere tausend Zeichen pro Sekunde eingeben können. Lesen Sie :help swap-fileeinige Details zur Pufferung. Die Lösung für Ihr Problem lautet:

Deaktivieren Sie die Swap-Datei von vim entweder mit:

vim -n <your file>

oder aus vim vor der Paste:

:set noswapfile

Siehe :help swapfilefür weitere Details.

Eine andere Möglichkeit besteht darin, die Synchronisierung der Auslagerungsdatei mit der Festplatte einfach zu deaktivieren. :set swapsync=Diese Option erfordert jedoch mehr Tastenanschläge zum Rückgängigmachen und ich bin faul. :) :)

Das Ausschalten des Swaps ist für den normalen Betrieb nicht sicher! Verwenden Sie unmittelbar nach dem Einfügen entweder :set swapfileoder :set swapsync=fsync, um zum normalen Verhalten zurückzukehren (obwohl das normale Verhalten technisch gesehen möglicherweise synchron und nicht fsync war , prüfen Sie :set swapsync?vorher, ob Sie diesen Weg einschlagen möchten).


Das hat die Dinge für mich nicht beschleunigt ...
Elig vor

1

Wenn Sie über eine xterm_clipboardFunktion verfügen , können Sie die Register *und verwenden +. Diese Register sind mit dem primären Auswahlpuffer X11 bzw. der Zwischenablage verbunden.

Wenn Sie also etwas über CTRL+ kopiert haben c, können Sie es in vim mit einfügen "+p.

Wenn Sie es einfach ohne Kopieren markiert haben, können Sie es mit einfügen "*p.
Sie können den *Puffer auch zum Standardpuffer machen, indem Sie dies tun :set clipboard=unnamed. Dann verwendet jeder yank ( y), paste ( p) usw., der kein Register angibt, das *Register. Vim 7.3.74 wurde ebenfalls hinzugefügt clipboard=unnamedplus, wodurch das +Register standardmäßig verwendet wird.

Sie können Dinge auch in die primären Auswahl- und Zwischenablagepuffer kopieren, indem Sie zum Beispiel ziehen : "+yy.

 

Beachten Sie, dass diese Funktionen, wie bereits erwähnt, alle diese Funktion benötigen xterm_clipboard. Sie können sehen, ob Sie diese Funktion haben, indem Sie :versionin vim oder vim --versionin der Shell arbeiten und nach suchen +xterm_clipboard. Wenn es heißt -xterm_clipboard, haben Sie es nicht und müssten vim neu kompilieren.


Ich habe diese Funktion nicht. Würde eine Neukompilierung helfen, auch wenn vim nicht unter xterm läuft? (Ich benutze Gnome-Terminal).
Anthon

@Anthon Wenn Sie GUI VIM verwenden, sind meines Erachtens auch die Register aktiviert. xterm_clipboardist nur, wenn vim vom Terminal ausgeführt wird.
Patrick

Dies ist nur Text, kein GUI VIM, läuft aber nicht von xterm.
Anthon

Oh, tut mir leid, dass ich falsch verstanden habe. Ja xterm_clipboardgilt für jeden Terminalemulator, nicht nur für xterm. Ich selbst benutze urxvt.
Patrick
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.