Verwenden Sie immer: Paste setzen, ist es eine gute Idee?

19

In einem Terminal-Vim führt das Einfügen von Daten aus der Zwischenablage häufig zu einer Verfälschung des Codeeinzugs. Ich wusste nur, ob ich :set pasteden Einzug nicht kaputt mache. Sollte ich es nach dem Einfügen von Daten :set nopasteerneut tun ? Was ist, wenn ich es nicht tue, welches Problem kommt?

Benjamin
quelle
Was ist mit dir selbst zu versuchen? Oder die Dokumentation lesen ?
Romainl
1
Siehe auch "Eingeklammerter Einfügemodus" in meiner Antwort auf "Code in Terminalfenster in vim einfügen " stackoverflow.com/a/7053522/754997 . Wenn Ihr Terminal-Emulator dies unterstützt, können Sie festlegen, dass Vim automatisch in den Einfügemodus wechselt, wenn Sie Text in das Terminal einfügen.
Chris Seite
1
@romainl Ich finde es ziemlich plausibel, dass sowohl 1) versucht als auch gewartet wird, ob es negative Konsequenzen gibt, wenn immer Set Paste (+ - Nopaste) verwendet wird, und 2) RTFM-Ing (als Benutzer auf niedrigerer oder mittlerer Ebene wie dem OP). sind weniger nützlich, als diejenigen zu fragen, die Erfahrung mit den Optionen haben. Hier nachzufragen scheint klüger zu sein, und dies zu dokumentieren, wird anderen helfen.
belacqua

Antworten:

5

Wie andere schon geschrieben haben, möchten Sie das Einfügen-Set nicht verlassen. Ich wollte nur darauf hinweisen, dass Sie mit einem guten Terminal-Emulator und einem ordnungsgemäß kompilierten und konfigurierten Programm das vimEinfügen nicht ändern müssen. Sie benötigen einen guten Terminal-Emulator wie xterm oder GNOME Terminal, vim mit der X11-Funktion und der Option 'mouse', die auf 'a' gesetzt ist. Dann vimwird "wissen", wann Sie mit der Maus einfügen und wird effektiv die "Einfügen" -Option für Sie festlegen und deaktivieren.

Eine Möglichkeit, eine vimmit der X11-Funktion zu erhalten, besteht darin, sie gvimmit der -vOption auszuführen oder einen Alias ​​zu erstellen.

alias vim='gvim -v'

Dann setzen

set mouse=a

in deinem ~ / .vimrc.

garyjohn
quelle
Wenn ich mouse = a setze, kann ich keinen Text kopieren. "Kopieren" ist im Kontextmenü und im App-Menü ausgegraut.
Lee Daniel Crocker
@LeeDanielCrocker: CopyWird ausgegraut oder gar nicht angezeigt, es sei denn, es wurde Text ausgewählt. Wie wählen Sie den zu kopierenden Text aus?
Garyjohn
Nur mit der Maus. Zu Ihrer Information, "y" funktioniert einwandfrei ... reißt den Text herunter und kopiert ihn auf die Systemtastatur. Es sind nur die Menüs, die nicht funktionieren. Wenn die Maus auf "r" eingestellt ist, funktionieren die Menüs, die Maus enthält jedoch die Zeilennummern. Alles in allem kann ich also mit der Maus leben = a, ich muss nur daran denken, zu reißen anstatt zu kopieren.
Lee Daniel Crocker
7

Dieser Beitrag hat meine Lieblingsantwort, https://coderwall.com/p/if9mda/automatically-set-paste-mode-in-vim-when-pasting-in-insert-mode

Wenn Sie im Einfügemodus beginnen und Strg + Umschalt + V oder mit der rechten Maustaste auf Einfügen klicken, erkennt Vim, dass dies von einem Terminal stammt, und stellt den Einfügemodus automatisch ein. Deaktiviert ihn anschließend, damit Sie keine neu zugewiesenen Tasten verlieren (was im Einfügemodus nicht funktioniert, weil Rohdaten geschrieben werden) und Sie sind wieder in einem "gesunden" Zustand, wenn es fertig ist.

Für nur vim (setzen Sie in Ihrem .vimrc)

let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

Wenn du vim unter Tmux benutzt (geht immer noch in .vimrc)

function! WrapForTmux(s)
  if !exists('$TMUX')
    return a:s
  endif

  let tmux_start = "\<Esc>Ptmux;"
  let tmux_end = "\<Esc>\\"

  return tmux_start . substitute(a:s, "\<Esc>", "\<Esc>\<Esc>", 'g') . tmux_end
endfunction

let &t_SI .= WrapForTmux("\<Esc>[?2004h")
let &t_EI .= WrapForTmux("\<Esc>[?2004l")

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
dragon788
quelle
Ich nehme an, eine der let &t_SI .= "\<Esc>[?xxxxx"Zeilen erkennt die Tastenkombination? Funktioniert dies auch für Mac, wenn man die verschiedenen Verknüpfungen berücksichtigt?
Doub1ejack
@ doub1ejack Diese erkennen tatsächlich die Xterm-Escape-Sequenzen, nicht wie sie genannt wurden (dh 2004h ist ein Einfügebeginn), so lange Ihr Terminal die Xterm-Schlüsselcodes unterstützt und sie an Vim weiterleitet, sollte es auf Mac einwandfrei funktionieren.
Dragon788
Oh mein Gott. Sie sind mein Held. Ich habe so getippt: setze nopaste so oft g'd.
Maxwell
3

Wie Romainl angedeutet hat, wird in der Dokumentation erklärt, dass durch das Einstellen der 'paste'Option mehrere andere Optionen deaktiviert werden. Sie werden sicherlich feststellen, dass dies eher früher als später Probleme für Sie verursacht. Aus diesem Grund gibt es die 'pastetoggle'Option. Sehen:

:help 'paste'
:help 'pastetoggle'
Heptit
quelle
1

Wenn etwas existiert, muss es seine Bedeutung haben. Sie sollten sich die vim-Dokumentation ansehen, die sehr nützlich ist.

  :help 'paste'
  :help 'pastetoggle'

Wenn Sie einmal gelesen haben, möchten Sie vielleicht Folgendes:

" Toggle paste mode
"   (prefer this over 'pastetoggle' to echo current state)
nmap <leader>p :setlocal paste! paste?<cr>

Ich hoffe, Sie finden diesen Beitrag nützlich :)

Dzung Nguyen
quelle
1

Beim Einfügen in vim denkt IIRC im Wesentlichen, dass Sie alle diese Zeichen selbst eingegeben haben. Wenn also die automatische Einrückung aktiviert ist, werden Inhalte für Sie eingerückt, aber der eingefügte Text enthält normalerweise bereits Einrückungen, sodass die Einrückung tatsächlich "durcheinander" ist. Wenn Sie in den Einfügemodus wechseln, werden Dinge wie das automatische Einrücken deaktiviert.

Wenn Sie das automatische Einrücken während der Eingabe bevorzugen, sollten Sie es nach dem Einfügen wieder auf nopaste setzen. Probieren Sie es aus und beachten Sie, wie Sie alle Einrückungen im Einfügemodus manuell vornehmen müssen.

Sumudu Fernando
quelle