Linux下KDE桌面创建自定义右键菜单

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/png PNG图像
    • 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开发者文档-自定义服务菜单:传送门
相关推荐
Peter·Pan爱编程8 分钟前
Docker在Linux中安装与使用教程
linux·docker·eureka
kunge20131 小时前
Ubuntu22.04 安装virtualbox7.1
linux·virtualbox
清溪5491 小时前
DVWA中级
linux
Sadsvit2 小时前
源码编译安装LAMP架构并部署WordPress(CentOS 7)
linux·运维·服务器·架构·centos
xiaok2 小时前
为什么 lsof 显示多个 nginx 都在 “使用 443”?
linux
苦学编程的谢2 小时前
Linux
linux·运维·服务器
G_H_S_3_3 小时前
【网络运维】Linux 文本处理利器:sed 命令
linux·运维·网络·操作文本
Linux运维技术栈3 小时前
多系统 Node.js 环境自动化部署脚本:从 Ubuntu 到 CentOS,再到版本自由定制
linux·ubuntu·centos·node.js·自动化
拾心213 小时前
【运维进阶】Linux 正则表达式
linux·运维·正则表达式
Gss7774 小时前
源代码编译安装lamp
linux·运维·服务器