我想写一个命令,这个命令会有这样的格式:
[range]MyCMD[!] [count] [oneArg] [flags]
Run Code Online (Sandbox Code Playgroud)
要么
[range]MyCMD[!] [oneArg] [count] [flags]
Run Code Online (Sandbox Code Playgroud)
类似于
:[range]P[rint] [count] [flags]
Run Code Online (Sandbox Code Playgroud)
要么
:[range]d[elete] [x] {count}
Run Code Online (Sandbox Code Playgroud)
该命令MyCMD
最终会调用一个函数来完成一些工作.我写了这一行(不会起作用)
command! -nargs=+ -range -bang -count=0 MyCMD <line1>,<line2>call MyFUNC(<q-args>, "<bang>","<count>", .... ..)
Run Code Online (Sandbox Code Playgroud)
这里的问题是,如何处理这些参数:
问题1我读到的帮助,-range
并且-count
不能在不同时使用,但我需要他们.我还看了一些vim命令,比如:delete,:print,当我们使用这些命令时,我们可以给两个range
和count
.另外,我发现vim doc有两个相同命令的条目,如果a {count}
或者[count]
是可用的.喜欢:
:[range]d[elete] [x]
:[range]d[elete] [x] {count}
Run Code Online (Sandbox Code Playgroud)要么
:[range]p[rint] [flags]
:[range]p[rint] {count} [flags]
Run Code Online (Sandbox Code Playgroud)
这是为什么?为什么不随着[count]
?(这将是另一个小问题)
问题2来自我的设计,所有这些参数都是可选的,它们都有默认值(参见下表).如何将这些参数传递给函数(我检查过<q-args> and <f-args>
)以及如何区分哪些用户输入是哪个参数?例如用户给出
:MyCMD 5 g
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
-------------------------------------
Run Code Online (Sandbox Code Playgroud)这是args的默认值:
[range]MyCMD[!] [count] [oneArg] [flags]
Run Code Online (Sandbox Code Playgroud)
谢谢.
Ing*_*kat 11
对于复杂的自定义命令,您不能仅仅依赖于Vim有限的解析选项; 你可以让它处理范围-range
,但必须自己解析你的参数组合.
:command! -nargs=* -range -bang MyCMD <line1>,<line2>call MyFUNC(<bang>0, <q-args>)
Run Code Online (Sandbox Code Playgroud)
内部MyFUNC
(可能定义:function MyFUNC( ... ) range
为仅调用一次),split()
空格上的参数.或者,您可以定义函数以使用可变数量的参数并使用<f-args>
,但请注意函数参数的数量是有限的(到20 IIRC).
将<bang>0
爆炸转换为布尔值是一个很好的技巧,通常是你需要的.