使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>