2010-03-31 19 views
16

Gdy wklejam elementy ze schowka, są one zwykle (zawsze) wielowierszowe, aw tych przypadkach (i tylko tych przypadkach), chcę, aby został uruchomiony :set paste, ponieważ w przeciwnym razie tabowanie zwiększy się wraz z każdą linią (wszyscy to widzieliście!).Wklejanie ze schowka i automatyczne przełączanie: wklejanie zestawu

Chociaż problem z :set paste polega na tym, że nie zachowuje się on dobrze z set smartindent, powodując przeskok kursora na początek nowej linii zamiast na właściwe wcięcie. Chciałbym włączyć to tylko dla tej instancji.

Używam Maca, sshing do maszyny Debiana z vimem, a tym samym wklejenie w trybie Insert przy użyciu cmd-v.

Pozdrawiam.

+1

Nie sądzę, że istnieje jakikolwiek powód do przeniesienia tego pytania: nie tylko pytania vim są akceptowane jako należące do SO (http://meta.stackexchange.com/questions/25925/vim-questions-so-or-su), jest to pytanie dotyczące edytora tekstu programisty, używanego do wykonywania zadań wspólnych podczas programowania. – Cascabel

+1

@Jefromi: Wklejanie jest powszechne przy każdej edycji tekstu, ale przyznaję, że pytania Vim/Emacs zostały uznane za zadowalające dla SO, nawet jeśli nie są bezpośrednio związane z programowaniem. @ Jonatan: Gorąco polecam przed używaniem ''smartindent''. Zobacz http://vim.wikia.com/wiki/Restoring_indent_after_typing_hash#Using_filetype_indentation dla wyjaśnienia, dlaczego. – jamessan

+0

@jamessan: Chodzi o to, że wklejanie z tym szczególnym problemem formatowania jest bardzo, bardzo powszechnym zadaniem programistycznym. Nigdzie indziej nie rutynowo wkleja się bloki tekstu z wcięciami zmieniającymi się od linii do linii. – Cascabel

Odpowiedz

7

Nie używam mac, ale uważam, że mam przedrostek tutaj: <D-v> powinien oznaczać cmd-v. W trybie wstawiania:

:imap <D-v> ^O:set paste<Enter>^R+^O:set nopaste<Enter> 

czy naprawdę, po prostu to zrobić:

:imap <D-V> ^O"+p 

^O i^R są dosłowne kontrolno-O i kontrolno-R, które można wpisać w^V^O (control-v control-o) i^V^R (control-v control-r). Control-O w trybie wstawiania pozwala na wykonanie jednego polecenia, a następnie powrót do trybu wstawiania; tutaj możesz go użyć do umieszczenia w rejestrze schowka.

To zadziałało dla mnie, gdy przetestowałem je zmapowane na inny klucz, więc powinieneś być cały zestaw.

Nie trzeba mapować niczego, gdy nie jest w trybie wstawiania; możesz po prostu użyć "+p.

+0

Odnośnie '" + p' ... ... w zależności od systemu operacyjnego, możesz zmienić to na '" * p'. Do mojego komputera (osx) potrzebowałem użyć drugiej wersji. – agbodike

1

Masz rację, że powinieneś włączyć tylko 'paste', kiedy jej potrzebujesz. To nie tylko wpływa na wcięcia. Możesz przeczytać wszystko, co wpływa na jego documentation. Powiązaną opcją, która jest bardzo przydatna w celu ułatwienia korzystania z 'paste' jest 'pastetoggle'.

Jeśli korzystasz z przekazywania X i terminalu, który może prawidłowo komunikować ruchy myszy, możesz również skorzystać z opcji 'mouse'. Dzięki :set mouse=a Vim jest informowany o tym, co robi mysz, a zatem nie wykonuje automatycznego wcięcia po otrzymaniu wielowierszowej pasty za pomocą kliknięcia środkowym przyciskiem myszy.

Nawet bez myszy, X-forwarding może pomóc, ponieważ Vim zrobi to samo podczas ręcznego wklejania ze schowka lub rejestrów wyboru (odpowiednio: "+ i "*).

+0

Dzięki. Poprosiłem o pomoc w przekazywaniu X i Mouse oraz o tym, czego nie należy robić (http://superuser.com/questions/98350/vim-and-mouse-with-ssh-from-mac-to-linux), ale nigdy nie udało się wszystkiego rozwiązać. Zajrzę do pastetoggle, to powinno rozwiązać problem. Dokumentacja Vima (i zestaw funkcji) jest naprawdę ogromna. –

3

Mam następujących w moim .vimrc:

inoremap <S-Insert> <ESC>:setl paste<CR>gi<C-R>+<ESC>:setl nopaste<CR>gi 

gi jest uruchomienie trybu wstawiania w tej samej pozycji co gdzie tryb Insert został zatrzymany po raz ostatni w bieżącym buforze.

Upd:

Jefromi pisał lepsze rozwiązanie. Udało mi się go trochę zmodyfikować:

inoremap <S-Insert> <ESC>"+p`]a 

Wstawia tekst clilpboard i umieszcza kursor zaraz za nim.

+0

To miło, ale działa tylko na Shift-Insert, prawda? A to nie zadziałałoby z mojego komputera Mac, chyba że się mylę. –

+0

Można go łatwo zmapować do woli. na przykład. –

+0

@ Jonatan Littke: Moja odpowiedź pokazuje, jak zmapować to do polecenia-v, i jak zrobić to wydajniej. – Cascabel

0

To powinno być możliwe do rozwiązania za pomocą skryptu vim. (Nienawidzę skryptów vima, więc musiałbym być o wiele poważniejszym problemem, który spowodowałby, że sam go rozwiązałem.) Nawet z iTerm2's "paste slowly" mode domyślnie łamane są dane do wklejenia w 16-bajtowe porcje i wysyłane co 0,125 sekundy . Dlatego powinieneś być w stanie programowo wykryć 16-bajtowy fragment "klawiszy" i coś z tym zrobić.

W Pseudokod że wyglądałby następująco:

if too_fast_too_be_human(): 
    set('pastemode', True) 
else 
    set('pastemode', False) 

# where either 
def too_fast_too_be_human 
    char_threshold = 16 
    return len(input_buffer) > char_threshold 

# or 
def too_fast_too_be_human 
    static byte_times = [] 
    char_threshold = 16 
    time_threshold = 0.125 
    byte_times.append(now()) 
    while(len(byte_times) > char_threshold): 
     byte_times.unshift() 
    return (byte_times[-1] - byte_times[0]) < time_threshold 

Są słabości, ale to działa w większości przypadków.

Powiązane problemy