我的开发环境(二):dmenu

Posted by mainliufeng on August 11, 2019

dmenu

dmenu

最重要的事情先说,dmenu是什么,参考官网的描述,“dmenu is a dynamic menu for X, originally designed for dwm. It manages large numbers of user-defined menu items efficiently.”

dmenu是X(就是linux上的Xorg,无论你是用Gnome还是Kde,还是Dwm,你基本都是在使用Xorg,如果不是就是Wayland)上的一个动态菜单程序,最初是为dwm设计的,他能高效的管理大量的用户定义的菜单项。

现在感兴趣的同学可以直接到官网看了,还没发现dmenu有什么特别的同学可以往下看。

我原来的开发环境

我之前是和大多数同学一样,也是用Mac,我有一个13年的Macbook Pro 13,不得不承认苹果的硬件质量,我的Mac在5年之后还是运行的很流畅;我这个比较注重效率,用Mac时也会抽空建设开发环境,和很多人一样,我使用MacOS(这个是必须的)、ITerm2、Alfred、Zsh、neovim、Tmux。

为什么要离开Mac

Mac和Linux不一样

大多数程序员选择Mac而不是Windows的原因是

  • Mac本身是一个unix内核,它也自带Shell,方便开发
  • Mac的应用大多数质量还比较高,满足日常使用

但是Mac和linux终究是不一样,有一些程序,比如说GPU版的tensorflow,是天生歧视Mac的,当然tensorflow是可以自己编译的,但是搞定Mac连接一个显卡,安装cuda、cudnn,编译tensorflow这一套弄下来相当痛苦;而且如果你不幸升级了MacOS,可能又要重新搞一遍,可能你就搞不了了,要降级MacOS。

重回Linux

在学校时,我就接触了Linux,使用过很多发行版,当然我是经常遇到问题;原因一个是Linux确实没有Mac和Windows易用,另一个我觉得是主要原因,就是自己的能力不足,浮于表面,没有深入;直到后来我装了Gentoo,Gentoo让我更了解Linux是如何工作的,用了一段时间也比较稳定,可是有个问题是这家伙我编译一个Gnome时间太长了,看着我的笔记本(当时是个联想的)咆哮好几个小时,我又放弃了;

之后就是用了5年的Mac,1年前,我又选择回到了Linux,并且不想走了,非常顺手。

再说dmenu

dmenu可以干什么

Alfred被评价为Mac上的神器,Linux如果想使用相同的软件,那就是dmenu;但是dmenu默认是没有Alfred那么多功能的,甚至可以说dmenu没什么功能,dmenu使用如下:

dmenu

dmenu接受标准输入(可以是echo,也可以是任何其他脚本的输出),用换行分隔,打开一个图形菜单,将前n项显示出来;用户可以输入并搜索,用户输入回车后,dmenu返回用户选择的菜单项;或者用户按Esc,dmenu什么也不返回;或者用户输入一个和任何菜单项都不匹配的字符串,dmenu返回这个字符串;

dwm默认用dmenu执行命令,只要是在PATH中的可执行程序,都作为一个菜单项;

dmenu可以实现应用启动器,只要运行ls /usr/share/applications/ | dmenu | xargs -I {} gtk-launch {}

dmenu可以实现文件搜索,只要ls ~/Documents | dmenu | xargs -I {} xdg-open ~/Documents/{}

dmenu功能如此简单,但是加上脚本,dmenu可以做任何事情;大家可以参考dmenu scripts,这里边有些其他人写的脚本,用dmenu做管理剪切板、查找密码、执行历史、网页搜索等事情。

dmenu如何安装

dmenu官方的安装方式是通过源代码编译,最新的dmenu是4.9版本,可以从官网https://tools.suckless.org/dmenu/下载下来,并到dmenu的目录执行sudo make clean install

dmenu-build

rofi

dmenu核心功能就是菜单搜索和选择,默认dmenu是没有任何功能的,dmenu需要配合脚本使用;如果需要一个,已经实现好的程序启动器,可以使用rofi,rofi默认就是一个窗口切换器、程序启动器,它也可以替代dmenu在脚本中使用;

我使用rofi来打开程序:

rofi

rofi支持多模式在一起搜索,上图的window和run就是两个不同的模式,window、run、ssh都是rofi内置的,也支持自己写脚本作为一个模式,比如下面我们就是实现一个打开论文的模式;

首先写一个脚本,脚本的if里边,是告诉rofi有那些菜单项;else里边是菜单项被选择后如何处理;我这个脚本放在了~/dotfiles/rofi/scripts/paper.sh

rofi-paper

然后在rofi的脚本中把上面的脚本作为一个模式来使用;

rofi-paper-xlnet

这样我们就可以愉快的用rofi来打开论文了。

结束

dmenu就说到这,大家觉得好用不好用呢。