为什么 GVim 将 system() 函数的输出显示为 ^M 和 ^@

为什么 GVim 将 system() 函数的输出显示为 ^M 和 ^@
function! g:insert_date()

    let l:pattern="\\d\\{2}:\\d\\{2}"

    let l:match=match(getline('.'),l:pattern)

    let l:curline=getline('.')

    echo "Current line: ". l:curline

    normal gg

    let l:time=system("time /t")

    let l:date=system("date /t")

    let l:date_time=l:date."\t".l:time

    if l:match!=-1

        echo match

        normal dd

        "call setline('.',system('time /t')."<<>>")

        call setline('.',l:date_time)

    else

        echo match ." ". l:curline." ".l:pattern

        sleep 2

        normal O

        "call setline('.',system("time /t")."\r")

        call setline('.',l:date_time)

        normal dd

    endif

endfunction

我有上面的代码,用于在文件的第一行插入日期和时间。

我本来要将它分配给 BufRead 自动命令,但它还不完美。基本上,它会检查文件第一行是否有时间字符串,如果找到就更新它。如果没有,它会在上面打开一个换行符并插入日期。问题是当找不到字符串时它不会打开换行符。normal 0是罪魁祸首。当我在命令行中输入它时它可以工作,但调用该函数时会失败。另外,我不知道为什么你必须在脚本中两次转义 regExp,而使用一个反斜杠和 就可以正常工作?/

您所见,我已经用该函数注释了该行,system()因为它不断插入可见的空字节(ascii 0)和回车符(ascii 13)。是什么system()让它们可见。我还没有找到解决这个问题的方法(不存储在变量中。我需要 一行read!中的日期和时间)。

call setline('.',system("time /t")."\r")

call setline('.',system("time /t")."\n\n\n\n\n")  ^@^@^@^@^@^@^@

call setline('.',system("time /t")."\n\n\n\n\n")  ^@^@^@^@^@^@^@ (0)

call setline('.',system('time /t')."\r\r\r\r\r\r") ^M^M^M^M (13)

read! time\ /t

额外细节:

  1. 编码=utf-8
  2. set list已关闭
  3. 字体是consolas:h10
  4. 文件格式为 dos
  5. 版本=7.3

答案1

我找到了答案。该system函数从 windowsdate函数读取文件。该date函数输出以 作为结尾的文本CRLF,而文件有LF行尾。Vim 发现差异并显示它。我将所有行尾替换为CRLF,它们就消失了。

相关内容