用于打开 xterm 或切换到现有 xterm 的 Fluxbox 快捷方式

用于打开 xterm 或切换到现有 xterm 的 Fluxbox 快捷方式

是否可以使用 Fluxbox 设置一个快捷键,说winkey+r打开一个xterm具有以下属性的终端(比如说或其他):

  1. 如果已经存在一个工作目录为 = ~ 的终端,并且当前没有运行命令(即在提示符下),则显示该终端。
  2. 或者如果不创建一个新终端

答案1

我是这样做的:

  1. 让您的 shell 在出现提示时将标题设置为“bash”,在运行命令时将命令名称设置为“bash”,或者任何可以区分它们的内容
  2. 创建一个调用列出打开的窗口的脚本wmctrl,然后:
    • 如果wmctrl找到一个标题为“bash”的窗口,则将其提升
    • 否则开始一个xterm
  3. 用于xbindkeys在按下快捷键时调用该脚本

让您的 shell 在运行命令时设置窗口标题

这是我在 bash 中执行此操作的简化版本。我没有仔细检查代码,但它可以在我的机器上运行。

# set the title when we run a command
setcommandhook()
{
    if $has_debug_trap
    then
        trap 'command=$BASH_COMMAND; eval settitle "\"${title}\""; trap - DEBUG' DEBUG
    fi
}

# set the xterm title
settitle()
{
    printf "\033]0;$*\007"
}

promptstring='$(hostname):$(pwd)$ '
title='$(hostname) "${command:-$0}"'

# prompt and window title
if test -n "${title}"
then
    PROMPT_COMMAND='command=; eval settitle "\"${title}\""'
    if $has_debug_trap
    then
        PROMPT_COMMAND="$PROMPT_COMMAND; setcommandhook"
    fi
fi
if test -n "${promptstring}"
then
    PS1='$(eval echo -n "\"${promptstring}\"")'
fi

做起来zsh比较容易,因为它有preexec钩子。

你可以看到我的外壳配置有关更多详细信息,例如以更好的方式getcommand处理命令的函数。fg


启动具有 bash 提示符的 xterm,否则启动一个新的

编写一个用于列出窗口的脚本wmctrl -l,查找bash标题中带有 的窗口。如果找到,则运行wmctrl -i -a <id returned by wmctrl -l>以引发它,否则只需调用xterm.

这是一个执行此操作的脚本:

#!/bin/bash
#
# bashprompt
#
# if there is an xterm open at a bash prompt, raise/focus that window
# if there isn't start a new xterm
#
# requires that your xterm window title has "bash" at the end
# when there is no command running and doesn't have "bash" at the end
# when a command is running
#
# see <http://unix.stackexchange.com/questions/6842> for more details
#
# Mikel Ward <[email protected]>

# change this to whatever is unique about your window title
# (i.e. a string that appears in the title when the shell is at a prompt
#  but does not appear when running a command)
prompttitle="bash$"
terminalprog="xterm"

if ! type wmctrl >/dev/null 2>&1; then
    echo "wmctrl can't be found, please install it" 1>&2
    exit 1
fi

if ! output="$(wmctrl -l)"; then
    echo "Error running wmctrl -l" 1>&2
    exit 1
fi
while IFS=$'\n' read -r line; do
    if [[ $line =~ $prompttitle ]]; then
        id=${line%% *}
        break
    fi
done <<EOF
$output
EOF

if test -n "$id"; then
    wmctrl -i -a "$id"
else
    "$terminalprog"&
fi

或者从我的脚本存储库下载它


按 Win+R 时运行脚本

假设您的脚本被称为/usr/local/bin/bashprompt,创建一个~/.xbindkeysrc包含以下内容的文件:

"/usr/local/bin/bashprompt"
    Mod4 + r

然后运行xbindkeys。将其添加到您的.Xclients文件或类似文件中以使其自动启动。

答案2

fluxbox可以根据某些模式自行匹配窗口。至少fluxbox-1.1.1这是可能的:

  Mod4 r :If {Some Matches (title=.*bash) (class=XTerm)} {NextWindow (xterm)} {Exec xterm}

(翻译为:on press windows-key + r: check, if there is a xterm with its title ending in 'bash'. if there is, go to that window; if not, open a new one。使用前沿版本(git),您甚至可以转到不同工作区上的窗口。

您唯一需要做的就是根据您的操作修改标题(或带有 bash 的窗口的任何其他属性)。如果您查看提示,则必须设置一个属性,如果启动命令,则必须删除该属性。fluxbox无法查看应用程序内部,它只知道窗口。

相关内容