最近我创建了一个映射来切换高亮搜索。这很简单但很有用,比如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
但可能这不是正确的方法,不起作用,我甚至不知道是否可能。
我注意到的另一件事是,输入:if (1) echo "works"
之类的内容也不起作用,即使if
和echo
都是"冒号"命令。它会导致echo
出错。那么我需要以某种方式分离每个命令吗?在echo
之前使用另一个冒号并没有解决问题。
感谢您的帮助!
答案 0 :(得分:5)
在此上下文中无需使用if
。三元运算符?:
将完成。
nnoremap <silent> ,m :set hlsearch!<bar>echo "Search Highlight ".(&hlsearch?"On":"Off")<cr>
此外,在这种特定情况下,:set-?
就足够了:
nnoremap <silent> ,m :set hlsearch!<bar>:set hlsearch?<cr>
答案 1 :(得分:3)
你可以做到,但我建议不要这样做。映射将您的案例中的一个或两个按键(,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
。
使用函数执行此操作!从长远来看,它会使事情更易于维护。
答案 2 :(得分:1)
:nohlsearch
:set hlsearch! hlsearch?
:nnoremap <C-l> :<C-u>nohlsearch<bar>set nocursorline nocursorcolumn nolist<CR><C-l>
答案 3 :(得分:1)
以类似于接受的答案的方式执行此操作的另一种方式:
map ,m :set hlsearch! \| echo &hlsearch?"on":"off"<cr>
但使用?
运算符代替if else
构造。