我的 Debian 机器中有vim-athena
软件包(对于 观察到相同vim-gtk
)。
vim
在终端中生成 Vim。gvim
在 Athena GUI 中生成一个带有 Vim 的新窗口。但什么是vim
和gvim
?指向同一目标的符号链接。
$ readlink -e "$(type -p gvim)"
/usr/bin/vim.athena
$ readlink -e "$(type -p vim)"
/usr/bin/vim.athena
Run Code Online (Sandbox Code Playgroud)
最终目标是一个二进制文件。
$ file --brief /usr/bin/vim.athena
ELF 64-bit LSB shared object, ...
Run Code Online (Sandbox Code Playgroud)
它怎么可能vim
和gvim
如果双方决心相同的二进制做不同的事情?
背景:
我正在通过update-alternatives --config editor
. 在列表中,有vim.tiny
和vim.athena
,但即使我选择后者,Vim 也总是在终端中打开,而不是在单独的 GUI 中。
该程序可以通过查看第零个参数argv[0]
(在本例中为vim
或gvim
)来采取不同的路线。
Vim 在main.c
:
params.argv = argv;
...
/* Figure out the way to work from the command name argv[0].
"vimdiff" starts diff mode, "rvim" sets "restricted", etc. */
parse_command_name(¶ms);
...
/* Check for: [r][e][g][vi|vim|view][diff][ex[im]] (sort of) */
static void parse_command_name(mparm_T *parmp) {
char_u *initstr;
initstr = gettail((char_u *)parmp->argv[0]);
...
/* "gvim" starts the GUI. Also accept "Gvim" for MS-Windows. */
if (TOLOWER_ASC(initstr[0]) == 'g') {
main_start_gui();
Run Code Online (Sandbox Code Playgroud)
在这个片段中,程序检查基本名称的第一个字符
argv[0]
是否为“g”;如果是,它会启动 GUI。
这可以通过创建链接来观察:
ln -s /usr/bin/vim.athena vimX
ln -s /usr/bin/vim.athena gvimX
ln -s /usr/bin/vim.athena evimX
ln -s /usr/bin/vim.athena rvimX
ln -s /usr/bin/vim.athena exX
Run Code Online (Sandbox Code Playgroud)
哪里X
是什么,然后./vimX
在终端中运行 Vim,./gvimX
在 GUI 中,./evimX
在简单模式下运行 Vim,等等。