Wyłączanie automatycznego wcięcia podczas wklejania tekstu do Vima

Staram się nauczyć Vima.

Kiedy wklejam kod do mojego dokumentu ze schowka, dostaję dodatkowe spacje na początku każdej nowej linii:

line
  line
    line

Wiem, że można wyłączyć auto indent, ale nie mogę go uruchomić, ponieważ mam inne ustawienia sprzeczne lub coś (które wyglądają dość oczywiste w moim .vimrc, ale chyba nie ma znaczenia, kiedy je wyjmę).

Jak wyłączyć automatyczne wcięcia, gdy wklejam kod, ale nadal mam vim Auto indent, gdy jestem piszesz kod? Oto mój plik .vimrc:

set expandtab  
set tabstop=2  
set shiftwidth=2  
set autoindent  
set smartindent  
set bg=dark  
set nowrap  
Author: dreftymac, 2010-03-25

19 answers

Update: lepsza odpowiedź tutaj: https://stackoverflow.com/a/38258720/62202

Aby wyłączyć autoindent podczas wklejania kodu, istnieje specjalny tryb "wklejania".

Typ

:set paste

Następnie wklej swój kod. Zauważ, że tekst w podpowiedzi mówi teraz -- INSERT (paste) --.

Po wklejeniu kodu wyłącz Tryb wklejania, aby automatyczne wcięcia po wpisaniu działały ponownie poprawnie.

:set nopaste
Jednak zawsze uważałem to za uciążliwe. Dlatego ja map <F3> tak, że może przełączać się między trybami wklejania i nopaste podczas edycji tekstu! dodaję to do .vimrc
set pastetoggle=<F3>
 1729
Author: P Shved,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-20 14:56:29

Aby uniknąć niepożądanych efektów podczas wklejania, należy ustawić opcję:

set paste

Przydatne polecenie, aby mieć w swoim .vimrc jest set pastetoggle=<F10> lub innym przyciskiem, aby łatwo przełączać się między pastą a nopastem.

 250
Author: Jacob R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-31 07:38:47

Zwykle używam :r! cat, a następnie wklejam ( shift + insert ) Zawartość i CTRL+D.

Nie ma potrzeby włączania i wyłączania bezpośredniego użycia.

 121
Author: thegeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-30 12:50:15

Jeśli pracujesz lokalnie, możesz wkleić ze schowka systemowego sekwencję klawiszy:

"+p

Jest to odpowiednie polecenie vim, więc nie musisz się martwić o wejście w tryb wstawiania lub wyłączenie autoindent.

Oczywiście, jeśli pracujesz zdalnie (na przykład konsola przez SSH), to nie zadziała i powinieneś przejść :set noai, tryb wstawiania, wklejanie do konsoli, pozostawić insertmode, :set ai trasę, jak opisano w innym miejscu.

 77
Author: thomasrutter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-05 07:45:24

Użytkownicy komputerów Mac mogą uniknąć automatycznego formatowania, czytając bezpośrednio z tablicy za pomocą:

:r !pbpaste
 36
Author: maniacalrobot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-28 12:58:25

Oto post autorstwa kogoś, kto wymyślił, jak zmapować Zdarzenie wklejania, aby automatycznie włączyć tryb wklejania, a następnie wyłączyć. Działa u mnie w tmux/iTerm na MacOSX.

 18
Author: Von,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-08 20:30:22

Podczas gdy ustawienie trybu wklejania za pomocą paste/nopaste/pastetoggle jest całkowicie w porządku, nadal musisz ręcznie włączyć tryb wklejania przed wklejeniem i wyłączyć tryb wklejania po wklejeniu. Będąc leniwą osobą, którą jestem, poniżej znajduje się najlepsze rozwiązanie, jakie do tej pory znalazłem, które automatycznie przełącza tryb wklejania podczas wklejania.

Oto mała sztuczka, która wykorzystuje tryb wklejania w terminalu do automatycznie ustawia / wyłącza tryb wklejania Vima podczas wklejania. Put following w Twoim .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

