Legen Sie die Einfügeoption fest, jedoch nur für eine Einfügung

16

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 iBefehl) 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_clipboardFunktion kompiliert oder wird in einem Terminal wie Screen oder über SSH ausgeführt, das es vom Ambient X-Server isoliert.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Ich mag deine Frage (ich war selbst oft dort). Ist es jedoch nicht einfacher, aus der Liste einzufügen +oder zu *registrieren?
Du
@yo ' Nur wenn sie funktionieren . Was für meine Verwendung von Vim oft nicht der Fall ist.
Gilles 'SO- hör auf böse zu sein'

Antworten:

15

Probieren Sie es aus:

function! Paste_Func()
    let s:inPaste = &paste
    if !s:inPaste
        set paste
    endif

    echom s:inPaste
    augroup paste_callback
        autocmd!
        autocmd InsertLeave <buffer> call Paste_End()
    augroup END

    startinsert
endfunction

function! Paste_End()
    augroup paste_callback
        autocmd!
    augroup END
    augroup! paste_callback

    if !s:inPaste
        set nopaste
    endif
endfunction

map _i :call Paste_Func()<cr>

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

Tschad
quelle
Dies scheint auf dem richtigen Weg zu sein (insbesondere hatte ich keine Ahnung, wie ich eine Strecke des Einfügens mit normalen Weltkommandos "einklammern" sollte). Vielen Dank. Es ist jedoch nicht ganz richtig und ich sehe nicht, wo das Problem liegt: Nachher ist _idie pasteOption deaktiviert, auch wenn sie zuvor aktiviert war.
Gilles 'SO- hör auf böse zu sein'
Sie haben Recht! Ich bin mir ziemlich sicher, dass ich das getestet habe, aber ich muss etwas geändert haben. Ich habe das Skript in der Veröffentlichung aktualisiert. Überprüfen Sie, ob es jetzt für Sie funktioniert.
Tschad,
4

außer dass ich mit dem 'paste'noch aktiven enden möchte, wenn es vorher aktiv 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_clipboardConsole Vim verwenden, können Sie es einfach "+pzum 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.

Jamessan
quelle
2
Nichts davon beantwortet meine Frage. Ich habe aus einem Grund explizite Anforderungen gestellt! Normalerweise '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 die xterm_clipboardFunktion verfügt, oder weil ich z. B. in einer Bildschirmsitzung arbeite, die gerade an eine angehängt ist X-Terminal.
Gilles 'SO- hör auf böse zu sein'
@ Gilles Könnten Sie dann erklären, wie Sie einfügen? Das sind relevante Informationen, um eine Antwort liefern zu können, die diese Aktion mit dem abschließt, was Sie tun möchten.
Jamessan
1
Mein grundlegender Anwendungsfall ist das Einfügen mit der mittleren Maustaste oder mit Umschalt + Einfügen. Das ist jedoch nicht wirklich relevant: Der Kern der Frage ist, wie man eine Option einstellt, in den Einfügemodus wechselt (mit i, ich frage nicht, wie man dies parametrisiert) und den Wert der Option bei Rückkehr aus dem Einfügemodus wiederherstellt.
Gilles 'SO- hör auf böse zu sein'
1
@ Gilles Der Kern Ihrer Frage, wie in diesem Kommentar dargelegt, ist mir viel klarer als Ihre ursprüngliche Frage. Vielen Dank.
Jamessan
1
@Gilles Es ist nicht relevant für Sie , aber es kann für zukünftige Besucher relevant sein. Daher können Sie es entweder in die Frage selbst einfügen ("Ich weiß, ich kann es verwenden "*poder "+paus 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.
yo‘
4

Persönlich verwende ich yoaus genau diesem Grund die Tastenkombination von Tim Popes exzellentem Plug-in , das keine Beeinträchtigungen aufweist . Aus seiner Dokumentation:

Für 'Einfügen' wurde keine Umschaltfunktion bereitgestellt, da der typische Anwendungsfall für das Umwickeln einer einzelnen Einfügung so verschwenderisch ist: Sie schalten zweimal um, aber Sie fügen nur einmal ein (YOPO). Drücken Sie stattdessen yooder yO, um |o|oder |O|mit bereits festgelegtem Einfügen aufzurufen . Wenn Sie den Einfügemodus verlassen, wird "Nopaste" automatisch eingestellt.

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

Andrew Ferrier
quelle
1

Mit Vim 8+ unter Linux oder Mac können Sie jetzt einfach das native Einfügen des Terminals (z. B. mittlere Maustaste ctrl+shift+Vin Gnome cmd+Vauf Mac) verwenden, wenn das Terminal das Einfügen in Klammern unterstützt. Drücken Sie nicht ifü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 nopasteMethode.

Sie müssen nicht einmal die +clipboardoder +xterm_clipboardvim-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#56781763

weises Glück
quelle