如何为处理.desktop文件的bash脚本添加类似Rofi的动态补全功能
实现动态输入匹配、自动补全效果的三种方案
你原有的sed逻辑可以先合并优化,减少不必要的管道进程:ls -1 /usr/share/applications ~/.local/share/applications | sed -e 's/\.desktop$//' -e 's/^org.gnome.//'
注:默认desktop文件存放在系统级的
/usr/share/applications和用户级的~/.local/share/applications目录,如果你是cd到对应目录执行命令可以省略路径。
方案1:使用fzf实现命令行实时模糊匹配(最推荐)
fzf是轻量命令行模糊查找工具,原生支持实时输入过滤、动态输出、自动补全,完全适配你的需求,不需要自己编写read匹配逻辑:
# 基础实时匹配,回车返回选中的应用名 ls -1 /usr/share/applications ~/.local/share/applications | sed -e 's/\.desktop$//' -e 's/^org.gnome.//' | fzf --height=10 --layout=reverse --prompt="启动应用: " # 如果需要和原有grep逻辑一致的精确匹配,加--exact参数 ls -1 /usr/share/applications ~/.local/share/applications | sed -e 's/\.desktop$//' -e 's/^org.gnome.//' | fzf --exact --height=10 --layout=reverse --prompt="启动应用: " # 直接启动选中应用,末尾加gtk-launch调用 ls -1 /usr/share/applications ~/.local/share/applications | sed -e 's/\.desktop$//' -e 's/^org.gnome.//' | fzf --height=10 --layout=reverse --prompt="启动应用: " | xargs gtk-launch
方案2:纯Bash实现基础动态补全(无额外依赖)
如果不想安装第三方工具,可以用Bash自带的readline补全机制实现基础的实时补全效果:
# 预先生成所有应用名列表 app_list=$(ls -1 /usr/share/applications ~/.local/share/applications | sed -e 's/\.desktop$//' -e 's/^org.gnome.//') # 配置应用名补全规则 _comp_apps() { local cur=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W "$app_list" -- "$cur") ) } complete -F _comp_apps launch_app # 定义应用启动函数 launch_app() { gtk-launch "$1" }
配置完成后,在终端输入launch_app 后按Tab键,就会自动列出匹配你输入内容的应用名,多次按Tab可以在候选结果中切换选择。
方案3:使用Rofi原生能力实现GUI选择
如果你本地已经安装了Rofi,可以直接把处理后的应用列表传给Rofi的dmenu模式,体验和Rofi默认应用启动器完全一致:
ls -1 /usr/share/applications ~/.local/share/applications | sed -e 's/\.desktop$//' -e 's/^org.gnome.//' | rofi -dmenu -p "启动应用" | xargs gtk-launch
内容的提问来源于stack exchange,提问作者Taylor Johnson
相关产品推荐
相关产品推荐

