Vim 編輯器底端 [noeol], [dos] 的含義
有時使用 Vim 開啟一個檔案會在視窗底部發現 [noeol], [dos] 提示資訊:
1 |
"hello-dos.txt" [noeol][dos] 2L, 10C 1,1 All |
這兩個符號有何含義。
直觀上理解,'noeol' 就是 'no end-of-line', 即“沒有行末結束符”, Linux 下的文字編輯器(如 Vim)會在每一行 (包括最後一行)末尾添加一個分行符號。比如我們在 Debian 下建立一個名為 'hello-unix.txt' 的文字檔,內容如下:
那麼,使用cat -A hello-unix.txt命令可以看到這些分行符號:
1 2 3 4 |
ts@TS:~ /www/document $ cat -A hello-unix.txt Hello$ Unix$ ts@TS:~ /www/document $ |
從中可以清楚地看到每行末尾的 '$' 字元,這就是 Linux 下的“行末結束符”。
下面我們再在 Windows 下建立一個名為 'hello-dos.txt' 記事本檔案,內容如下:
在 Debian 下查看此檔案的分行符號資訊:
1 2 3 |
ts@TS:~ /www/document $ cat -A hello-dos.txt Hello^M$ DOSts@TS:~ /www/document $ |
同樣是兩行,每行一個單詞,Windows 和 Linux 下的分行符號有兩個明顯不同:
Windows 下的分行符號比 Linux 下的多了個 ^M;
最後一行行末沒有分行符號;
這兩個不同之處也正是 [dos], [noeol] 兩個 Flag 資訊出現的原因。 Windows 下文字檔每行的分行符號為“斷行符號+換行“(CRLF,^M$), 而 Linux 下則僅為 “換行” (LF, $). Vim 發現文本中含有 ^m$ 換行字元判定為 Windows 下建立的 檔案,用 [dos] Flag 提示;Vim 沒有在最後一行發現分行符號,判定此檔案不是在 Linux 下建立/編輯,用 [noeol] Flag 提示使用者。
如何消除 [noeol] Flag 資訊。
只需在 Debian 下將該檔案重新儲存即可,還是上面的 hello-dos.txt 檔案,開啟它, 不做任何修改直接 :wq儲存退出,再查看分行符號:
1 2 3 4 |
ts@TS:~ /www/document $ cat -A hello-dos.txt Hello^M$ DOS^M$ ts@TS:~ /www/document $ |
分行符號已經追加上去,這裡要注意的是追加的是 Windows 下的分行符號(斷行符號+換行) ^M$, 而不是 Linux 下的分行符號(換行)$, 因為 Vim 已經發現此檔案 是在 Windows 下建立的([dos] Flag),儘管是在 Linux 下編輯,Vim 也會按照檔案建立 時所在的作業系統下的換行規則添加分行符號。
如何消除 [dos] Flag 資訊。
有兩個簡單的方法:
Linux 下提供有兩個命令用來進行 Windows 和 Unix 檔案的轉化:dos2unix 和 unix2dos;
在 Debian 下使用 touch template.txt 建立一個模板,在 Windows 下建立的任 何文字檔都以此模板為基礎;
參考資料
http://unix.stackexchange.com/questions/31807/what-does-the-noeol-indicator-at-the-bottom-of-a-vim-edit-session-mean
http://linux.vbird.org/linux_basic/0310vi.php#tips_dos