使Vim映射安静

使Vim映射安静,vim,Vim,我有一个映射,用于在一行上打印高亮显示。我从这里的其他海报上得到了这个想法,所以谢谢你。我是这样做的: function! PrintSyntaxItem() let l:colorsyntax = synIDattr(synID(line("."), col("."), 0), "name") execute "highlight" l:colorsyntax endfunction 我把它画成这样: nnoremap <A-s> :call PrintSynta

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

function! PrintSyntaxItem()
    let l:colorsyntax = synIDattr(synID(line("."), col("."), 0), "name")
    execute "highlight" l:colorsyntax
endfunction
我把它画成这样:

nnoremap <A-s> :call PrintSyntaxItem()<CR>
我想丢失
:execute
行,然后按ENTER键行也会消失。有没有办法做到这一点?如果我将
静音
放在
执行
的前面,我仍然会打印出该行,但会丢失
高亮显示
输出(以及按ENTER键提示),但为了返回所需的输出,我只需在其前面加上
非静音
,然后我会得到它,但

基本上,我想要么抑制
:执行
行的回音,要么在事后清除它,但我不确定该怎么做,拖网搜索文档以获取有关操纵消息的信息还没有取得任何成果


谢谢。

你不应该沉默,但正如你在问题标题中所写,映射本身:

nnoremap <silent> <A-s> :call PrintSyntaxItem()<CR>
nnoremap:调用PrintSyntaxItem()
这就是说,execute命令看起来不容易被静音。我会调查的

编辑


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

会出现按enter键提示,因为突出显示的输出占用了多行。您可以通过重定向输出、删除
\n
,然后回显它来删除多余的行:

函数!PrintSyntaxItem()
让l:output=''
redir=>l:输出
静默执行“hi”synIDattr(synID(行(“.”),列(“.”,0),“名称”)
重拨端
回音替换(l:输出,'\n',''')
端功能
但是,
xxx
示例不再正确突出显示。相反,您可以通过临时更改
cmdheight
,取消按enter键提示:

nnoremap:set ch=2\| exec“hi”
\synIDattr(synID(第行(“.”),第列(“.”,0),“名称”)\\集ch=1

这可以通过最初将命令行高度更改为2,然后再将其恢复为1来切断空行,从而防止在第一个位置打印提示。我完全取消了这个函数,但是如果您愿意,您当然可以在
set ch
之间调用它。

与其对命令行高度敷衍了事,不如突出显示整行,而不仅仅是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>
函数!showtyntaxitem()
redir=>l:输出
静默执行“hi”synIDattr(synID(行(“.”),列(“.”,0),“名称”)
重拨端

设l:parts=matchlist(输出,'\v\n@In在我的例子中,高亮显示只占用一行;映射本身的回声在输出中添加了一行。尝试使用
映射,就像@romainl建议的那样,使用原始函数,您将看到仍然有一条空行。我提供的
set ch
映射修复了这一问题t、 啊,是的,好的,我看到输出不仅有一个额外的行,而且(当我做
回波替换时
位)它也不会清除消息窗口。谢谢你的
设置ch
功能,我现在就试试。谢谢,我没有考虑过在映射命令本身上挖掘文档。我总是忘记了各种命令的
。解决方案很好。谢谢!
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>