可以像在终端中设置一样为桌面会话设置别名吗?事实上,我不确定桌面会话是否以相同的方式工作。是否有某个中央解释器可以解释来自所有 GUI 应用程序的命令(某种后端 shell)或者它如何工作?
我需要做的是为 KDE 会话设置别名 gvim="gvim --remote-tab-silent",以便在 Krusader 设置或任何其他 GUI 应用程序中调用 gvim 时,将调用带有 --remote-tab-silent 的 gvim。
如何做到这一点(不在脚本中包装)?
答案1
视情况而定。图形程序通常使用与非图形程序相同的方法;即以下方法之一:
有时程序会将参数列表直接传递给内核,使用类似下面的方法:
if (fork() == 0) execlp("vim", "--remote-tab-silent", "/home/LeNoob/somefile.txt", NULL);
各种
exec*()
函数告诉内核,“运行确切地这个东西,并将这个精确的命令行选项列表传递给它argv[]
。”其他时候,程序会要求 shell –
/bin/sh
– 解释命令行:system("vim $HOME/.bashrc");
它实际上与终端中的 shell 相同,但使用选项以非交互模式运行
-c
。此外,/bin/sh
无论您选择以交互方式使用哪种 shell(bash、zsh……),它始终是惯例。因此,上面的内容大致与以下内容相同:if (fork() == 0) execl("/bin/sh", "-c", "vim $HOME/.bashrc");
(当然,shell 本身会
exec*()
直接使用。)最后,使用 D-Bus 的桌面环境可以通过向所需的“总线名称”(例如
org.gnome.gedit
)发送消息来启动各种服务。也称为“总线激活”,当 dbus-daemon 看到某个程序向当前没有“拥有”的总线名称发送消息时,它会在其配置中搜索该程序的路径,然后再次使用 exec() 来启动它。这是常用的 D-Bus 功能,但主要用于“dconf”等后台服务。将来,GNOME 计划使用它来启动 Nautilus 或 Gedit 等常规应用程序。但是,目前,它使用的方法与所有其他 DE 相同,即读取相关文件
.desktop
[见下文] 并直接 exec() 执行程序,因此我仅出于完整性考虑才将其包括在内。
(当然,真正的程序不要在其中有"vim"
并"somefile.txt"
进行硬编码 – 它们使用类似getenv("EDITOR")
和所需的文件名 – 但你明白了。)
然而,这些都不重要,因为 shell 从不在非交互模式下解释别名,而它会解释 shell 函数,它永远不会读取你的函数~/.bashrc
来查看你定义了哪些函数。
所以接下来的问题是,如何将 gVim 配置为文本编辑器;您的程序是否在 $PATH 目录中搜索,或者是否从其配置文件中gvim
获取完整路径?/usr/bin/gvim
基于终端的程序使用$EDITOR
变量,因此您可以在 ~/.profile 或类似文件中EDITOR=gvim
使用它。EDITOR="gvim --remote-tab-silent"
桌面环境根据以下信息找到 gVim /usr/share/applications/gvim.desktop
– 具体来说,该行Exec=gvim -f %F
仅告诉它们启动gvim
,但没有说明它在哪里,因此将使用 $PATH。这意味着它可以通过两种方式覆盖:
您可以编写一个脚本并将
gvim
其包装起来并放在 $PATH 的某个早期位置 - 例如,调用该脚本~/bin/gvim
然后将其放在~/bin
$PATH 的开头;或者您可以将 .desktop 文件从 /usr 复制到
~/.local/share/applications/gvim.desktop
,然后更改行Exec=
以包含所需的选项:Exec=gvim --remote-tab-silent -f %F
(通常更改会立即生效,但如果没有,请尝试从终端运行
kbuildsycoca4
或。)kbuildsycoca4 --noincremental