Hören Sie auf, eine Auswahl als Text einzufügen!


10

Ich benutze VI und VIM seit Jahren (30 oder mehr) (in xterms, nicht in einem eigenen Fenster, gvim) und ich habe eine riesige Bibliothek von vim- Befehlen , die ich vim mit der mittleren Maustaste als Auswahl gebe.

Zum Beispiel würde ich oft Dinge tun wie ...

 vi {many_hundreds_of_files}
   paste vim commands using mouse - one paste per file.

Die Auswahl würde viele VIM-Befehle enthalten, um beispielsweise Tests zu ersetzen, zu formatieren, Linien zu verschieben usw. usw. usw. und endet normalerweise mit: w und: next VIM-Befehlen am Ende der Auswahl, vim ist also bereit für mich, wieder in die nächste datei einzufügen. Auf diese Weise kann ich eine große Anzahl von Dateien auf SEHR komplexe Weise aktualisieren, ohne dass dafür spezielle Skripte (z. B. Perl-In-Place-Bearbeitung) erforderlich sind.

Einige dieser vim-Befehlspasten sind mehr als 200 Zeilen lang (gespeichert in Textdateien, die ich auf dem Bildschirm eingeblendet habe, und "Alles kopieren"! Diese nehmen eine Menge Änderungen an der Menge von Tausenden von Dateien vor, die ich neu formatiere. Aber Nur für den spezifischen Satz von Dateien, nicht für meine tägliche Arbeit. EG: Massenreformierung für Text- / Datendateien.

Das Problem...

Während meines letzten System-Patches (Fedora 25) fügt vim jetzt die Mausauswahl als TEXT und nicht als vim-Befehle ein, und ich kann sie scheinbar nicht stoppen!

Auf einem anderen System (Fedora 24) funktioniert es immer noch einwandfrei.

Wenn ich als Text einfügen möchte, gehe ich vor dem Einfügen in den Einfügemodus! Ich möchte nicht, dass VIM automatisch eine Auswahl als Text einfügt, wenn es sich nicht im Einfügemodus befindet. Ich verstehe, dass dies als Sicherheitsmerkmal gedacht war, aber für mich ist es ein großes Usability-Problem.

Ich habe versucht, Terminfo-Einträge (xterm-256color) von einem Computer zurück zu datieren, der dies nicht tut (insbesondere den "kmous" -Termino-Eintrag). Ich habe mir auch die vim ": set mouse =" Einstellung angesehen (die null ist!). Ich weiß nicht, ob es das xterm (zweifelhaft) oder etwas ist, das sich in VIM geändert hat (wahrscheinlich), und Änderungsprotokolle und Google waren nicht hilfreich.

Nichts scheint mir jedoch das alte Verhalten zu bringen.


Fand einen anderen Benutzer mit dem gleichen Problem, weniger Details, keine Lösung unix.stackexchange.com/questions/346293/…
Anthony

1
Ich bezweifle, dass es sich eher um eine vimÄnderung handelt: Wie kann vimin einem xtermWissen etwas über die Tastatur eingegeben oder über die Maustaste eingefügt werden? Ich kenne einen solchen Mechanismus nicht. Auf der anderen Seite xtermweiß, dass es ausgeführt wird, vimso dass es entscheiden könnte, das Einfügen mit iund <esc> zu umgeben. Versuchen Sie (a) mit einem anderen Terminalfenster und (b) einer Kopie vimmit einem anderen Namen. Dies sollte helfen, die Ursache des Problems einzugrenzen.
Philippos

Ich stimme @philippos zu. Vielleicht ist etwas anderes als vimdie Entführung Ihrer Einfügemethode. Versuchen Sie vielleicht, ssh'ing oder telneting in Ihren Computer und fügen Sie auf diese Weise ein. Wenn Sie eine Windows-Box haben, verwenden Sie Putty, um ssh in Ihren Fedora25-Computer zu integrieren und auf diese Weise einzufügen.
Jim U

Nicht direkt verwandt, aber gvim unter Windows verhält sich seit Jahren so. Wenn Sie gvim installieren, erhalten Sie zwei ausführbare Dateien gvim.exe(graphical-vim) und die Befehlszeile vim.exe. Fügen Sie "itext" in gvim.exe ein und Sie erhalten itext. Fügen Sie es in die vim.exe ein und Sie erhaltentext
Jim U

1
@Philippos Dieser Mechanismus könnte in Klammern eingefügt werden . Ich weiß nicht, wie Vim es unterstützen könnte, vielleicht die pastetoggleOption?
Gilles 'SO - hör auf böse zu sein'

Antworten:


12

Nachdem ich viele Webseiten durchgesehen hatte und viele Hinweise gegeben hatten, die nicht zu funktionieren schienen, fand ich einen Hinweis (zusätzlicher Text um eine Paste), der mich zur Ursache und zur Lösung des Problems führte.

Es scheint, dass vim eine Reihe von 'gefälschten' Termcap-Einträgen eingebaut hat, die es verwendet, wenn es bestimmte Terminals erkennt (und manchmal falsch wird, obwohl es in diesem Fall nicht falsch war).

Termcap-Einstellungen in vim sind zahlreich. Als solche werden sie NICHT in einer normalen Einstellungsliste ": set all" angezeigt. Um sie zu sehen, müssen Sie ": set termcap" verwenden. Die spezifische 'nicht standardmäßige' Termcap-Einstellung ist "t_BE" (siehe vim ": help t_BE"). In der integrierten Hilfe "xterm-bracketed-paste" wird diese interne Cap-Einstellung für VIM erläutert.

Wenn diese Einstellung definiert ist (in diesem Fall von Vim, nicht termcap / terminfo), sendet vim sie beim Start an xterm, wodurch xterm angewiesen wird, spezielle Codes um jeden Text hinzuzufügen, den der Benutzer aus einer externen Quelle einfügt. Wenn vim diese sieht, wechselt es automatisch nicht nur in den Einfügemodus, sondern setzt auch den Einfügemodus, um den Text nicht zu formatieren.

Letzteres (Paste-Modus) finde ich SEHR nützlich! Ersteres hat mir die ganze Mühe gemacht.

Die Brute-Force-Lösung deaktiviert das Einfügen in Klammern, indem dies zur ".vimrc" hinzugefügt wird.

:set t_BE=

Eine alternative Lösung ....

Anstatt das Einfügen in Klammern vollständig zu deaktivieren, stoppen Sie vim, um Maßnahmen zu ergreifen, wenn die Startsequenz eines Terminal-Einfügens (über die Maus) im Befehls- oder Normalmodus angezeigt wird.

:nmap <PasteStart>  <NOP>
:nmap <PasteEnd>    <NOP>
:cmap <PasteStart>  <NOP>
:cmap <PasteEnd>    <NOP>

Dies bedeutet, dass vim beim Einfügen von Text im Einfügemodus nicht versucht, Text einzuräumen (einzurücken), der höchstwahrscheinlich bereits eingerückt ist.

Dies bedeutet nicht, dass ich den Einfügemodus nicht mehr umschalten muss, da ich auch den Umschaltmodus einfüge (der F2 zugeordnet ist), um "showbreak" und "listchars" (umbrochene Zeilen, Tabulatoren, Leerzeichen ohne Unterbrechungen und) anzuzeigen zusätzliche Leerzeichen am Zeilenende). Ich müsste vim immer noch in diesen Modus versetzen, wenn ich eine Mausauswahl treffen möchte, um sie an anderer Stelle einzufügen.

Kommentare und Vorschläge zu den Lösungen sind willkommen.


Dies scheint auch in Cygwin Vm zu funktionieren, löst aber leider nicht das Problem in VS Vim
James Robinson

@ JamesRobinson Höchstwahrscheinlich ist es ein anderes eingebautes Terminal für VS
Anthony
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.