我设置了一些命令,在我当前的光标位置下运行测试。使用命令rails test <filename>:<linenumber>
。我通过exec '!rails test %:'.line('.')
执行这个命令,它在大多数情况下都能正常工作。但是,由于某种原因,当行号以8
开头时,它的行为很奇怪。
当使用命令:exec '!echo "%:'.line('.').'"'
进行测试时,我会得到以下输出
line 7 -> test.txt:7
line 8 -> test.txt
line 9 -> test.txt:9
line 79 -> test.txt:79
line 80 -> test.txt0
line 89 -> test.txt9
line 90 -> test.txt:90
这种模式在800年代也会重复。我是不是漏掉了什么明显的东西?
编辑:正如有人在评论中建议的i posted my question上的vi堆栈交换。
1条答案
按热度按时间e3bfsja21#
此命令:
从内到外分几个步骤处理:
line('.')
被评估为8
,'!echo "%:'.'8'.'"'
的计算结果为'!echo "%:8"'
'!echo "%:8"'
在被发送到:execute
之前由Vim解析,以便扩展:help cmdline-special
中解释的各种特殊字符。“问题”(如果你问我的话,更像是“强大的特性”)是扩展考虑了:help filename-modifiers
,而:8
是一个合法的文件名修饰符:用法:8将路径转换为8.3短格式(目前仅在MS-Windows上)。将作用于现有路径的所有部分。
扩展后,
'!echo "%:8"'
看起来像'!echo "test.txt"'
,因为没有进行任何转换。如果数字是80
,则得到test.txt0
,因为文件名保持不变,然后是尾随的0
。对于test.txt00
,依此类推。!echo "test.txt"
(或!echo "test.txt0"
,或!echo "test.txt00"
等)中的一个或多个。为了避免不必要的扩展,您应该分别计算文件名和行号: