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żesz wyłączyć automatyczne wcięcie, ale nie mogę go uruchomić, ponieważ mam inne sprzeczne ustawienia lub coś takiego (które wyglądają dość oczywiste w moim .vimrc, ale nie wydają się mieć znaczenia, gdy je wyjmę).
Jak wyłączyć automatyczne wcięcie podczas wklejania kodu, ale nadal mam automatyczne wcięcie vim podczas pisania kodu? Oto mój .vimrc
plik:
set expandtab
set tabstop=2
set shiftwidth=2
set autoindent
set smartindent
set bg=dark
set nowrap
cat > mynewfile.txt
nacisnąć Enter , wkleić tekst, ponownie nacisnąć Enter , a następnie Ctr + D, aby zapisać. Plik jest teraz utworzony i możesz go edytować za pomocąvim mynewfile.txt
.Odpowiedzi:
Aktualizacja: lepsza odpowiedź tutaj: https://stackoverflow.com/a/38258720/62202
Aby wyłączyć autoindent podczas wklejania kodu, istnieje specjalny tryb „wklejania”.
Rodzaj
Następnie wklej swój kod. Zauważ, że tekst w etykiecie narzędzia mówi teraz
-- INSERT (paste) --
.Po wklejeniu kodu wyłącz tryb wklejania, aby automatyczne wcięcie podczas pisania działało poprawnie.
Jednak zawsze uważałem to za kłopotliwe. Dlatego
<F3>
mapuję tak, aby podczas edytowania tekstu mógł przełączać się między trybami wklejania i nopaste ! Dodaję to do.vimrc
źródło
:set noai
później:set ai
. Sugestia:r! cat
jest krótsza.set paste
łatwiej. Jest o wiele bardziej semantyczny niż,noai
a nawetnoautoindent
, co jest ważniejsze, gdy wpisujesz „noai” i „wklej” zajmuje tyle samo mało czasu, gdy jesteś wystarczająco biegły jako maszynistka dotykowa.:set noai
nie zawsze działa, w zależności od konfiguracji innych ustawień związanych z wcięciem zgodnie z OP.:set paste
wydaje się być skrótem dla kilku ustawień jednocześnie.set copyindent
załatwi to za Ciebie bezproblemowo.:set paste
wyłącza również inne funkcje, takie jak uzupełnianie nawiasów klamrowych, co również nie jest pożądane podczas wklejania kodu.Aby uniknąć niepożądanych efektów podczas wklejania, należy ustawić opcję:
Przydatnym poleceniem w twoim .vimrc jest
set pastetoggle=<F10>
lub inny przycisk, aby łatwo przełączać się między wklejaniem a nopaste.źródło
nmap <silent> <leader>p :set paste<CR>"*p:set nopaste<CR>
Zwykle używam,
:r! cat
a następnie wklejam( shift + insert )
treść, iCTRL+D
.Nie ma potrzeby włączania i wyłączania bezpośredniego użycia.
źródło
:r! cat
działa.:r
wstawia zawartość pliku do bieżącego dokumentu.!cat
mówi, uruchom cat, który zasadniczo otwiera stdin (* powłoki nix)(shift + insert)
lub dla niektórych terminali, kliknięcie prawym przyciskiem myszy wklei zawartość schowka do terminala naCTRL+D
końcu pliku, więc zamknie:r !cat
sesję.paste
wykonanej wyłącznie w tym celu? @jvriesem Nie jest to opcja „bezpośrednia”, jeśli zakładam, że rozumiesz to słowo.:r! cat
następnie,CTRL+SHIFT+V
aby wkleić terminal (wtedyCTRL+D
).Jeśli pracujesz lokalnie, możesz wkleić ze schowka systemowego sekwencję klawiszy:
"+p
Jest to poprawne polecenie vim, więc nie musisz się martwić wejściem w tryb wstawiania lub wyłączeniem autoindent.
Oczywiście, jeśli pracujesz zdalnie (na przykład konsola przez SSH), to nie zadziała i powinieneś przejść do
:set noai
trybu wstawiania, wkleić do konsoli, opuścić tryb wstawiania,:set ai
trasy jak opisano w innym miejscu.źródło
:set paste
i:set nopaste
zamiast tego, ponieważ pomimo tego, że jest dłuższy, łatwiej jest zapamiętać i nie muszę za każdym razem sprawdzać!:set paste
nie jest zaimplementowany, dlatego:set noai
należy go użyć.<leader>p
... bardzo przydatne!Mimo że ustawienie trybu wklejania
paste/nopaste/pastetoggle
jest 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 jest najlepsze rozwiązanie, jakie do tej pory znalazłem, które automatycznie przełącza tryb wklejania podczas wklejania.Źródło: Coderwall
Uwaga: to rozwiązanie nie działa w WSL (Windows 10 Subsystem for Linux). Jeśli ktoś ma rozwiązanie dla WSL, zaktualizuj tę odpowiedź lub dodaj ją w komentarzach.
Tmux Jeśli używasz tmux, to deklaracje muszą być podwójnie zmienione. Kod do tego znajduje się również w Coderwall
źródło
t_SI
it_EI
umożliwiają włączanie braketingu wklejania i wyłączanie go. Gdy włączone jest braketing wklejania, wklejany tekst jest poprzedzany przez,esc[200~
a następnieesc[201~
.Użytkownicy komputerów Mac mogą uniknąć automatycznego formatowania, czytając bezpośrednio z pulpitu za pomocą:
źródło
:.!pbpaste
, powinno to działać, zastępując bieżący wiersz danymi wyjściowymi bufora wklejania. Zasadniczo vim pozwala przesyłać dane znajdujące się w bieżącym pliku do innego programu i zamieniać tekst na wynik polecenia.:1,3!pbpaste
Zastępuje więc pierwsze trzy wiersze pliku buforem wklejania. Używam,:.!ppjson
aby wziąć bardzo długi (niesformatowany ciąg JSON) i sformatować go i zastąpić długi ciąg sformatowanym odpowiednikiem. ppjson to tylko uruchamiany skrypt bashpython -m json.tool
.Oto post kogoś, kto wymyślił, jak ponownie przypisać zdarzenie wklejania, aby automatycznie włączyć tryb wklejania, a następnie wyłączyć. Działa dla mnie w tmux / iTerm na MacOSX.
źródło
Dodaj to do swojego,
~/.vimrc
a będziesz musiał nacisnąć F2 tylko przed i po wklejeniu:źródło
Właśnie włożyłem
set clipboard=unnamed
mój .vimrc. To sprawia, że domyślna mapa bufora wklejania jest umieszczona w schowku X.Tak więc, jeśli zaznaczę trochę tekstu w terminalu, mogę po prostu nacisnąć,
p
aby wkleić go w vimie. Podobnie, mogę zaciągać rzeczy w vimie (np.YY
Wciągać bieżącą linię do bufora) i klikać środkowym przyciskiem w dowolnym oknie, aby je wkleić.Dunno. Uważam to za bardzo wygodne.
źródło
Podczas pracy wewnątrz terminala wtyczka vim z nawiasami klamrowymi automatycznie obsługuje wklejanie bez potrzeby naciskania klawiszy przed lub po wklejeniu.
Działa poprzez wykrywanie trybu wklejania w nawiasach, który jest sekwencją ucieczki wysyłaną przez „nowoczesne” terminale kompatybilne z X-term, takie jak iTerm2, gnome-terminal i inne terminale używające libvte. Jako dodatkowy bonus działa również w sesjach Tmux. Z powodzeniem używam go z iTerm2 na komputerze Mac łączącym się z serwerem Linux i korzystającym z tmux.
źródło
Umieść to w swoim ~ / .vimrc i ciesz się:
Edycja: po refleksji
:r !cat
jest znacznie lepszym podejściem, ponieważ jest krótkie, semantyczne i nie wymaga niestandardowego vimrc. Użyj tego zamiast tego!źródło
Chociaż
:pastetoggle
lub:paste
i:nopaste
powinny działać dobrze (jeśli są zaimplementowane - nie zawsze są, jak widać z dyskusji), bardzo polecam wklejanie przy użyciu bezpośredniego podejścia"+p
lub"*p
czytanie za pomocą"+r
lub"*r
:Vim ma do niego dostępu do dziesięciu typy rejestrów (
:help registers
) i pytający jest zainteresowanyquotestar
iquoteplus
z sekcji:help x11-selection
dodatkowo wyjaśnia różnicę*
i+
:źródło
To działa dla mnie (przypadek na rejestr +, co używam jak bufor wymiany między aps):
źródło
Jeśli korzystasz z komputera Mac, macvim wydaje się radzić sobie dobrze bez konieczności przełączania wklejania.
brew install macvim --override-system-vim
źródło
.vimrc
akt dołączasz dyrektywy PO ?Pasta natywna / nawias klamrowy jest najlepszym i najprostszym sposobem od
vim 8
(wydanym w 2016 r.) Działa nawet na ssh! (Wklej wklejany działa w systemach Linux i Mac, ale nie w Windows Git Bash)Upewnij się, że masz vima 8+ (nie potrzebujesz opcji
+clipboard
lub+xterm_clipboard
).vim --version | head -1
Wystarczy użyć natywnego polecenia wklejania systemu operacyjnego (np.
ctrl+shift+V
Lubcmd+V
) w trybie normalnym. Nie naciskaj,i
aby przejść do trybu wstawiania.Test
Skopiuj (
ctrl+shift+C
lubcmd+C
) wynik tego (2 wiersze z wcięciem tabulatora) do schowka systemowego:echo -e '\ta\n\tb'
Uruchom czysty vim 8+ z autoindent:
vim -u NONE --noplugin -c 'set autoindent'
Wklej ze schowka systemowego (
ctrl+shift+V
lubcmd+V
) w trybie normalnym. Nie naciskaj,i
aby przejść do trybu wstawiania.a
Ib
powinny być zgodne z jednym akapicie tab. Możesz to zrobić nawet podczas ssh-shingu na zdalnej maszynie (zdalna maszyna będzie potrzebowała vim 8+).Teraz wypróbuj stary sposób, który automatycznie włączy drugi wiersz z dodatkową zakładką: Naciśnij,
i
aby przejść do trybu wstawiania. Następnie wklej za pomocąctrl+shift+V
lubcmd+V
.a
Ib
są przesunięte teraz.Instalowanie Vima 8
Ubuntu 18.04 - domyślnie jest dostarczany z Vimem 8 .
Ubuntu 16.04 - instalacja z PPA .
brew install vim
źródło
Featured snippet
dla mojego wyszukiwania „wklej treść bez kart vim”, być może dlatego, że użyłem słowa kluczowego „tab”, tylko w tej wspomnianej odpowiedzi :)Przeczytaj ten artykuł: Przełącz automatyczne wcięcie dla wklejania kodu
źródło
Najszybszym sposobem, w jaki jestem świadomy, aby szybko przejść do trybu wklejania dla wklejenia za jednym razem, jest nienaruszony tpope , który oferuje
yo
iyO
, prawdopodobnie, mnemonikę dla „otwierasz”. Są one udokumentowane tylko w jego vimdoc, jako:źródło
Innym sposobem wklejenia jest
<CR>
i usunięcie zawartości rejestru (tutaj rejestr globalny). Zobacz::h i_ctrl-r
ih 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 go
<CR><CO>*
w większości systemów uniksowych.Uwaga: działa to tylko wtedy, gdy vim jest skompilowany
clipboard
.źródło
Z vima:
]p
Z zewnątrz:
"*]p
lub"+]p
źródło
Kolejna odpowiedź, której nie widziałem do tej pory:
źródło
Niestety, znalazłem wspomnianą wtyczkę vim, która nie działa z iTerm2 3.0.15 (uczciwie nie wiem, czy to się zepsuło w starszych wersjach) - ale zamiast tego znalazłem hack.
Mapuj polecenie-p, aby wkleić i używając kluczy vim iTerm2. Oczywiście działa to tylko w przypadku iTerm2.
Jak to działa. Używam „jk”, aby przejść do trybu ucieczki, więc będziesz również potrzebować:
: inoremap jk
w twoim .vimrc.
Następnie po prostu wywołuje P, aby przejść do trybu wklejania, „+ p, aby wkleić ze schowka, a następnie P, aby wyłączyć tryb wklejania. Hth.
źródło