私の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
最終目標はバイナリファイルです。
$ file --brief /usr/bin/vim.athena
ELF 64-bit LSB shared object, ...
どちらも同じバイナリとして解釈された場合、どのようにvim
異なる操作を実行できますか?gvim
背景:
デフォルトエディタを変更していますupdate-alternatives --config editor
。リストにはvim.tiny
、がありますvim.athena
が、後者を選択しても、Vimは常に別のGUIではなく端末で開きます。
答え1
プログラムは0番目の引数(または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();
このコードスニペットでは、プログラムはデフォルト名の最初の文字が
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
どこにX
いても、./vimX
端末、GUIで./gvimX
Vimを実行し、./evimX
シンプルモードでVimを実行するなどのタスクを実行します。