用了 vim 这么久,一直没注意 gvim 是怎么运行的,今天看清楚了。

从源码编译了最新版本的 vim,在安装路径的 bin 目录下,gvim 并不是一个独立的可执行文件,而是以软链接指向 vim 可执行文件的方式存在的。像这样

eview -> vim
evim -> vim
ex -> vim
gview -> vim
gvim -> vim
gvimdiff -> vim
gvimtutor
rgview -> vim
rgvim -> vim
rview -> vim
rvim -> vim
view -> vim
vim
vimdiff -> vim
vimtutor
xxd

直接运行 gvim 时,看似和直接运行 vim 没什么区别,但运行 gvim 是会出现图形化窗口的,而直接运行 vim 只在终端中打开编辑器。

那 gvim 这个软链接是怎么做到和 vim 以不同的方式运行的呢?

刚产生这个疑问的时候,我还使劲去想软链接是怎么做到的,后来肯定这不是软链接的功能,那肯定是 vim 执行文件里有猫腻。

在 vim 的源码 src/main.c 文件中,有这么个函数 parse_command_name(),它的备注是这样的

/*
 * Check for: [r][e][g][vi|vim|view][diff][ex[im]]  (sort of)
 * If the executable name starts with "r" we disable shell commands.
 * If the next character is "e" we run in Easy mode.
 * If the next character is "g" we run the GUI version.
 * If the next characters are "view" we start in readonly mode.
 * If the next characters are "diff" or "vimdiff" we start in diff mode.
 * If the next characters are "ex" we start in Ex mode.  If it's followed
 * by "im" use improved Ex mode.
 */
static void parse_command_name(mparm_T *parmp)

原来是这样!

机智的实现了把名称当参数用,还自带防伪,执行命令的名称必须满足这个规则,否则就无法按照预期效果启动了。

:-)