我只是想设置 Emacs GUI 来切换(隐藏/显示)可见性,就像我们在 guake、tilda 或 yakuake 终端中看到的那样(在这些终端中称为下拉菜单)。例如,我正在 GUI 中使用 Emacs,并且后面有一个浏览器窗口,我想使用快捷方式(例如 F12)隐藏 Emacs GUI,然后看到我的浏览器(有焦点)与 或任何其他窗口交互,然后再次按 F12,我的 Emacs GUI 就会恢复(我运行的是 KDE 5.13)。另外,如果您知道如何在 XFCE 或 gnome 中执行此操作,请分享您的知识。
答案1
我也在 emacs.stackexchange 上问过这个问题关联。我将anser复制到这里供参考。它依赖X11工作,需要安装xdotool和wmctrl。
#!/bin/bash
######################################################################################################
# This script will toggle minimize/activate first window with specified class
# If window not found program will be launched
#
# window class can be found with next programs:
# wmctrl -x -l
# xprop
# No credit taken.......... Cannot read the original.....
# Found on http://blog.sokolov.me/2014/06/20/linuxx11-toggle-window-minimizemaximize/
# in Russian :) but works when adjusting the wrapping.
######################################################################################################
NEEDED_WINDOW_CLASS="emacs.Emacs"
LAUNCH_PROGRAM="emacs"
######################################################################################################
NEEDED_WINDOW_WINDOW_ID_HEX=`wmctrl -x -l | grep ${NEEDED_WINDOW_CLASS} | awk '{print $1}' | head -n 1`
NEEDED_WINDOW_WINDOW_ID_DEC=$((${NEEDED_WINDOW_WINDOW_ID_HEX}))
if [ -z "${NEEDED_WINDOW_WINDOW_ID_HEX}" ]; then
${LAUNCH_PROGRAM}
else
echo "Found window ID:${NEEDED_WINDOW_WINDOW_ID_DEC}(0x${NEEDED_WINDOW_WINDOW_ID_HEX})"
ACIVE_WINDOW_DEC=`xdotool getactivewindow`
if [ "${ACIVE_WINDOW_DEC}" == "${NEEDED_WINDOW_WINDOW_ID_DEC}" ]; then
xdotool windowminimize ${NEEDED_WINDOW_WINDOW_ID_DEC}
else
xdotool windowactivate ${NEEDED_WINDOW_WINDOW_ID_DEC}
fi
fi
答案2
虽然有点晚了,但想在这里发布一个答案,该答案不是特定于 KDE 或 gnome 的,而是依赖于两个与底层显示服务器/窗口管理器(即 X11 或 Wayland)交互的应用程序来完成工作。
在 Ubuntu 中测试,应该可以在任何可以安装的地方工作wmctrl
。xdotool
此示例使用konsole
终端应用程序,但您可以使用您知道其类名的任何应用程序。要找出类名,请打开应用程序并运行wmctrl -lx
.
#!/usr/bin/env bash
# if app is not open then launch it -- remove this if you don't want your
# shortcut to launch the application if it hasn't been launched yet
if [ -z "$(xdotool search --class konsole)" ]; then
konsole
fi
# get current focused window and visible konsole window
CLASS="konsole"
ACTIVE_WINDOW="$(xdotool getactivewindow)"
APP_WINDOW="$(xdotool search --onlyvisible --class $CLASS)"
# if focused, minimize and hide the konsole, otherwise bring konsole to current desktop and open
if [ "$ACTIVE_WINDOW" = "$APP_WINDOW" ]; then
xdotool getactivewindow windowminimize
else
wmctrl -xR "$CLASS"
fi
该脚本假设了一些事情,即:
- 返回
$(xdotool search --onlyvisible --class yourApp)
单个匹配项(您需要处理数组/多个匹配项) - 您想要立即切换到凸起(显示)的 GUI 应用程序
- 您的目标应用程序并非纯粹作为守护进程/服务运行(否则不会注册为 X11 或 Wayland 内的窗口)
- 您希望应用程序出现在您当前所在的任何桌面空间上
如果您不希望 2 和 4 可以xdotool
单独使用,我只是想更接近地模拟 Guake 终端的显示/隐藏行为,因此用于wmctrl
将 GUI 应用程序显示并显示到当前活动的桌面。
因为它是一个 bash 脚本,所以它是可移植的 - 即您只需要弄清楚如何在桌面应用程序(KDE、Gnome 等)中设置自定义快捷方式并使用所述快捷方式运行脚本。