Dlaczego Vim wkleja niepoprawnie kod?


100

W Vimie, jeśli wkleję ten skrypt:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

Otrzymuję te dziwne wyniki:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

Pojawiły się znaki skrótu (#) i tabulatory. Dlaczego?


31
To może być lepsze pytanie dla vi.stackexchange.com
Eric Renouf

@EricRenouf dlaczego? (szczere pytanie)
Qix,

3
@ qix myślałem, że to pytanie o to, jak działa vim, który jest powszechnym narzędziem do użycia w * nix, ale * nix nie jest wymagany do używania vima
Eric Renouf

1
@JaredBurrows Mam nadzieję, że dzięki temu
Eric Renouf

1
Jak uruchamiasz wklejanie? Za pomocą myszy?
Ben Voigt,

Odpowiedzi:


122

Są dwa powody:

Aby wkleić, vimgdy włączone jest automatyczne wcięcie, musisz zmienić tryb wklejania, wpisując:

:set paste

Następnie możesz przejść do trybu wstawiania i wkleić kod. Po zakończeniu wklejania wpisz:

:set nopaste

aby wyłączyć tryb wklejania. Ponieważ jest to częste i częste działanie, vimoferuje przełączanie trybu wklejania:

set pastetoggle=<F2>

Możesz zmienić F2dowolny klucz, a teraz możesz łatwo włączać i wyłączać wklejanie.


Aby wyłączyć automatyczne wstawianie komentarzy, możesz dodać te wiersze do vimrc :

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vimudostępnia także rejestr wklejania , umożliwiający wklejenie tekstu ze schowka systemowego. Możesz użyć "*plub w "+pzależności od systemu. W systemie bez X11, takim jak OSX lub Windows, musisz użyć *rejestru. W systemie X11, takim jak Linux, możesz używać obu.

Dalsza lektura


2
Używam Vima od zawsze i nigdy o tym nie wiedziałem. Wielkie dzięki.
Caja

Większość współczesnych emulatorów terminali graficznych obsługuje funkcję o nazwie „tryb wklejania w nawiasach”. Vim może poprosić terminal o włączenie tego trybu, który z kolei otoczy wklejony tekst pewnymi sekwencjami ucieczki. Vim może to rozpoznać i wyłączyć zawijanie / wcięcie na czas trwania pasty. Długa historia: wklejanie będzie działać zgodnie z oczekiwaniami. Nie jestem użytkownikiem vima, ale szybkie wyszukiwanie w sieci powie ci, jak skonfigurować ten tryb.
egmont

2
@MichaelDurrant set pastenigdy nie powinien być w twoim vimrc. Wyłącza lub resetuje wiele rzeczy, w tym mapowania w trybie wstawiania, mapowania wiersza poleceń, skróty, szerokość tekstu, wrapmargin, autoindent, smartindent, softtabstop, opcje formatowania, indentexpr i kilka innych. :h pastema całą listę. Większość ludzi używa niektórych lub wszystkich tych rzeczy i zastanawia się, dlaczego te ustawienia są ignorowane.
FDinoff,

4
Zwykle używam :r!catdo wklejania dosłownie.
Simon Richter

1
Warto omówić interakcję set mouse, która może automatycznie wejść i wyjść z trybu wklejania po wklejeniu za pomocą myszy.
Ben Voigt,

36

Użyj pasty vim. Co chcesz, to wkleić to, co jest w buforze schowka "+p

Spowoduje to wybranie +i wklejenie go na miejscu.

Jeśli używasz Linuksa, *to bufor X / środkowego kliknięcia (ostatni zaznaczony tekst).

Vim wie, że to pasta.

W przeciwnym razie vim myśli, że wpisałeś wklejone klawisze i wykonuje własne automatyczne wcięcie (na górze skopiowanego wcięcia) aż do końca wklejania.

Uwaga: aby działało to w SSH, musisz ustawić opcję udostępniania schowka -Y

Zobacz man sshpo więcej szczegółów.


4
To właściwie poprawna odpowiedź imho
Kristoffer Sall-Storgaard

Wygląda na to, że działa to tylko w graficznym vim ( gvim); vim działający w emulatorze terminali wkleja ostatnio usunięty tekst
znakiem

Nie używam gvim, tylko terminal vim. jakie jest ustawienie myszy? moje ustawienie myszy to c. Nie jestem pewien, jak to działa, gdy dozwolony jest wybór myszy. set mouse?
exussum

2
sprawdź także, vim --versionczy został skompilowany z obsługą schowka, +xterm_clipboardpowinien być w wyjściu
exussum

@wurtel: Może ustawiłeś schowek ze unnamedsznurkiem.
cuonglm

8

Karty zostały wstawione, ponieważ masz włączone autoindent i możesz wyłączyć to zachowanie, wyłączając autoindent ( :set noai) przed wklejeniem do terminalu.

Skomentowane linie są tworzone przez automatyczne komentowanie i można je wyłączyć, wyłączając to.

Alternatywnie do tych należy uzyskać pożądane zachowanie za pomocą przełączników :set paste, wklejając sformatowany kod i :set nopasteprzywracając normalne zachowanie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.