Wie kann ich den Code als Originalquelle formatieren, wenn ich ihn in vim einfüge?


37

Wenn ich Code von Webseiten kopiere und in VIM einfüge, wird er wie folgt zu einem Chaosstil wie einer Leiter

xxxxxx
   xxxxxx
      xxxxxx
         xxxxxxxxxx

Da es so regelmäßig durcheinander gebracht wurde, denke ich, dass mit meinem etwas nicht stimmt, .vimrcwas wie folgt lautet:

set number
set nocompatible
set nowritebackup
set noswapfile
syntax on
filetype indent on
filetype plugin on
filetype on
set background=light
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions=T
set fileencodings=utf-8,prc
set ruler
set incsearch
map gs :%s
set t_Co=256
:colorscheme evening
filetype plugin indent on

Normalerweise schreibe ich Python in VIM. Und Hilfe wäre dankbar.


1
Vielen Dank. Das hat mich jahrelang geärgert, und ich bin nie dazu gekommen, jemanden danach zu fragen. +1.
DevSolar

Antworten:


50

Tun Sie dies vorher:

:set paste

Dann danach:

:set nopaste

Nicht benötigt für gvim; Diese werden beim Einfügen automatisch aktiviert und deaktiviert.
Benjamin Bannier

Irgendeine Idee, warum das so ist?
Nathan Fellman

1
Nur raten: Plain vim ist nur für die Befehlszeile gedacht und "weiß" nichts über die Zwischenablage. Es nimmt das "Einfügen" als Eingabezeichenfolge und wendet das automatische Einrücken an. Die GUI-fähige gvim "weiß" möglicherweise, dass die eingehenden Daten aus der Zwischenablage stammen, und deaktiviert daher das automatische Einrücken für diesen Zweck.
DevSolar

Das ist richtig. Das Terminal behandelt die "Einfügen" -Operation als rohe Zeicheneingabe.
Ignacio Vazquez-Abrams

Dies ist kein reines VIM-Problem. Sie können einen ähnlichen Effekt erhalten, wenn Sie ihn in einer Eingabeaufforderung in den alten DOS-Editor einfügen. Dieses Programm scheint in Windows 7 64-Bit zu fehlen - vermutlich, weil es sich wirklich um eine alte 16-Bit-DOS-App handelt und das mühsame Aktualisieren nicht wert war. Es ist jedoch in Windows XP, und das Einfügen von (1) funktioniert sehr langsam, indem die Zeichen für Zeichen eingegeben werden, und (2) verursacht ein echtes Durcheinander.
Steve314

16

http://vim.wikia.com/wiki/Toggle_auto-indenting_for_code_paste

Schaltet die automatische Einrückung für das Einfügen von Code ein

Hintergrund

Wenn Sie zum Einfügen von Text Vim-Befehle verwenden, geschieht nichts Unerwartetes. Das Problem tritt nur beim Einfügen aus einer anderen Anwendung auf und nur, wenn Sie keine GUI-Version von Vim verwenden. In einer Konsolen- oder Terminalversion von Vim gibt es kein Standardverfahren zum Einfügen von Text aus einer anderen Anwendung. Stattdessen kann das Terminal das Einfügen durch Einfügen von Text in den Tastaturpuffer emulieren, sodass Vim denkt, dass der Text vom Benutzer eingegeben wurde. Nach jedem Zeilenende kann Vim den Cursor bewegen, sodass die nächste Zeile mit demselben Einzug beginnt wie die letzte. Dies ändert jedoch den Einzug, der sich bereits im eingefügten Text befindet.

Einfügen umschalten

Fügen Sie Folgendes in Ihr vimrc ein (ändern Sie den gewünschten Schlüssel):

set pastetoggle=<F2>

So fügen Sie aus einer anderen Anwendung ein:

  • Starten Sie den Einfügemodus.
  • Drücken Sie F2 (schaltet die Einfügeoption ein).
  • Verwenden Sie Ihr Terminal, um Text aus der Zwischenablage einzufügen.
  • Drücken Sie F2 (schaltet die Einfügeoption aus).

Der vorhandene Einzug des eingefügten Textes bleibt dann erhalten.

Sie müssen den Einfügemodus nicht zuerst starten. Wenn Sie sich jedoch im normalen Modus befinden und ein Mapping für F2 haben, wird dieses Mapping angewendet und die Funktion 'pastetoggle' wird nicht ausgeführt.

Einige Leute mögen das visuelle Feedback, das in der Statuszeile von der folgenden Alternative für Ihr vimrc angezeigt wird:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

In der ersten Zeile wird eine Zuordnung festgelegt, sodass durch Drücken von F2 im normalen Modus die Option "Einfügen" invertiert und anschließend der Wert dieser Option angezeigt wird. In der zweiten Zeile können Sie im Einfügemodus F2 drücken, um das Einfügen ein- und auszuschalten. In der dritten Zeile wird angezeigt, ob im Einfügemodus "Einfügen" aktiviert ist.


1
+1 für die Hotkey-Lösung. Für die Nicht-Zu-Feste in VIM (wie ich), die bereits die F-Tasten auf etwas anderes (wie mich) abgebildet haben, wäre <C-F2> Strg-F2 ...
DevSolar

ausgezeichnet - ich benutze das jetzt
hoju

Warum ordnen Sie nicht einfach die Einfügen-Tasten wie <S-Einfügen> oder <Strg + V> zusammen mit ihren ursprünglichen Funktionen automatisch zu? Oder schreiben Sie eine Funktion, die das Einfügen deaktiviert, wenn in Sekundenschnelle mehr als ein paar eingegebene Zeichen in den Puffer geschrieben werden. Für mich ist das natürlich nur eine Idee. Ich habe fast ALLE meine Tasten anderen Elementen zugeordnet, das ist also ein Problem Ich habe sogar eine Tastatur mit 12 F-Tasten und + 15 weiteren F-Tasten (G-Tasten) und damit drei Ebenen, was immer noch nicht ausreicht :), aber das bin nur ich. Das einzige Problem ist, das Rechtsklick-Menü, das keine Esc-Sequenzen sendet, um einen Start-of-Paste-Vorgang zu signalisieren ...
osirisgothra

2

Es ist der Autoindent, der mit dir herumspielt.

set autoindent
set smartindent

Versuchen Sie, sie zu deaktivieren, wenn Sie Ihren Code ausschneiden und einfügen, und aktivieren Sie sie dann erneut, wenn Sie fertig sind.


-2

Der geringste Aufwand, um dies zu erreichen, ist (kann eingesetzt werden .vimrc):

:set paste

Dann fügen Sie Ihren Code ein.


3
Die 'paste'Option sollte niemals fest eingestellt sein. Es werden viele Dinge deaktiviert, einschließlich Zuordnungen und Abkürzungen. Außerdem deckt eine vorherige Antwort bereits die 'paste'Option ab.
Heptite

2
Willkommen bei Super User! Dies dupliziert eine vorhandene Antwort und fügt keinen neuen Inhalt hinzu. Bitte posten Sie keine Antwort, es sei denn, Sie haben tatsächlich etwas Neues beizutragen.
Toby Speight
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.