Por que o GVim está exibindo a saída da função system () como ^ M e ^ @

0
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

Eu tenho este código acima que deveria inserir a data e hora  na primeira linha do arquivo.

Eu ia atribuí-lo a um autocomponente BufRead, mas ainda não é perfeito. Basicamente, ele verifica se há uma string de tempo na primeira linha do arquivo e, se encontrado, o atualiza. Caso contrário, abre uma nova linha acima e insere a data. O problema é que ele não abre uma nova linha quando a string não é encontrado. normal 0 é o culpado. Ele funciona quando eu o digito na linha de comando, mas falha quando a função é chamada. Além disso, eu não sei porque você tem que escapar do regExp duas vezes no script enquanto ele funciona bem com uma barra invertida com ? e / .

Como você pode ver, eu comentei a linha com a função system() porque ela continua inserindo bytes nulos visíveis (ascii 0) e retornos de carro (ascii 13). O que é system() fazendo isso os torna visíveis. Eu não encontrei uma solução alternativa para isso ( read! não armazena em uma variável. Eu preciso da data e hora no
uma linha).

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

Detalhes adicionais:

  1. codificação = utf-8
  2. set list está desativado
  3. Fonte é consolas: h10
  4. o formato de arquivo é dos
  5. versão = 7.3
por Segfault 12.08.2013 / 19:04

1 resposta

0

Eu encontrei a resposta. A função system lê a função date do Windows no arquivo. A função date exibe o texto com CRLF como final, enquanto o arquivo possui LF finais de linha. Vim identifica a diferença e a exibe. Eu substituí todos os finais de linha para CRLF e eles desapareceram.

    
por 20.08.2013 / 18:49