2012-04-09 4 views
6

Каков наилучший способ проверить vimscript, какой визуальный режим в данный момент активен (визуальный или визуальный блок)?Проверить визуальный режим

Я читал около mode(), но я не могу заставить его работать.
echo mode() не работает для меня
if mode() == "v" не подходит для меня.

+0

Что вы хотите сделать, если активен режим Visual Block? –

+0

'@Pavan, если режим Visual Block активен, я хочу рассчитать начальный конец конца блока (строка + столбцы). Если визуальный режим активен, я хочу рассчитать только начальную и конечную строки визуального выделения, но не столбцы. – Reman

+0

Проверьте ': help visualmode()'. – Raimondi

ответ

5

Обратитесь за помощью к mode(). Соответствующая часть:

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

Вы должны проверять mode() == "\<C-V>" (буквальный ^V символов), а не mode() == "v", чтобы проверить наличие Визуального режима.

+0

Да, я знаю, но могу «Сделай это. Он не распознает визуальный блок. Каким будет код командной строки echo? – Reman

+0

Что вы имеете в виду, будучи неспособным заставить его работать? Как вы пытаетесь вызвать его? –

+0

'@Chris, вот так: 'if mode() ==" CTRL-V "| echo "block" | еще | "echo no block" | endif' - Это также не работает в командной строке. – Reman

1

@Remonn уже сказал это в комментариях, но это было не очень понятно для меня. Это, как мне удалось увидеть результаты:

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

Go в различные визуальные режимы, а затем ударил F9 увидеть.

Мне нужен бросок, потому что линия -- VISUAL -- охватывает любое эхо-сообщение. Может ли кто-нибудь эхо в режиме VISUAL?

В общем, я считаю, что лучше всего делать, когда вам нужно будет mode(), чтобы сделать два разных отображения, а затем либо две различные функции, которые делают совершенно разные вещи:

function! Fnorm() 
endfunction 

function! Fvis() 
endfunction 

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

или одной функции и дают различные параметры к нему в зависимости от отображения:

function! F(param) 
endfunction 

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

Другой связанной хитрость заключается в том, что делать, если вы хотите сделать что-то в то время как вы находитесь в визуальном режиме, как переместить курсор. Лучшее, что я могу сделать, это:

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

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

Помните, что для отображения в визуальном режиме вы используете 'v [no] remap' вместо' n [no] remap', и вы не нужно '' там, если выбор важен, поэтому ваши сопоставления будут больше похожи на 'nnoremap : call Fnormal() ' и 'vnoremap : call Fvisual() '. Для моих нужд и как я оказался здесь, но понял этот момент после получения здесь, я определяю свою функцию как 'function! F() range', а затем делает' nnoremap : F() 'и' vnoremap : '<,'> F() '. –

Смежные вопросы