2011-07-04 15 views
9

Często używam bloku wizualnego, a następnie wstawiam na wielu liniach, na przykład, komentując dużo kodu. To świetnie nadaje się do wstawiania tekstu w tej samej pozycji na wielu liniach, ale nie mogę wymyślić, jak usunąć ten tekst później za pomocą trybu bloków wizualnych, Backspace, Del i d wszystkie nie działają. Używam MacVim.Vim - Blok wizualny: Usuń zamiast wstawiania

Odpowiedz

18

Szukacie x:

root:x:0:0:root:/root:/bin/bash 
daemon:x:1:1:daemon:/usr/sbin:/bin/sh 
bin:x:2:2:bin:/bin:/bin/sh 
sys:x:3:3:sys:/dev:/bin/sh 

Następnie wizualno-blok-select, x:

root:/root:/bin/bash 
daeaemon:/usr/sbin:/bin/sh 
bin/bin:/bin/sh 
sys/dev:/bin/sh 

Używam tego często, z dokładnie tego samego powodu - i komentowania odkomentowanie dużych bloków kodu.

+0

dzięki Ów wielki, czy istnieje sposób, aby utrzymać go w bloku wizualnej tryb i zrobić wiele x? –

+0

@beck: Nie możesz pozostać w trybie wizualnym, o ile wiem. Możesz jednak poprzedzić 'x' liczbą; na przykład '3x' usuwa trzy znaki, które mogą być tym, na co masz ochotę. –

+7

@beck: Możesz również użyć polecenia 'gv', aby ponownie podświetlić ten sam blok. –

5

Nie odpowiada to bezpośrednio na pytanie (już to zrobił), ale sugeruję, że istnieją skuteczniejsze sposoby blokowania (nie-) bloków kodu. Mam funkcję CommentToggle, która albo komentuje, albo odkreca bieżący wiersz, w zależności od tego, czy zaczyna się od "comchar".

function! CommentToggle(comchar) 
    let firstchar = matchstr(getline("."),"[^ ]") 
    if firstchar == a:comchar 
     sil exe 'normal ^xx' 
    else 
     sil exe 'normal ^i' . a:comchar . ' ' 
    endif 
endfunction 

Więc dla plików Perla można map:

nnoremap <silent> <leader>c :call CommentToggle('#')<CR> 

i naciskając \c (nie-) komentuje trzy linie od pozycji kursora.

Można również napisać mapowania wizualno-mode:

vnoremap <silent> <leader>c :call CommentToggle('#')<CR> 

pozwala wybrać obszar wizualnej i naciśnij \c do (nie-) skomentować je wszystkie.

Ta konkretna funkcja działa tylko dla komentarzy jednoliterowych ("#", "%" itp.), Ale można ją rozszerzyć na dłuższe łańcuchy (np. "//"), a nawet bardziej złożone zamienniki. , takie jak komentarze HTML.

Mam nadzieję, że to pomoże.

+0

Dobra wskazówka, dziękuję. –

+1

Zgadzam się na "lepsze metody" Jednak istnieją jeszcze lepsze metody: wtyczki dedykowane do komentowania * przełączanie * -> EnhancedCommentify, NERDCommenter, tComment (nie mam pewności co do ostatniego, używam pierwszego od dekady) –

1

Odpowiedź Prince Goulash nie działa w liniach z wiodącymi zakładkami.

Zmieniłem go, dodając znak tabulacji do wzoru, chociaż linie tracą wcięcie po komentarzu i odkomentowaniu.

function! CommentToggle(comchar) 
     let firstchar = matchstr(getline("."), "[^ \t]") 
     if firstchar == a:comchar 
       sil exe 'normal ^2x' 
     else 
       sil exe 'normal ^i' . a:comchar . ' ' 
     endif 
endfunction 

lubię bardziej dodając komentarz char do pierwszej pozycji w kolejce, to modyfikacja funkcji księcia gulaszem za załatwia sprawę:

function! CommentToggle(comchar) 
     let firstchar = matchstr(getline("."), "[^ \t]") 
     if firstchar == a:comchar 
       sil exe 'normal ^2x' 
     else 
       sil exe 'normal gI' . a:comchar . ' ' 
     endif 
endfunction 
+1

Zachowaj ostrożność, odpowiadając na odpowiedzi z dalszymi odpowiedziami - gdy ktoś zauważy, zazwyczaj znikną w ciągu kilku minut :) - ale jest to dobra odpowiedź, gdy jest mniej ukierunkowana na Prince Goulash i więcej ukierunkowany na rozwiązywanie problemu Beckera. :) – sarnold