Teraz możesz wkleić bez włączania/wyłączania trybu wklejania - jest to obsługiwane automatycznie dla Ciebie.

Source: Coderwall

 15
Author: thdoan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-08 04:00:35

Dodaj to do swojego ~/.vimrc, a będziesz musiał nacisnąć F2 przed i po wklejeniu:

set pastetoggle=<F2>
 12
Author: anh_ng8,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-22 17:27:05

Właśnie wkładam set clipboard=unnamed do mojego .vimrc. To sprawia, że domyślny bufor wklejania mapuje do schowka X.

Więc, jeśli zaznaczę kawałek tekstu w terminalu, mogę po prostu nacisnąć p, aby wkleić go do Vima. Podobnie, mogę wkleić rzeczy w Vimie (np. YY aby wkleić bieżącą linię do bufora) i kliknąć środkowym przyciskiem w dowolnym oknie, aby wkleić ją.

Nie wiem. Uważam, że to bardzo wygodne.
 9
Author: Soren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-20 11:15:37

Podczas pracy wewnątrz terminala wtyczka vim-bracketed-paste vim automatycznie obsłuży pasty bez konieczności naciśnięcia klawiszy przed lub po pastie.

Działa poprzez wykrywanie bracketed paste mode, który jest sekwencją ucieczki wysyłaną przez "nowoczesne" terminale kompatybilne z terminalami x-term, takie jak iterm2, gnome-terminal i inne terminale używające libvte. Jako dodatkowy bonus działa również dla sesji tmux. Używam go z powodzeniem z iTerm2 na Macu łączącym się z Linuksem serwer i korzystanie z tmux.

 9
Author: studgeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-09 03:53:21

Włóż to do swojego~/.vimrc i bądź szczęśliwy:

" enables :Paste to just do what you want
command Paste execute 'set noai | insert | set ai'

Edit: po namyśle, :r !cat jest o wiele lepszym podejściem, ponieważ jest krótkie, semantyczne i nie wymaga niestandardowego vimrc. Użyj tego zamiast tego!

 6
Author: Dergachev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-09 21:21:59

To działa dla mnie (case for + register, what i use like exchange buffer between aps):

imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>
 3
Author: Sergey Vakulenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-01 15:53:47

Chociaż :pastetoggle lub :paste i :nopaste powinny działać dobrze (jeśli są zaimplementowane-nie zawsze są, jak widać z dyskusji) Gorąco polecam wklejanie przy użyciu bezpośredniego podejścia "+p lub "*p i czytanie z "+r lub "*r:

Vim ma acess do dziesięciu typów rejestrów (:help registers) i pytający jest zainteresowany quotestar i {[10] } z sekcji

  1. Selection and drop registers "*, "+ oraz " ~

Użyj tych rejestrów do przechowywania i pobieranie zaznaczonego tekstu dla GUI. Zobacz quotestar i quoteplus. Gdy Schowek nie jest dostępny lub nie działa, zamiast tego używany jest rejestr bez nazwy. Dla systemów Unix Schowek jest dostępna tylko wtedy, gdy dostępna jest funkcja +xterm_clipboard. {Nie w Vi}

Zauważ, że istnieje tylko rozróżnienie między "* i " + dla Systemów X11.

:help x11-selection dodatkowo wyjaśnia różnicę * i +:

                                                  quoteplus quote+

Są trzy udokumentowane x selekcje: PRIMARY (co oczekuje się reprezentują bieżący wybór wizualny - jak w trybie wizualnym Vima), wtórny (który jest źle zdefiniowany) i schowka (który ma być używany do operacje wycinania, kopiowania i wklejania).

Z tych trzech, Vim używa PRIMARY podczas odczytu i zapisu "* register (stąd, gdy dostępne są wybory X11, Vim Ustawia domyślną wartość dla 'schowek ' z" autoselect"), oraz schowek podczas odczytu i zapisu" + Zarejestruj się. Vim nie ma dostępu do selekcji wtórnej.

