记一次 vim 报错

vim 是我在 Linux 上面最常用的编辑器,如果想要更好地使用它,需要对它进行一些设置。具体的方法是修改用户目录下的 .vimrc ,默认情况下需要自己创建这个文件。

在里面添加这些设置,下次打开 vim 就能看到效果。例如( " 是注释符号)

set nu "显示行数
set showmatch "显示匹配的括号([{和}])
set hlsearch "高亮显示搜索的内容
"...

但是我有很多台 Linux 设备,每一台都自己去写一遍配置就太累了吧。于是我想把这个文件放在 gitee 上( GitHub 有时连接不太上),之后其它的机器,只需要把这个文件下载下来即可。当然我还想放一些其它的配置,所以我新建一个 dotfiles 仓库,在里面放一些配置文件。

我直接在 gitee 上面新建仓库,用 readme 初始化,然后新建文件,将 vim 配置复制粘贴进去。

此时我在新设备上,就不只是单纯下载 .vimrc 这个文件了,我把整个 dotfiles 仓库克隆的 /home 目录下。然后用软链接的方式,将用户目录下的 .vimrc 指向 /home/dotfiles/.vimrc

ln -s /home/dotfiles/.vimrc ~/.vimrc

之后如果我这个仓库更新了,我直接在 /home/dotfiles/ 这个目录下用 git pull 更新即可。

但是这时我发现用 vim 报错了,每次使用都会输出

Error detected while processing /root/.vimrc:
line 3:
E474: Invalid argument: encoding=utf-8^M
line 8:
E488: Trailing characters: number^M
line 9:
E488: Trailing characters: wildmenu^M
line 10:
E488: Trailing characters: autoread^M
line 11:
E488: Trailing characters: autoindent^M
line 13:
E474: Invalid argument: tabstop=4^M
line 14:
E539: Illegal character <^M>: mouse=a^M
line 15:
E492: Not an editor command: ^M
line 18:
E15: Invalid expression: has("autocmd") ^M
line 22:
E171: Missing :endif
Press ENTER or type command to continue

看来关键错误在于 ^M ,Google 一下,很快就发现问题所在了。因为用 gitee 创建的文件,使用的 fileformat 是 dos ,为了验证这个,我后来又在 gitee 创建一个 .alias 文件,拉取到 Linux 后,用 vim 打开这个文件,后看到底部显示

“.alias” [noeol] [dos] 3L, 68C

也可以使用 set ff? 命令来查看,在默认状态下,输入 :,再输入这条命令即可看到。

知道问题所在了,解决方法也很简单,用 vim 打开这个文件,将 fileformat 改为 unix 即可。

:set ff=unix

保存,退出。

此时 vim 就可以正常读取配置文件了。但是这么搞也不是办法啊,每台设备都去转换一下格式?那也够累的。于是我尝试在 GitHub 上创建文件看看,结果发现直接在 GitHub 网页上面创建的文件,fileformat 默认就是 unix ,看来还是切换到 GitHub 吧。

项目:https://github.com/powersee/dotfiles.git

.alias文件也可以像 .vimrc 那样软链接到用户目录下,也可以不用,在 .zshrc or .bashrc 中,添加

source /home/dotfiles/.alias

即可。

这个的作用是自定义一些命令,少打些字。例如用 d 代替 docker,用 di 代替 docker images 。