首页 > 解决方案 > 一旦有来自管道的输入,dmenu 如何显示输入?

问题描述

TL;博士

这是默认行为。

find ~/ -name *.git 2>/dev/null | dmenu
# Searches everything in home directory and shows output

耗时约1-2秒

我想要的是:

find ~/ -name *.git 2>/dev/null | less
# Show as soon as it finds result. How to get similar output in dmenu?

随着我电脑中的文件增加,这将需要更长的时间。

详细说明:

我正在dmenu从一个find大约需要 1-2 秒的命令中输入输入。dmenu一旦管道中有一些输入,是否可以显示输入。因为这是管道的基本工作。似乎dmenu要等到管道中有所有条目,以便用户可以从中进行搜索,这看起来也是合法的,但这仍然可以避免吗?我想dmenu在缓冲区中有输入时立即运行。

标签: linuxbashshelldmenu

解决方案


我找到了一些解决方法来减少对find这里的时间。代替find,locate可以使用。所以命令就像

locate -r '/home'"$USER"'.*\.git$'

-r接受输入一个正则表达式。此处的参数-r过滤/home/$USER. 这比使用find.

捕捉使用locate

locate使用本地数据库进行搜索。因此,只有在构建/更新本地数据库时,它才会按预期工作。

要更新数据库,请使用sudo updatedb. 每当您添加/移动/删除文件(或本例中的目录)时,请记住更新数据库以locate获得正确的结果。

小费

为避免每次updatedb(和其他常用命令)都输入密码,请通过执行并将路径添加到命令二进制位置的条目来将它们添加到sudoerssudo visudo

更新

我最近意识到为什么locate在我可以简单地维护自己的数据库并将所有条目归类到dmenu. 有了这个,我能够实现我所需要的。

# Make a temp directory
 mkdir -p $HOME/.tmp
# Search for all git directories and store them in ~/.tmp/gitfies. 
[ -e $HOME/.tmp/gitfiles ] || find $HOME/ -regex .*/\.git$ -type d 2>/dev/null > $HOME/.tmp/gitfiles
# cat this file into dmenu
cat $HOME/.tmp/gitfiles | dmenu

这为带有dmenu. 这比在你需要更新本地数据库等时使用locateas更好。locate由于我们在运行时使用 过滤 git 文件locate,因此它比这种情况慢一点。

我可以简单地创建一个别名来更新这个数据库,类似于sudo updatedb,locate通过

alias gitdbupdate="find $HOME/ -regex .*/\.git$ -type d 2>/dev/null > $HOME/.tmp/gitfiles"

请注意,我没有使用/tmp/它,因为它不会在电源循环中持续存在。因此,我创建了自己的$HOME/.tmp/目录。


推荐阅读