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
额外细节:
- 编码=utf-8
set list
已关闭- 字体是consolas:h10
- 文件格式为 dos
- 版本=7.3
答案1
我找到了答案。该system
函数从 windowsdate
函数读取文件。该date
函数输出以 作为结尾的文本CRLF
,而文件有LF
行尾。Vim 发现差异并显示它。我将所有行尾替换为CRLF
,它们就消失了。