Przykłady: (przyjmując domyślne wartości opcji)

  • Wybierz adres URL w trybie wizualnym w Vimie. Przejdź do przeglądarki i kliknij środkowy przycisk myszy w polu tekstowym URL. Wybrany tekst będzie wstawione (mam nadzieję!). Uwaga: w Firefoksie można ustawić middlemouse.contentloadurl preferuje true W about: config, wtedy wybrany adres URL zostanie użyty po naciśnięciu środkowego przycisku myszy w większości miejsca w oknie.

  • Zaznacz tekst w przeglądarce, przeciągając myszką. Przejdź do Vim i naciśnij środkowy przycisk myszy: zaznaczony tekst zostanie wstawiony.

  • Wybierz jakiś tekst w Vimie i zrób " + y. idź do przeglądarki, wybierz jakiś tekst w pole tekstowe przeciągając myszką. Teraz użyj prawego przycisku myszy i wybierz "Wklej" z menu podręcznego. Zaznaczony tekst jest nadpisywany przez SMS od Vim. Zauważ, że tekst w " + rejestr pozostaje dostępna podczas tworzenia wizualnej zaznaczenie, co sprawia, że inny tekst jest dostępny w rejestrze"*. To pozwala nadpisanie zaznaczonego tekstu.
 3
Author: codingdave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-18 06:20:48

Jeśli jesteś na komputerze mac, macvim wydaje się obsługiwać go dobrze bez konieczności przełączania wklejania.

Brew install macvim --override-system-vim

 2
Author: Marcus Ericsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-18 14:05:27

Przeczytaj ten artykuł: Włącz automatyczne wcięcia dla wklejania kodu

Niektórzy ludzie lubią wizualną informację zwrotną pokazaną w linii statusu za pomocą następującej alternatywy dla twojego vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode
 1
Author: d.danailov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-01 11:18:44

Najszybszym sposobem, jaki znam, aby szybko przejść do trybu wklejania-wstawiania dla jednorazowej pasty, jest tpope unimpaped , który zawiera yo oraz yO, prawdopodobnie mnemotechnika "otwierasz". Są one udokumentowane tylko w jego vimdoc, jako:

Przełącznik nie został zapewniony dla 'wklej', ponieważ typowy przypadek użycia owijanie pojedynczej wkładki jest tak marnotrawne: przełączasz się dwa razy, ale wklejasz tylko raz (YOPO). Zamiast tego Naciśnij yo lub yO, aby wywołać o LUB O z 'wklej' już ustawione. Opuszczenie trybu wstawiania automatycznie ustawia "nopaste".

 1
Author: Micah Elliott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-13 21:00:21

Innym sposobem na wklejenie jest <CR> i upuszczenie zawartości rejestru (tutaj rejestr globalny). Zobacz: :h i_ctrl-r i h i_CTRL-R_CTRL-O.

Z dokumentacji pomocy vim:
Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}

Aby wkleić zawartość do Vima bez automatycznego wcięcia, użyj <CR><CO>* w większości systemów uniksowych.

Uwaga: działa tylko wtedy, gdy Vim jest kompilowany z clipboard.

 0
Author: TheChetan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-16 11:17:37

Niestety znalazłem wspomnianą wtyczkę vim, która nie działa z iTerm2 3.0.15 ( szczerze mówiąc Nie wiem, czy zepsuła się na starszych wersjach) - ale znalazłem ten hack zamiast.

Map command-p do wklejania i używania klawiszy iterm2 vim. Oczywiście działa to tylko dla iTerm2.

Jak to działa. Używam "jk", aby wejść w tryb escape, więc będziesz również potrzebował:

: inoremap jk

W Twoim .vimrc.

Następnie po prostu wywołuje P, aby wejść w tryb wklejania, " +p, aby wkleić ze schowka a następnie P, aby wyłączyć tryb wklejania. hth.

Tutaj wpisz opis obrazka

 0
Author: Neil McGill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-16 01:05:46

From vim: ]p

Z zewnątrz: "*]p lub "+]p

 0
Author: Bruno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-22 17:07:43