2012-04-09 68 views
6

什么是检查vimscript哪种可视模式当前处于活动状态(视觉或视觉模块)的最佳方法?检查可视模式

我已阅读约mode(),但我不能让它工作。
echo mode()对我不起作用
if mode() == "v"对我不起作用。

+0

如果Visual Block Mode处于活动状态,您希望做什么? – 2012-04-09 12:53:29

+0

'@Pavan,如果Visual Block Mode处于活动状态,我想计算开始结束块(行+列)的结尾。如果可视模式处于活动状态,我只想计算视觉选择的开始和结束行,但不计算列。 – Reman 2012-04-09 12:57:31

+0

检查':help visualmode()'。 – Raimondi 2012-04-09 15:23:34

回答

5

看看mode()的帮助。相关部分:

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

你必须检查mode() == "\<C-V>"(文字^V字符),不mode() == "v",检查块可视模式。

+0

是的,我知道,但可以不要让它工作。它不识别视觉块。 echo命令行代码是什么? – Reman 2012-04-09 15:26:56

+0

你的意思是不能使它工作?你怎么试着触发它? – 2012-04-09 21:57:31

+0

'@Chris,像这样:'if mode()==“CTRL-V”|回声“块”|别的| “echo no block”| endif' - 它在命令行中不起作用。 – Reman 2012-04-10 06:03:10

1

@Remonn已经在评论中说过了,但对我而言并不是很清楚。这是我设法看到的结果:

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

进入不同的视觉模式,然后打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()'。 – 2016-06-06 02:36:07