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

1 ответ1

0

Я нашел ответ. system функция считывает из date функцию Windows в файл. Функция date выводит текст с CRLF качестве его окончания, в то время как файл имеет LF окончания строк. Vim замечает разницу и отображает ее. Я заменил все окончания строк на CRLF и они исчезли.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .