Jak mogę zachować kod sformatowany jako oryginalne źródło, kiedy wkleję go do vima?

37

Kiedy kopiuję jakiś kod ze stron internetowych i wklejam go do VIM, okazuje się, że staje się bałaganem, jak drabina, w następujący sposób

xxxxxx
   xxxxxx
      xxxxxx
         xxxxxxxxxx

Ponieważ jest tak regularnie pomieszany, więc myślę, że może coś jest nie tak z moim, .vimrcjak poniżej:

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

Zwykle piszę Python w VIM i pomoc byłaby mile widziana.

SpawnST
źródło
1
Dzięki. Przez lata mnie to denerwowało i nigdy nie udało mi się nikogo o to zapytać. +1.
DevSolar

Odpowiedzi:

50

Zrób to wcześniej:

:set paste

Następnie po:

:set nopaste
Ignacio Vazquez-Abrams
źródło
Nie potrzebne do gvim; włącza je i wyłącza automatycznie podczas wklejania.
Benjamin Bannier
jakiś pomysł, dlaczego tak jest?
Nathan Fellman
1
Zgaduję: Plain vim jest tylko wierszem poleceń i nie „wie” o schowku. Bierze „wklej” jako sekwencję znaków wejściowych i stosuje automatyczne wcięcie. Gvim obsługujący GUI może „wiedzieć”, że przychodzące dane pochodzą ze schowka, a tym samym wyłączyć automatyczne wcięcie w tym celu.
DevSolar
To jest poprawne. Terminal traktuje operację „wklej” jako surowe wprowadzanie znaków.
Ignacio Vazquez-Abrams
To nie jest czysto problem z vimem - podobny efekt można wkleić do starego edytora DOS w wierszu polecenia. Wydaje się, że tego programu brakuje w 64-bitowym systemie Windows 7 - prawdopodobnie dlatego, że to naprawdę stara 16-bitowa aplikacja DOS i nie warto było go aktualizować. Jest to jednak w systemie Windows XP i wklejenie w to (1) działa bardzo powoli, odgrywając rolę znak po znaku, a (2) robi prawdziwy bałagan.
Steve314,
16

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

Przełącz automatyczne wcięcie dla wklejania kodu

tło

Jeśli użyjesz poleceń Vima do wklejenia tekstu, nic nieoczekiwanego nie nastąpi. Problem pojawia się tylko podczas wklejania z innej aplikacji i tylko wtedy, gdy nie używasz GUI w wersji Vima. W wersji Vima na konsolę lub terminal, nie ma standardowej procedury wklejania tekstu z innej aplikacji. Zamiast tego terminal może emulować wklejanie, wstawiając tekst do bufora klawiatury, więc Vim uważa, że ​​tekst został wpisany przez użytkownika. Po zakończeniu każdego wiersza Vim może przesunąć kursor, więc następny wiersz zaczyna się od tego samego wcięcia co ostatni. Zmieni to jednak wcięcie już w wklejonym tekście.

Wklej przełącznik

Umieść w vimrc następujące polecenie (zmień na dowolny klucz, jaki chcesz):

set pastetoggle=<F2>

Aby wkleić z innej aplikacji:

  • Uruchom tryb wstawiania.
  • Naciśnij F2 (przełącza opcję „wklej” na).
  • Użyj terminala, aby wkleić tekst ze schowka.
  • Naciśnij F2 (wyłącza opcję „wklej”).

Wtedy istniejące wcięcie wklejonego tekstu zostanie zachowane.

Nie musisz najpierw uruchamiać trybu wstawiania, ale jeśli jesteś w trybie normalnym i masz mapowanie dla F2, to mapowanie zostanie zastosowane, a funkcja „pastetoggle” nie będzie działać.

Niektórym podoba się wizualna informacja zwrotna wyświetlana w linii statusu przez następującą alternatywę dla twojego vimrc:

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

Pierwszy wiersz ustawia odwzorowanie tak, że naciśnięcie F2 w trybie normalnym odwróci opcję „wklej”, a następnie wyświetli wartość tej opcji. Druga linia pozwala naciskać F2 w trybie wstawiania, aby włączać i wyłączać „wklejanie”. Trzeci wiersz umożliwia wyświetlenie, czy „wklejanie” jest włączone w trybie wstawiania.

aXqd
źródło
1
+1 za rozwiązanie skrótu. Dla niezbyt silnego w VIM (jak ja), który już zamapował klawisze F na coś innego (jak ja), <C-F2> byłoby Ctrl-F2 ...
DevSolar
doskonale - używam teraz
hoju
dlaczego nie po prostu zamapować klawiszy wklej, aby zrobić to automatycznie, takich jak <S-Insert> lub <Ctrl + V>, wraz z ich oryginalnymi funkcjami? Lub napisz funkcję, która wyłącza wklejanie, gdy więcej niż kilka znaków wejściowych jest zapisywanych w buforze w ciągu sekundy, to tylko pomysł, oczywiście dla mnie mam prawie WSZYSTKIE moje klucze zamapowane na inne rzeczy, więc to jest ból , Mam nawet klawiaturę z 12 klawiszami F i + 15 dodatkowymi klawiszami F (klawisze G), a dzięki temu trzy poziomy, co wciąż nie wystarcza :) ale to tylko ja. Jedyny problem polega na tym, że menu prawego przycisku myszy, które nie jest wysyłane, aby wysłać sekwencję esc, sygnalizuje rozpoczęcie operacji wklejania ...
osirisgothra
2

Jest to autoindent, który z tobą bawi.

set autoindent
set smartindent

Spróbuj je wyłączyć podczas wycinania i wklejania kodu, a następnie włącz je ponownie po zakończeniu.

Johan
źródło
-2

Najmniejszy wysiłek, aby to osiągnąć, to (można włożyć .vimrc):

:set paste

Następnie wklej swój kod.

h2obro
źródło
3
Ta 'paste'opcja nigdy nie była przeznaczona na stałe. Wyłącza wiele rzeczy, w tym mapowania i skróty. Poza tym poprzednia odpowiedź obejmuje już tę 'paste'opcję.
Heptyt
2
Witamy w Super User! To powiela istniejącą odpowiedź i nie dodaje żadnej nowej treści. Nie publikuj odpowiedzi, chyba że masz coś nowego do dodania.
Toby Speight