是否可以使用 Fluxbox 设置一个快捷键,说winkey+r打开一个xterm
具有以下属性的终端(比如说或其他):
- 如果已经存在一个工作目录为 = ~ 的终端,并且当前没有运行命令(即在提示符下),则显示该终端。
- 或者如果不创建一个新终端
答案1
我是这样做的:
- 让您的 shell 在出现提示时将标题设置为“bash”,在运行命令时将命令名称设置为“bash”,或者任何可以区分它们的内容
- 创建一个调用列出打开的窗口的脚本
wmctrl
,然后:- 如果
wmctrl
找到一个标题为“bash”的窗口,则将其提升 - 否则开始一个
xterm
- 如果
- 用于
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
无法查看应用程序内部,它只知道窗口。