使Vim映射安静

时间:2013-01-22 19:24:03

标签: vim

我有一个映射,用于在一行上打印突出显示。我从其他海报中得到了这个想法,谢谢你。这是我的所作所为:

function! PrintSyntaxItem()
    let l:colorsyntax = synIDattr(synID(line("."), col("."), 0), "name")
    execute "highlight" l:colorsyntax
endfunction

我按照这样的方式映射:

nnoremap <A-s> :call PrintSyntaxItem()<CR>

然而,当我执行它时,我得到命令行回显以及我想要的输出,这导致获得“按ENTER”提示。即在输出中我看到:

:execute "highlight" synIDattr(synID(line("."), col("."), 0), "name")
vimBracket     xxx links to Delimiter
Press ENTER or type command to continue

我想丢失:execute行,然后按ENTER键也会消失。有没有办法做到这一点?如果我将silent放在execute前面,我仍然会打印出该行,但会丢失highlight输出(以及按ENTER键提示),但是然后取回我想要的输出我只是用unsilent作为前缀,我得到它但是......

基本上我想要抑制:execute行的回声或者事后清除它但是我不知道怎么做并且拖网文件以获取关于操纵消息的信息并没有承担任何水果

感谢。

3 个答案:

答案 0 :(得分:5)

这不是你应该沉默的命令,但正如你在问题的标题中写的那样,映射本身:

nnoremap <silent> <A-s> :call PrintSyntaxItem()<CR>

也就是说,执行命令看起来不容易被静音。我会调查一下。

修改

我已经尝试了所有可以找到的技巧,包括:redir =>和十几种[<]silent[>]的组合,但我无法获得所需的结果。要么得到提示,要么我什么也得不到。我非常抱歉!

答案 1 :(得分:4)

出现按下输入提示,因为highlight的输出占用了多行。您可以通过重定向输出,删除\n,然后回显它来摆脱额外的行:

function! PrintSyntaxItem()
    let l:output = ''
    redir => l:output
    silent exec "hi" synIDattr(synID(line("."), col("."), 0), "name")
    redir END
    echo substitute(l:output, '\n', '', '')
endfunction

但是,xxx样本不再正确突出显示。相反,您可以通过暂时更改cmdheight

来破解按下输入提示
nnoremap <silent> <A-s> :set ch=2 \| exec "hi"
    \ synIDattr(synID(line("."), col("."), 0), "name") \| set ch=1<CR>

这可以通过最初将命令行高度更改为2,然后将其恢复为1以便切断空行来防止首先打印提示。我完全取消了该功能,但如果您愿意,您当然可以在set ch之间调用它。

答案 2 :(得分:1)

不是用命令行高度捏造,而是突出显示整行而不仅仅是xxx部分呢?

function! ShowSyntaxItem()
    redir => l:output
    silent exec "hi" synIDattr(synID(line("."), col("."), 0), "name")
    redir END
    let l:parts = matchlist(output, '\v\n@<=(\S+)(.*$)')
    if (len(l:parts) >= 3)
      redraw | exec "echohl ".l:parts[1] | exec "echo '".l:parts[0]."'" | echohl None
    endif
endfunction

nnoremap <silent> <Leader>as :call PrintSyntaxItem()<CR>

注意,如果l:output中所述,如果它存在于redir之前,则无需声明:he redir或重新初始化它。这非常方便,并且应该进入你的vimrc。