是否拥有带有 fluxbox 的 urxvt“粘性外壳”?

是否拥有带有 fluxbox 的 urxvt“粘性外壳”?

我正在尝试将一个 shell 绑定到我的 gentoo fluxbox 上的一个键。这个想法是让一个 shell 每次我按下 时都会显示或隐藏F11,但保持相同的 shell,而不是每次都创建一个新的 shell。

现在,我已经设法做到了。

我已插入我的.fluxbox/keys

F11 :ExecCommand /home/me/script/toogle-sticky-shell

被调用的脚本很简单:

##!/bin/sh
pid=$(ps -ef | grep surxv | head -n -1 | head -c 14 | tail -c 5)
if [ $pid ]
    kill $pid
else
    urxvt -name surxvt -e screen -RD StickyShell &
fi

并适应了我的.fluxbox/apps

[app] (name=surxvt)
  [Hidden]  {yes}
  [Layer]   {2}
  [Position]    (WINCENTER) {0 0}
  [Deco]    {BORDER}
  [Tab]     {no}
  [FocusNewWindow] {yes}
  [Sticky]  {yes}
[end]

因此,基本上,为了让我的 shell 保持活动状态,我正在使用screen。但我觉得这不是一个“干净”的解决方案。

所以我的问题是:有没有更清洁的方法来实现这一点?

例如,是否可以通过按下某个键来有选择地隐藏/显示 fluxbox 窗口?

答案1

  1. 安装 wmctrl

    x11-misc/wmctrl
      Homepage:     http://tomas.styblo.name/wmctrl/
      Description:  command line tool to interact with an EWMH/NetWM compatible
                    X Window Manager
    
  2. 启动一个“命名”终端

    urxvt -name moo

  3. 使用以下方式编写切换最小化脚本

    wmctrl -x -r moo.URxvt -b toggle,hidden

  4. 并从密钥文件中调用。

    F11 :ExecCommand /home/me/script/toogle-hidden moo

如果您需要更多提示,我很乐意提供帮助。


顺便说一句,我不认为你之前的方法不好。除了你查找 pid 的方式和 screen 的一些注意事项(非关键)外,它没有任何问题。


更新:

屏幕缩回并不是一个真正的问题,因为您可以滚动(在复制模式下,按 ^A + [),并且可以通过设置 DISPLAY 到达 X。有些人会让您相信这tmux是仅次于启蒙的最佳选择,但我倾向于像对待 zsh 狂热者一样将它们一笔勾销……

另一件事是不合理的,因为您在特定的字符串偏移量(head -c)处查找 pid,并且因为 grep 关键字必然会在某个时候给您一个错误的 pid(几行)。例如:

$ ps -ef | grep moo
jaroslav 20089     1  0 Jul23 ?       00:00:00 SCREEN -dR moo
jaroslav 26545 26420  0 08:21 pts/10  00:00:01 rxvt-unicode -name moo
jaroslav 27702 26981  0 08:52 pts/12  00:00:00 /usr/bin/perl /usr/bin/cowsay moo
jaroslav 27704 26771  0 08:52 pts/7   00:00:00 grep --colour=auto moo

这将关闭屏幕,而不是终端仿真器。预先假设 ps 产生特定数量的行或某些列具有给定的宽度(我认为您假设 3 行带标题,前两列有 14 个字符),这是“不安全的”。

我会选择这样的方法:

ps `pidof rxvt-unicode` | grep -m1 -e '-nam[e] moo' | awk '{ print $1 }'

或者

ps ax  | awk '$0 ~ /rxvt-unicode.*-nam[e] moo/ {print $1; exit}'

有了这两个,至少我可以相当肯定 pid 属于一个 rxvt 终端,它是以 -name moo 作为其两个参数启动的。并且绝对肯定输出最多只有一个 pid。-name[e] 是一个避免ps | grep在输出中匹配命令的老把戏。

这一切都是吹毛求疵...经验法则就是这样。

  1. 不要假设程序的输出是 x 个字符宽或 y 行长。
  2. 长正则表达式(更严格)几乎总是比短正则表达式更好。

相关内容