2

選択したテキストをファイルに追加してから削除するMoveToFile関数があります。

command! -nargs=* -complete=file -range=% -bang -bar MoveToFile
\   :<line1>,<line2>call MoveToFile(<q-args>, <bang>0)
function! MoveToFile(fname, overwrite) range
    let r = a:firstline . ',' . a:lastline
    exe r 'w>>' . ' !'[a:overwrite] . fnameescape(a:fname)
    exe r 'd'
endfunction

追加しようとしているファイルがすでにVimで開いていると、問題が発生します。どうすればこれを回避できますか?

4

2 に答える 2

2

あなたはキャッチすることができますE139: File is loaded in another buffer。このコーナーケースを本当に処理する必要がある場合は、内容をヤンクし、を介して既存のバッファーを開き、:buffer {fname}それらを貼り付けます。

try
   exe r 'w>>' . ' !'[a:overwrite] . fnameescape(a:fname)
catch /^Vim\%((\a\+)\)\=:E139/
    exe r 'yank'
    exe 'sbuffer' fnameescape(a:fname)
    $put
    hide
endtry
于 2012-08-11T18:26:53.113 に答える
0

次を使用できますwritefile()(これによりファイルが上書きされるため、最初に現在のコンテンツを取得する必要があるため、大きなコンテンツには使用できません):

function MoveToFile(fname, _) range abort
    let lines=readfile(a:fname, 'b')
    if !empty(lines) && empty(lines[-1])
        call remove(lines, -1)
    endif
    let [first, last]=((a:firstline>a:lastline)?([a:lastline, a:firstline]):([a:firstline, a:lastline]))
    let lines+=getline(first, last)+['']
    call writefile(lines, a:fname, 'b')
    execute first.','.last.'delete _'
endfunction

注:と同じエンコーディングを取得するには、:w>>行を置き換える必要があります

    let lines+=getline(first, last)+['']

    let lines+=map(getline(first, last), 'iconv(v:val, &enc, &fenc)')+['']

'dos'ファイル形式も尊重するには:

    let lines+=map(getline(first, last), 'iconv(v:val, &enc, &fenc)'.((&ff is# 'dos')?('."\r"'):('')))+[(&ff is# 'dos')?("\r"):('')]

'mac'ファイル形式を尊重するのは難しいです)。

于 2012-08-11T14:33:02.660 に答える