微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

vim – 如何将参数从:命令传递给函数?

我想写一个命令,这个命令会有这样的格式:
[range]MyCMD[!] [count] [oneArg] [flags]

要么

[range]MyCMD[!] [oneArg] [count] [flags]

类似于

:[range]P[rint] [count] [flags]

要么

:[range]d[elete] [x] {count}

MyCMD命令最终会调用一个函数来完成一些工作.我写了这一行(不会起作用)

command! -nargs=+ -range -bang -count=0  MyCMD <line1>,<line2>call MyFUNC(<q-args>,"<bang>","<count>",.... ..)

这里的问题是,如何处理这些参数:

>问题1我读到了关于帮助的问题,-range和-count不能同时使用,但我需要它们.我还看了一些vim命令,比如:delete,:print,当我们使用这些命令时,我们可以给出范围和计数.另外,如果{count}或[count]可用,我发现vim doc有两个相同命令的条目.喜欢:

:[range]d[elete] [x]    
:[range]d[elete] [x] {count}

要么

:[range]p[rint] [flags]
:[range]p[rint] {count} [flags]

这是为什么?为什么不只是[计数]? (这将是另一个小问题)

>问题2来自我的设计,所有这些参数都是可选的,它们都有认值(参见下表).如何将这些参数传递给函数(我检查了< q-args>和< f-args>),我如何区分哪个用户输入是哪个参数?例如用户给出

:MyCMD 5克

5 is count? or arg? 
 g is arg or flag?
 or '5 g' is arg?

这是args的认值:

argName | Default value | description
    -------------------------------------
    range   | current line  | this Could be get by function xxx ( ) range
    count   | 0             | this Could be get by <count>
    bang    | ""            | this is easy too,with <bang>
    arg     | " "           | this argument Could have space
    flags   | ""            | no space allowed for flags
    -------------------------------------

谢谢.

对于复杂的自定义命令,您不能仅仅依赖于Vim有限的解析选项;你可以使用-range处理范围,但必须自己解析你的参数组合.
:command! -nargs=* -range -bang MyCMD <line1>,<line2>call MyFUNC(<bang>0,<q-args>)

在MyFUNC内部(可能定义为:函数MyFUNC(…)范围只能被调用一次),split()在空格上的参数.或者,您可以定义函数以使用可变数量的参数并使用< f-args>,但请注意函数参数的数量是有限的(到20 IIRC).

< bang> 0是将爆炸变换为布尔值的一个很好的技巧,这通常是你需要的.

原文地址:https://www.jb51.cc/vim/384944.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