Zawsze używaj: ustaw wklej, czy to dobry pomysł?

19

W terminalu vim, wklejanie danych ze schowka często zaburza wcięcie kodu. Po prostu wiedziałem, że jeśli użyję :set pastewcięcia, to nie jest zepsute. Chociaż po wklejeniu danych powinienem to zrobić :set nopasteponownie? Co jeśli nie, jaki problem się pojawi?

Benzoes
źródło
Co powiesz na próbowanie samemu? Czy czytając dokumentację ?
romainl
1
Zobacz także „Tryb wklejania w nawiasach” w mojej odpowiedzi na „Wklejanie kodu do okna terminala w vimie” stackoverflow.com/a/7053522/754997 . Jeśli emulator terminala go obsługuje, możesz tak ustawić Vim, aby automatycznie przełączał się do / z trybu wklejania za każdym razem, gdy wklejasz tekst do terminala.
Chris Page
1
@romainl Uważam za całkiem prawdopodobne, że zarówno 1) próbowanie i czekanie, czy istnieją negatywne konsekwencje zawsze używania zestawu paste paste (+ - nopaste), i 2) rtfm-ing (jako użytkownik niższego lub średniego poziomu, jak OP) , są mniej przydatne niż pytania tych, którzy mają doświadczenie w korzystaniu z opcji. Pytanie tutaj wydaje się mądrzejsze, a udokumentowanie tego pomoże innym.
belacqua

Odpowiedzi:

5

Jak napisali inni, nie chcesz pozostawiać zestawu „wklej”. Chciałem tylko zaznaczyć, że przy dobrym emulatorze terminali oraz odpowiednio skompilowanej i skonfigurowanej vimnie trzeba zmieniać „wklejania”. Potrzebujesz dobrego emulatora terminala, takiego jak xterm lub GNOME Terminal, vim z dołączoną funkcją X11, a opcja „mysz” ustawiona na „a”. Wtedy vim„będzie wiedział”, kiedy wklejasz myszką, i skutecznie ustawi i usunie opcję „wklej”.

Jednym ze sposobów, aby uzyskać vimz funkcją X11 jest uruchomienie gvimz -vopcją lub utworzyć alias,

alias vim='gvim -v'

Następnie włóż

set mouse=a

w twoim ~ / .vimrc.

garyjohn
źródło
Kiedy ustawię mouse = a, nie mogę skopiować tekstu. „Kopiuj” jest wyszarzone w menu po kliknięciu prawym przyciskiem myszy oraz w menu aplikacji.
Lee Daniel Crocker,
@LeeDanielCrocker: Copybędzie wyszarzony lub w ogóle niewidoczny, chyba że zaznaczono jakiś tekst. Jak wybierasz tekst do skopiowania?
garyjohn
Po prostu za pomocą myszy. FYI, „y” działa dobrze ... szarpa tekst i kopiuje go na klawiaturę systemową. To tylko menu, które nie działają. Jeśli mysz jest ustawiona na „r”, menu działają, ale mysz zawiera numery linii. Podsumowując, mogę żyć z myszą = a, muszę tylko pamiętać, żeby szarpać zamiast kopiować.
Lee Daniel Crocker
7

Ten post ma moją ulubioną odpowiedź, https://coderwall.com/p/if9mda/automatically-set-paste-mode-in-vim-when-pasting-in-insert-mode

Zasadniczo, jeśli zaczynasz w trybie wstawiania i używasz myszy Ctrl + Shift + V lub wklej prawym przyciskiem myszy, Vim wykrywa, że ​​pochodzi on z terminala i automatycznie ustawia tryb wklejania, a następnie wyłącza go po zakończeniu, aby nie stracić ponownie mapowanych klawiszy (który nie może działać w trybie wklejania, ponieważ zapisuje nieprzetworzone dane), a po powrocie do stanu „rozsądnego”.

Po prostu vim (wstaw do swojego .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

Jeśli używasz vima pod Tmuxem (nadal działa w .vimrc)

function! WrapForTmux(s)
  if !exists('$TMUX')
    return a:s
  endif

  let tmux_start = "\<Esc>Ptmux;"
  let tmux_end = "\<Esc>\\"

  return tmux_start . substitute(a:s, "\<Esc>", "\<Esc>\<Esc>", 'g') . tmux_end
endfunction

let &t_SI .= WrapForTmux("\<Esc>[?2004h")
let &t_EI .= WrapForTmux("\<Esc>[?2004l")

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
dragon788
źródło
Zakładam, że jedna z let &t_SI .= "\<Esc>[?xxxxx"linii wykrywa skrót wklejania klawiatury? Czy to działa również w przypadku komputerów Mac, biorąc pod uwagę inny skrót?
doub1ejack
@ doub1ejack W rzeczywistości wykrywają one sekwencje specjalne Xterm, a nie to, jak je nazywano (tj. 2004h to początek wklejania), więc dopóki twój terminal obsługuje kody Xterm i przekazuje je do Vima, powinien działać dobrze na Macu.
dragon788
o mój Boże. jesteś moim bohaterem. Wpisałem tak: ustaw nopaste tak wiele razy.
maxwell
3

Jak sugeruje romainl, dokumentacja wyjaśnia, że ​​ustawienie tej 'paste'opcji wyłącza kilka innych opcji, a na pewno okaże się, że prędzej niż później spowoduje to problemy. Z tego powodu istnieje 'pastetoggle'opcja. Widzieć:

:help 'paste'
:help 'pastetoggle'
Heptyt
źródło
1

Jeśli coś istnieje, musi mieć swoje znaczenie. Powinieneś dobrze zapoznać się z dokumentacją vima, która jest bardzo przydatna.

  :help 'paste'
  :help 'pastetoggle'

Po przeczytaniu możesz chcieć:

" Toggle paste mode
"   (prefer this over 'pastetoggle' to echo current state)
nmap <leader>p :setlocal paste! paste?<cr>

Mam nadzieję, że ten post okaże się przydatny :)

Dzung Nguyen
źródło
1

IIRC po wklejeniu do vima, zasadniczo myśli, że sam wpisałeś wszystkie te postacie. Więc jeśli automatyczne wcięcie jest włączone, będzie ono wciskać rzeczy, ale wklejony tekst zwykle zawiera już wcięcie, więc wcięcie rzeczywiście zostaje „pomieszane”. Przełączenie do trybu wklejania wyłącza takie rzeczy jak automatyczne wcięcie.

Jeśli podoba Ci się automatyczne wcięcie podczas pisania, po zakończeniu wklejania powróć do nopaste. Spróbuj i zwróć uwagę, jak ręcznie wykonać wcięcia w trybie wklejania.

Sumudu Fernando
źródło