2011-03-15 36 views
0

最近我创建了一个映射来切换高亮搜索。这很简单,但非常有用,例如nmap ,m :set hlsearch!。我一直面临的唯一问题是,有时我会在按下,m后迷路。映射中的脚本

从没有收到反馈:-)

的恐慌“有效吗?”,“难道现在还是关机?” ...的常见疑问所以我认为这回送“开启”或“关闭“会让我更平静。现在这个大问题到了:是否可以在映射中包含一个小脚本?我知道我可以创建一个函数,但是这不是我的这个简单的脚本意向:

if (&hlsearch) 
    echo "Search Highlight On" 
else 
    echo "Search Highlight Off" 
endif 

我想我需要在预处理指令“逃离”之类的换行,也许:

nmap ,m :set hlsearch!    \ 
    if (&hlsearch)     \ 
     echo "Search Highlight On" \ 
    else       \ 
     echo "Search Highlight Off" \ 
    endif 

但可能这不是正确的方式,不起作用,我甚至不知道它是否可能。

我注意到的另一件事是,即使ifecho都是“冒号”命令,类似:if (1) echo "works"之类的东西也不起作用。它给出了一个错误echo。那么我需要以某种方式分离每个命令吗?用另一个冒号前面的echo并没有解决问题。

感谢您的帮助!

回答

2

你可以做到这一点,但我建议反对它。一个映射将您的案例中的一个或两个按键(,m)链接到一系列按键。因此,做你想做的事,你只需要如果你是交互做,你会在命令中键入:

nmap <silent> ,m :set hlsearch!<CR>:if (&hlsearch)<CR>echo "Search Highlight On"<CR>else<CR>echo "Search Highlight Off"<CR>endif<CR> 

每个<CR>是按ENTER的等价物。 <silent>阻止它将映射的全部内容回显到屏幕,因此您只能看到“搜索亮点开/关”。

,您可以加入命令(在某些情况下),另一种方法是用|因此,例如:

:if (1) | echo "works" | endif 

更多这方面的信息,请参阅:help :bar

用功能做!从长远来看,这将使事情变得更加可维护。

+0

谢谢Al,现在我明白了这里一个函数的作用。感谢每一个提示,特别是':bar'。 – sidyll

4

在这种情况下不需要使用if。三元运算符?:即可。

nnoremap <silent> ,m :set hlsearch!<bar>echo "Search Highlight ".(&hlsearch?"On":"Off")<cr> 

而且,在这种特殊情况下,:set-?可能是不够的:

nnoremap <silent> ,m :set hlsearch!<bar>:set hlsearch?<cr> 
+0

+1,感谢您的替代解决方案;-)非常有趣和简单,我不知道Vim中的三元运算符。 – sidyll

+1

可以使用terser版本:':nnoremap ,m:set hls! HLS? '。 –

1
:nohlsearch 

:set hlsearch! hlsearch? 

:nnoremap <C-l> :<C-u>nohlsearch<bar>set nocursorline nocursorcolumn nolist<CR><C-l> 
+0

JA niebędęgrzesząwięcej:-) – sidyll

1

类似于接受的答案的方式这样做的另一种方式:

map ,m :set hlsearch! \| echo &hlsearch?"on":"off"<cr> 

但使用?运算符而不是if else构造。

+0

谢谢@skeept。这也是Luc Hermitte提出的 – sidyll

+0

奥普斯,我错过了。我稍后可能会删除我的答案。 – skeept