Vim行号在以8开头的行上做奇怪的事情

nr7wwzry  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(144)

我设置了一些命令,在我当前的光标位置下运行测试。使用命令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堆栈交换。

e3bfsja2

e3bfsja21#

此命令:

:exec '!echo "%:'.line('.').'"'

从内到外分几个步骤处理:

  1. line('.')被评估为8
  2. '!echo "%:'.'8'.'"'的计算结果为'!echo "%:8"'
  3. '!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,依此类推。
  4. !echo "test.txt"(或!echo "test.txt0",或!echo "test.txt00"等)中的一个或多个。
    为了避免不必要的扩展,您应该分别计算文件名和行号:
'!rails test '.expand('%').':'.line('.')

相关问题