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.