2012-04-09 3 views
6

Jaki jest najlepszy sposób sprawdzenia w vimscriptu, który tryb wizualny jest aktualnie aktywny (blok wizualny lub wizualny)?Sprawdź tryb wizualny

Przeczytałem o mode(), ale nie mogę sprawić, żeby działało.
echo mode() nie działa dla mnie
if mode() == "v" nie działa również dla mnie.

+0

Co chcesz zrobić, jeśli aktywny jest tryb blokowania wizualnego? –

+0

'@Pavan, jeśli aktywny jest tryb wizualnego bloku, chcę obliczyć początek początku końca bloku (linia + kolumny). Jeśli aktywny jest tryb wizualny, chcę obliczyć tylko początkową i końcową linię wizualnego wyboru, ale nie kolumny. – Reman

+0

Sprawdź ': help visualmode()'. – Raimondi

Odpowiedz

5

Sprawdź pomoc dla mode(). Odpowiedni fragment:

  v  Visual by character 
      V  Visual by line 
      CTRL-V Visual blockwise 

Musisz być sprawdzenie mode() == "\<C-V>" (dosłowne ^V znaków) nie mode() == "v", aby sprawdzić, czy tryb blokowo wizualnej.

+0

Tak, wiem, ale mogę sprawiają, że działa. Nie rozpoznaje bloku wizualnego. Jaki byłby kod linii poleceń echo? – Reman

+0

Co masz na myśli mówiąc, że nie możesz tego zrobić? Jak próbujesz to uruchomić? –

+0

'@Chris, tak: 'if mode() ==" CTRL-V "| echo "blok" | jeszcze | "echo bez bloku" | endif' - Nie działa tak dobrze w linii poleceń. – Reman

1

@Remonn już powiedział to w komentarzach, ale nie było dla mnie jasne. W ten sposób udało mi się zobaczyć wyniki:

function! F() 
    normal! gv 
    throw mode() 
endfunction 
vnoremap <F9> <ESC>:call F()<CR> 

przejść do różnych trybach wizualnych, a następnie uderzył F9 zobaczyć.

Potrzebuję rzut, ponieważ linia -- VISUAL -- obejmuje wiadomość echo. Czy ktoś może wyświetlać echo w trybie VISUAL?

Ogólnie myślę, że najlepszą rzeczą do zrobienia, gdy będzie trzeba mode() jest, aby dwa różne odwzorowania, a następnie albo dwie różne funkcje, które robią zupełnie różne rzeczy:

function! Fnorm() 
endfunction 

function! Fvis() 
endfunction 

nnoremap <F9> :call Fnorm()<CR> 
nnoremap <F9> <ESC>:call Fvis()<CR>gv 

lub jeden funkcję i dać do niego różne parametry w zależności od odwzorowania:

function! F(param) 
endfunction 

nnoremap <F9> :call F(1)<CR> 
nnoremap <F9> <ESC>:call F(2)<CR>gv 

Inną sztuczką jest powiązany co zrobić, jeśli chcesz coś zrobić, gdy jesteś w trybie wizualnym, jak przesunąć kursor. Najlepsze co mogę zrobić to:

function! Fvis() 
    normal! gv 
    cursor(1, 1) 
endfunction 

nnoremap <F9> <ESC>:call Fvis()<CR>gv 
+0

Pamiętaj, że aby wykonać mapowanie w trybie wizualnym, użyjesz 'v [no] remap' zamiast' n [no] remap', a ty nie chcę, aby '' tam, jeśli zaznaczenie jest ważne.Więc twoje mapowania będzie wyglądać bardziej jak 'nnoremap : wywołanie Fnormal() ' i 'vnoremap : wywołanie Fvisual() '. Dla moich potrzeb i w jaki sposób znalazłem się tutaj, ale zdałem sobie z tego sprawę po tym, jak tu dotarłem, zdefiniowałem moją funkcję jako 'function! F() range', a następnie' nnoremap : F() 'i' vnoremap : '<,'> F() '. –