在vim中使静音功能非静音

在vim中使静音功能非静音,vim,scripting,Vim,Scripting,当我创建一个新的latex文件时,我使用vim脚本加载一个模板文件 当我编辑一个新的tex文件时,模板文件加载程序脚本能够执行一个定制的TemplateFileFunction_tex fun! TemplateFileFunc_tex() let tex_templates = "$HOME/.vim/templates/tex/" let choice = confirm("Which template should i load", \ "

当我创建一个新的latex文件时,我使用vim脚本加载一个模板文件

当我编辑一个新的tex文件时,模板文件加载程序脚本能够执行一个定制的TemplateFileFunction_tex

fun! TemplateFileFunc_tex()
    let tex_templates = "$HOME/.vim/templates/tex/"
    let choice = confirm("Which template should i load", 
                \ "&presentation\n" .
                \ "&hd-presentation\n" .
                \ "&paper\n" .
                \ "hd-pape&r\n" .
                \ "&xelatex-default\n")
    if choice == 1 " presentation
        execute "0r "  . expand(tex_templates . "presentation.tex")
" [...]
endfun
问题是模板文件加载器插件使用silent调用函数


如果没有“unsilent”,我如何在不更改插件的情况下使用自定义函数?

我看不到一种方法可以使
确认
在静音模式下接收用户输入。但是您可以使用
getchar

let variants=['&presentation', '&hd-presentation', ...]
echohl MoreMsg
unsilent echo "Which template should I load\n".join(variants, "\n")
echohl None
let reply=getchar()
if type(reply)==type(0)
    let reply=nr2char(reply)
endif
if reply is# "\n"
    let choice=1
else
    let replkeys=map(copy(variants), 'tolower(v:val[stridx(v:val, "&")+1])')
    let choice=index(replkeys, reply)+1
endif
if choice==1
    ...

这是另一个模板扩展器,但仍然可以正确处理向最终用户提出的问题。e、 g

VimL: " @file {rtp}/templates/tex.template

VimL: " way 1:
VimL: " instructions continued on several lines are not supported
VimL: let s:tex_kind = CONFIRM("Which template should i load", "&presentation\n&hd-presentation\n&paper\nhd-pape&r\n&xelatex-default\n", 1)
VimL: " include {rtp}/templates/tex/internals/presentation.template ?
VimL: if s:tex_kind == 1  | call s:Include('presentation', 'tex/internals') | endif
VimL: " include {rtp}/templates/tex/internals/hd-presentation.template ?
VimL: if s:tex_kind == 2  | call s:Include('hd-presentation', 'tex/internals') | endif
...

VimL: " Way 2
VimL: let s:tex_kind = WHICH("CONFIRM", "Which template should i load", "&presentation\n&hd-presentation\n&paper\nhd-pape&r\n&xelatex-default\n", 1)
VimL: let s:tex_kind = substitute(s:tex_kind, '&', '', 'g')
VimL: call s:Include(s:tex_kind, 'tex/internals')

好的,我在vim中找到了unsilent函数,但我不知道如何将其与确认函数一起使用。仅仅写“unsilent confirm”不起作用。接收用户输入不是问题。当我输入适当的字符时,选择get就是正确的用户输入。我想要的正是不悦耳的回声。非常感谢。在做出选择之前,我只能重复可能的选择。这对我来说似乎是最简单的方法。@Kungi在我的系统上
静默不静默回声确认(“Description\n&choice1\nc&hoice2\n”)
忽略了除了
(和
O
,但我没有测试它),但仍然显示提示,我猜这就是问题所在(我现在重新阅读了帮助,意识到我应该编写
静默、不静默的echo confirm(“Description”、“&choice1\nc&hoice2”)
).在最后一个变体中,确认正常工作。虽然我没有在函数中测试过。嗯,最后一个变体工作,但我不知道如何将其包装到函数中,因为我没有回显值。当我尝试这样的操作时:
let choice=unsilent confirm(…)
它不会打印任何内容。因此我将坚持使用
echo“选项”;let choice=confirm(…)
。这有点违背了confirm的目的,但对我有效:-)。@Kungi。为什么不
unsilent让
?我永远不会写
unsilent confirm()
,因为
unsilent
是一个接受另一个命令的命令,
confirm()
是一个表达式。当您编写vim脚本时,您应该知道在哪里使用命令和表达式,奇怪的是,我有时会看到人们误解它们
silent unsilent let var=confirm(…)
适合我。因为我不知道我可以将unsilent与let:-结合使用。我不写vim脚本,我只是尝试使用它们。但是非常感谢你的解释。这使事情更加清楚