gvim 原来是这样启动的
用了 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)
原来是这样!
机智的实现了把名称当参数用,还自带防伪,执行命令的名称必须满足这个规则,否则就无法按照预期效果启动了。
:-)