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отключен
- Шрифт консоль:h10
- формат файла - дос
- версия = 7,3
