在映射中编写脚本

时间:2011-03-15 17:34:50

标签: vim

最近我创建了一个映射来切换高亮搜索。这很简单但很有用,比如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"之类的内容也不起作用,即使ifecho都是"冒号"命令。它会导致echo出错。那么我需要以某种方式分离每个命令吗?在echo之前使用另一个冒号并没有解决问题。

感谢您的帮助!

4 个答案:

答案 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构造。