KDE Plasma桌面是Linux平台上一款现代化的桌面环境,并被集成到了多个发行版中。在使用Linux桌面系统的过程中,右键菜单是提高我们工作使用效率的重要工具,在文件管理器中,通过右键菜单可以快速地使用一些应用程序打开或者处理一些文件。
1,右键菜单配置文件位置
不同于Windows下使用注册表添加自定义右键菜单的方式,在KDE桌面的Dolphin文件管理器中,我们需要在指定位置编写desktop文件实现桌面右键菜单的自定义。
以Debian 12为例,在其最新的5.103.0版本的KDE框架中,右键菜单配置文件位置如下:
- 用户级别:
~/.local/share/kio/servicemenus - 全局级别:
/usr/share/kio/servicemenus
对于用户级别的配置,只会在其对应的用户生效,全局级别则对所有用户生效。
需要注意的是,在旧版本的KDE框架(
5.85版本之前),右键菜单配置存放在~/.local/share/kservices5和/usr/share/kservices5中,并且需要额外添加ServiceTypes=KonqPopupMenu/Plugin字段。
2,编写右键菜单文件
这里我们来创建一个能够使用右键调用VSCode打开目录或者文件的全局右键菜单,进入/usr/share/kio/servicemenus目录,创建名为open-in-vscode.desktop文件并赋予可执行权限:
bash
cd /usr/share/kio/servicemenus
sudo touch open-in-vscode.desktop
sudo chmod +x open-in-vscode.desktop
然后使用任意文本编辑器编辑该文件,加入下列内容:
ini
[Desktop Entry]
Type=Service
MimeType=inode/directory;application/octet-stream;
Actions=openInVSCode
[Desktop Action openInVSCode]
Name=在VSCode打开
Icon=vscode
Exec=code %f
首先我们需要声明一个[Desktop Entry]块,这是右键菜单配置的基本信息,有下列字段:
Type表示配置文件类型,固定为Service即可,表示右键菜单MimeType表示该右键菜单的作用文件类型,也就是指定在什么类型的文件上点击鼠标右键时,才会显示该右键菜单选项 ,使用MIME类型表示,多个类型之间使用英文分号;隔开,只有一个类型时最好也以英文分号;结尾,常用类型例如:application/octet-stream表示任何文件inode/directory表示任何目录,支持选择目录后右键或在进入某个目录后右键空白处使用该右键菜单image/pngPNG图像image/*表示所有图片类型文件(KDE右键菜单类型支持通配符)
Actions指定动作名称,即点击该右键菜单后执行的命令,动作配置在下面
那么[Desktop Action openInVSCode]块就是声明具体的动作了,即点击右键菜单后的行为 。动作名称可以自定义,最好使用小驼峰命名法,这里的动作名称就是openInVSCode,可见与[Desktop Entry]里面的Actions指定的动作名称值是对应的。
有下列字段:
Name菜单显示名称Icon菜单图标,该字段可省略,对于系统图标库中有的图标可直接指定名称,否则需要指定图片(例如PNG、JPG、SVG等图片)绝对路径Exec点击该右键菜单后执行的命令,可见其中使用了%f变量表示选中的第一个文件(即仅匹配单个文件),变量列表可参考Free Desktop配置文件规范对应部分,这里讲解一下常见的:%f表示点击右键时,鼠标选中的单个文件或者文件夹,若选择了多个文件则仅使用第一个文件(夹)%F表示点击右键时,鼠标选中的所有文件或者文件夹,选择了多个也会被全部传递给命令,通常是以空格隔开%u表示点击右键时,鼠标选中的单个文件或者文件夹链接或者文件地址,若选择了多个文件则仅使用第一个文件(夹)%U表示点击右键时,鼠标选中的所有文件或者文件夹链接或者文件地址,若选择了多个文件则仅使用第一个文件(夹)
对于Exec中的变量,事实上%f和%u在日常使用区别并不大。
到此,一个自定义菜单就完成了!效果如下:

3,右键菜单分组
假设有一系列类似的功能,我们又不想将其全部平铺在右键菜单中,就可以进行分组。比如说我安装了多个Jetbrains系列的开发工具,且都需要添加它们右键打开目录的菜单项,那么就可以将其归为一组。
同样地,在/usr/share/kio/servicemenus目录下创建一个desktop文件例如run-in-jetbrains.desktop,编辑内容如下:
ini
[Desktop Entry]
Type=Service
MimeType=inode/directory;
Actions=openInIdea;openInWebStorm;openInGoLand;
X-KDE-Submenu=使用Jetbrains开发工具打开
[Desktop Action openInIdea]
Name=在IDEA打开
Icon=/opt/jetbrains/idea/bin/idea.svg
Exec=/opt/jetbrains/idea/bin/idea %f
[Desktop Action openInWebStorm]
Name=在WebStorm打开
Icon=/opt/jetbrains/webstorm/bin/webstorm.svg
Exec=/opt/jetbrains/webstorm/bin/webstorm %f
[Desktop Action openInGoLand]
Name=在GoLand打开
Icon=/opt/jetbrains/goland/bin/goland.svg
Exec=/opt/jetbrains/goland/bin/goland %f
可见这里:
- 我们定义了多个动作
[Desktop Action xxx]块,并将所有动作名称全部声明在了[Desktop Entry]的Actions字段,每个名称也是使用英文分号;隔开 - 此外,在
[Desktop Entry]块下添加了个X-KDE-Submenu字段,表示分组菜单项名称
最终效果如下:

本文参考文档:
- KDE Dolphin开发者文档-自定义服务菜单:传送门