2

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

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

我像这样映射它:

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

但是,当我执行它时,我会回显命令行以及我想要的输出,这会导致出现“Press ENTER”提示。即在我看到的输出中:

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

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

基本上我想要么抑制:execute线路的回声,要么在事后清除它,但我不知道该怎么做,并且拖网文档以获取有关处理消息的信息并没有取得任何成果。

谢谢。

4

3 回答 3

6

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

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

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

编辑

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

于 2013-01-22T19:40:01.757 回答
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如果您愿意,当然可以在两者之间调用它。

于 2013-01-22T21:23:10.370 回答
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>

请注意,如果它在 redir 之前存在,则无需声明l:output或重新初始化它,如:he redir. 这很方便,将进入 ye olde vimrc。

于 2013-01-30T04:25:39.810 回答