有時使用 Vim 打開一個文件會在窗口底部發現 [noeol], [dos] 提示信息:
"hello-dos.txt" [noeol][dos] 2L, 10C 1,1 All
這兩個符號有何含義?
直觀上理解,'noeol' 就是 'no end-of-line', 即“沒有行末結束符”, Linux 下的文本編輯器(如 Vim)會在每一行 (包括最后一行)末尾添加一個換行符。比如我們在 Debian 下新建一個名為 'hello-unix.txt' 的文本文件,內容如下:
Hello Unix
那么,使用cat -A hello-unix.txt命令可以看到這些換行符:
ts@TS:~/www/document$ cat -A hello-unix.txt
Hello$
Unix$
ts@TS:~/www/document$
從中可以清楚地看到每行末尾的 '$' 字符,這就是 Linux 下的“行末結束符”。
下面我們再在 Windows 下創建一個名為 'hello-dos.txt' 記事本文件,內容如下:
Hello DOS
在 Debian 下查看此文件的換行符信息:
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保存退出,再查看換行符:
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