Vim保存文件時移除尾行換行符的方法

| Comments

Vim認為一個文本文件的每一行都應該由一換行符結束,即使文件的最後一行也不例外。這就使得Vim保存過的文本文件在其它文本編輯器中查看時可能會在文件末尾多出一個空行。一般來說,這不是個問題,但對于程序員來說,有時候一些不規範的運行環境或其它組件就要求文件的最後一行不能有換行符,否則就會出莫名其妙的問題,尤其是在Windows環境下最常見。

要在保存文件時不在最後一行添加換行符,最常見、最簡單的方法就是:

1
2
:set binary
:set noendofline

但是這樣做有一個問題,就是會把DOS格式的文件自動轉換成UNIX格式,WinSlave們肯定不希望這麽做。

因此,可在vimrc中加入如下內容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
" Save the current buffer as a file with no EOF sign.
function! SaveAsNOEOF(filename)
    let a=getline(1,line('$')-1)
    let b=map(a, 'iconv(v:val,"'.&enc.'","'.&fenc.'") . nr2char(13)')
    call extend(b, getline('$', '$'))
    call writefile(b,a:filename, 'b')
    if a:filename == bufname('%')
        set nomodified
    endif
endfunction
" Save the current buffer and get rid of the EOF sign.
function! SaveNOEOF()
    call SaveAsNOEOF(bufname('%'))
endfunction
command! -complete=file -nargs=0 SaveNOEOF :call SaveNOEOF()
command! -complete=file -nargs=1 SaveAsNOEOF :call SaveAsNOEOF(<q-args>)

然後就可以使用SaveNOEOF和SaveAsNOEOF兩條命令去保存沒有EOF的文件了。

說明:本文的目的在于保存文件時移除最後一行的換行符,而并非移除EOF,上述配置中使用EOF只為記憶更容易起見。

更新:

2010-12-15
  1. 修正SaveNOEOF命令報缺少參數的錯誤的問題
  2. 修正保存當前buffer後沒有變更文檔修改狀態的問題
  3. 修正保存文件後總是將編碼轉換成encoding選項的值的問題

Comments