2013-02-13 8 views
5

W VIM, blokowanie tekstu w trybie wizualnym i wklejanie bloku, wklej go po żądanej kolumnie podanej przez kursor, ale wkleja w miejscu, zastępując zawartość bieżącego i kolejnych wierszy.Jak wkleić blok podczas tworzenia niezbędnych linii, aby zwolnić miejsce dla bloku?

Czasami tego nie chcę, chcę wkleić blok z wcięciem podanym przez pozycję kursora, ale wkleję w nowe puste linie, bez nadpisywania tekstu.

Czy jest jakiś sposób na zrobienie tego?

Obecnie, aby to osiągnąć, tworzę dużą ilość pustych linii, a następnie wklejam blok, eliminując pozostałe puste linie (niezbyt mądre ...).

Uwaga: Używam set virtualedit=all, aby móc wkleić w dowolnej kolumnie we wspomnianych pustych liniach.

+0

Po prostu cię lubię. Nie sądzę, że istnieje sposób, aby zrobić to, czego (prawdopodobnie wszyscy) chcemy, bez uciekania się do vimscript. Czy szukałeś na vim.org? – romainl

+0

@romainl, nie zrobiłem. Sądzę, że będę trzymać się przyjętej mapy odpowiedzi. –

Odpowiedz

4

Możesz wypróbować coś takiego. Blokuj cokolwiek, ustaw kursor i uderz w <Leader>p, bez względu na twój klucz lidera.

function! FancyPaste() 
    let paste = split(@", '\n') 
    let spaces = repeat(' ', col('.')-1) 
    call map(paste, 'spaces . v:val') 
    call append(line('.'), paste) 
endfunction 

nnoremap <Leader>p :call FancyPaste()<CR> 

Oczywiście można zmienić mapowanie na dowolne; to tylko sugestia.

Aktualizacja: Oto wersja, która akceptuje argument. To pozwala Tobie np. wklej zamiast tego ze schowka systemowego. Wykorzystuje również virtcol() zamiast col() celu uwzględnienia do ewentualnego wykorzystania 'virtualedit':

function! FancyPaste(reg) 
    let paste = split(getreg(a:reg), '\n') 
    let spaces = repeat(' ', virtcol('.')-1) 
    call map(paste, 'spaces . v:val') 
    call append(line('.'), paste) 
endfunction 

nnoremap <Leader>p :call FancyPaste('"')<CR> 
nnoremap <Leader>cp :call FancyPaste('+')<CR> 

Pamiętaj Będzie to wcięcie tylko ze spacjami, a nie kartami. Wcięcie z odpowiednią ilością zakładek (i spacji w razie potrzeby) wymagałoby dodatkowych linii kodu, ale jest całkiem wykonalne.

0

Jeśli dobrze rozumiem, co chcesz, możesz spróbować to na podstawie polecenia ex a operator =:

nmap <leader>p :put "<cr>'[='] 

Inna możliwość:

nmap <leader>p :let @"[email protected]"<cr>]p 

@"[email protected]" wydaje się mieć Vim zapomnieć o kopiowanych liniach, znakach i ponownie odtwarzanych pastach.

Wtyczka UnconditionalPaste może również pomóc wkleić w ten sposób.

+0

Przyjęta odpowiedź daje dokładnie to, czego oczekuję. ': put' nie robi tego, ponieważ ignoruje tworzenie wcięć w białą przestrzeń w oparciu o pozycję kursora. –

+0

Masz całkowitą rację, zupełnie o tym zapomniałem. Dodałem '=' do reindentu, uważam, że powinno teraz działać w twoim przypadku użycia. –

+0

Nie, nie ma, ponieważ mam do czynienia z tekstem, a nie z kodem. Nie ma więc inteligentnego wcięcia, wystarczy, że będzie on biały, w zależności od pozycji kursora. –

Powiązane problemy