Ich möchte eine schnelle Möglichkeit haben, die Vim- 'paste'
Option festzulegen, Text einzufügen und zum vorherigen Wert von zurückzukehren 'paste'
.
Ein typischer Anwendungsfall: Fügen Sie den Inhalt der Zwischenablage des Betriebssystems buchstäblich ein, unabhängig davon, ob der Einfügemodus möglicherweise neu geschrieben wird, z. B. durch automatisches Einrücken, und ohne den Status von Vim zu ändern. Ein weiterer Anwendungsfall wäre, einem Betriebssystemmakro zu erlauben, Tastenanschläge in Vim einzufügen und sie als wörtlichen Text interpretieren zu lassen.
Dies verallgemeinert sich offensichtlich auf andere Optionen - die allgemeine Idee ist, einige Optionen festzulegen, jedoch nur für die Dauer einer Reise durch den Einfügemodus.
Grundsätzlich möchte ich eine Tastensequenz (etwa _i
) an ein Makro binden , das dies ausführt
:set paste
i…<Esc>
:set nopaste
Wobei i…<Esc>
ich damit meine, in den Einfügemodus zu wechseln (wie beim i
Befehl) und das Makro bei Rückkehr in den Befehlsmodus fortzusetzen, mit der Ausnahme, dass ich am Ende 'paste'
immer noch aktiv sein möchte, wenn es zuvor aktiv war. Wie kann ich das machen?
Hinweis: Der Inhalt der Zwischenablage des Betriebssystems wird dem "*
Register zugeordnet . Wenn das funktioniert, ist die 'paste'
Option nicht sehr nützlich. Das motivierende Szenario für diese Frage ist, wenn die Bedingungen für die "*
Registerunterstützung nicht erfüllt sind - Vim ist nicht mit der +xterm_clipboard
Funktion kompiliert oder wird in einem Terminal wie Screen oder über SSH ausgeführt, das es vom Ambient X-Server isoliert.
quelle
+
oder zu*
registrieren?Antworten:
Probieren Sie es aus:
Es speichert Ihren aktuellen Einfügestatus in der inPaste-Variablen und setzt den Einfügestatus, falls er noch nicht festgelegt ist. Dann richtet es eine Autocmd ein, wenn Sie den Einfügemodus verlassen, und versetzt Sie dann in den Einfügemodus.
Wenn Sie den Einfügemodus verlassen, wird der Befehl autocmd ausgeführt, der zuerst den Befehl autocmd entfernt (damit er nicht ausgeführt wird, wenn Sie den Einfügemodus auf andere Weise verlassen). Wenn Sie sich ursprünglich nicht im Einfügemodus befanden, wird schließlich nopaste festgelegt.
Wenn Sie vim in einem Terminal verwenden, sollten Sie sich vim-bracketed-paste ansehen, bei dem die Funktion für den Modus des Einfügens in Klammern von mehreren Terminalemulatoren verwendet wird, um zu erkennen, ob Sie den Modus automatisch einfügen und einstellen.
Bearbeiten: Das Skript wurde repariert
quelle
_i
diepaste
Option deaktiviert, auch wenn sie zuvor aktiviert war.'paste'
sollte so kurz wie möglich aktiv sein. Viele Funktionen (einschließlich Karten) werden deaktiviert, da nur verhindert werden soll, dass eingefügter Text falsch interpretiert wird. Daher denke ich, dass die angeführte Anforderung eigentlich nicht notwendig sein sollte.Das heißt, es ist eigentlich ganz einfach einzufügen, ohne dass man es einstellen muss
'paste'
. Wenn Sie gvim ausführen oder+xterm_clipboard
Console Vim verwenden, können Sie es einfach"+p
zum Einfügen aus der Zwischenablage des Betriebssystems verwenden.Das Problem des automatischen Einrückens beim Einfügen tritt tatsächlich nur in zwei Szenarien auf. Einfügen des Inhalts eines Registers im Einfügemodus (
<C-r>+
) oder Einfügen mit mittlerer Maustaste.Anstatt den Inhalt eines Registers im Einfügemodus einzufügen, wird durch Einfügen aus dem Register im normalen Modus das Neuformatierungsproblem vermieden.
Wenn Sie mit der Maus mit der mittleren Maustaste auf Einfügen klicken möchten, verwenden Sie die
'mouse'
Option, damit Vim anstelle des Terminals den mittleren Mausklick ausführt. Vim fügt dann den Inhalt wörtlich ein, anstatt den eingehenden Text als getippt zu interpretieren.quelle
'paste'
ist das ja vorher nicht aktiv, aber darüber möchte ich nicht nachdenken müssen. Ich arbeite oft in einem Vim, der keinen Zugriff auf die X-Zwischenablage oder die Maus hat, entweder weil mein Vim-Build nicht über diexterm_clipboard
Funktion verfügt, oder weil ich z. B. in einer Bildschirmsitzung arbeite, die gerade an eine angehängt ist X-Terminal.i
, ich frage nicht, wie man dies parametrisiert) und den Wert der Option bei Rückkehr aus dem Einfügemodus wiederherstellt."*p
oder"+p
aus den Zwischenablagen einfügen, aber ich möchte die Einfügefunktionen des Systems nicht verwenden"), und dann ist diese Antwort unnötig. Oder Sie nicht, und dann denke ich, dass diese Antwort hier ihren Platz hat.Persönlich verwende ich yoaus genau diesem Grund die Tastenkombination von Tim Popes exzellentem Plug-in , das keine Beeinträchtigungen aufweist . Aus seiner Dokumentation:
Es mag übertrieben sein, das Plugin einfach für Ihre Frage zu installieren, aber ich finde, es bietet auch eine Fülle anderer nützlicher Tastenkombinationen (weitere Informationen in der README ).
quelle
Mit Vim 8+ unter Linux oder Mac können Sie jetzt einfach das native Einfügen des Terminals (z. B. mittlere Maustaste
ctrl+shift+V
in Gnomecmd+V
auf Mac) verwenden, wenn das Terminal das Einfügen in Klammern unterstützt. Drücken Sie nichti
für den Einfügemodus.Der Inhalt der Zwischenablage Ihres Betriebssystems wird eingefügt, die Leerzeichen und Tabulatoren bleiben erhalten, ohne dass ein automatischer Einzug hinzugefügt wird. Es ist gleichbedeutend mit der alten
:set paste
,i
,ctrl+shift+V
,esc
,:set nopaste
Methode.Sie müssen nicht einmal die
+clipboard
oder+xterm_clipboard
vim-Funktionen mehr installieren. Diese Funktion wird als "Einfügen in Klammern" bezeichnet. Weitere Informationen finden Sie unter /programming/2514445/turning-off-auto-indent-when-pasting-text-into-vim/56781763#56781763quelle