2014-04-15 2 views
3

vim에서 파일 (버퍼가 아님)에 텍스트를 추가하는 기능이 필요합니다. 내가 볼 수있는 한 appendfile()은 없습니다. 그러나 원하는 기능 readfile()writefile()로 에뮬레이트 할 수 있습니다 매우 커질 수 있습니다vim 스크립트를 사용하여 파일에 텍스트를 추가하려면 어떻게합니까?

fu! TQ84_log (S) 

    let l:f = readfile('my.log') 
    call add(l:f, a:S) 
    call writefile(l:f, 'my.log') 

endfu 

my.log 때문에, 차라리 읽을 줄 내가 라인을 추가 할 때 전체 파일을 작성합니다. 그래서 나는 또 다른 "해결책"을 생각해 냈습니다 :

fu! TQ84_log (S) 
    silent execute "!echo " . a:S . ">> my.log"  
endfu 

이것은 예상대로 작동합니다. 그러나 내가 TQ84_log()을 호출하면 잠시 동안 그 cmd.exe 창이 팝업됩니다. 이것은 약간 산만합니다.

더 나은 방법인가요? 다음

+0

대안을 찾을 수없는 경우 [shell.vim plugin] (http://www.vim.org/scripts/script.php?script_id=3123)과 함께 cmd.exe 창을 피할 수 있습니다. . – mMontu

+3

당신은'fu' 대신에'function'을 사용해야하며 더 읽기 쉬운 변수 이름을 사용해야합니다. 다른 사람들을 위해 그렇게하지 않으면 적어도 자신을 위해 그렇게하십시오. – romainl

답변

7

당신이 로그 파일에 추가 할 현재의 버퍼 라인의 범위가있는 경우,

:[range]w >> my.log 

당신이 원하는 것을 정확히 않습니다. 예를 들어, 대체 파일을 my.log 대체 파일로 만드는 부작용이 있으며 :e# 또는 그 밖의 파일을 사용하려는 경우 파일이 엉망이 될 수 있습니다.

로그 메시지가 이미있는 경우 변수에 스크래치 버퍼를 열 수 있다면 append() 또는 :put을 사용하여 스크래치 버퍼에 라인을 추가 한 다음 :w >> my.log 라인을 추가하고 스크래치 버퍼를 닫습니다.

:help special-buffers 
:help :put 
:help :w 

여기에는 완전한 로그 기능이 있습니다. 개선의 여지가 있습니다 : 창을 분할하고 비어있는 버퍼에 :put이 있으면 원치 않는 빈 줄이 생기면 :new:q의 조합이 레이아웃을 복원하지 못할 수 있습니다.

function! Mylog(message, file) 
    new 
    setlocal buftype=nofile bufhidden=hide noswapfile nobuflisted 
    put=a:message 
    execute 'w >>' a:file 
    q 
endfun 
+0

이것은 완벽합니다. 이제 필자의 FIFO에 쉽게 쓸 수 있습니다. 나는 FIFO를 사용하여 ssh를 통해 다른 컴퓨터로 텍스트를 전달합니다. – Sukima

관련 문제