如何使用快捷键调出最后一个终端窗口?


11

我经常使用终端来执行快速命令,然后将其留在后台,以便最终在工作时打开20多个终端会话。这是因为仅使用快捷键并键入命令是非常快速的。

有没有一种方法可以设置快捷键,以便我调出最后一个终端窗口而不是创建一个新的窗口?


1
此版本的编辑版本是否可以解决?对于单个终端窗口执行此操作并使其完全消失将是非常艰辛的。askubuntu.com/a/595244/72216告诉我,我可以将答案转换为easliy。终端窗口的(窗口)名称是什么?
Jacob Vlijm 2015年

2
试试这个
AB

我使用的窗口名称就是“ Terminal”。但是,如果我在终端中使用选项卡,您那里的脚本方法是否仍然可以使用?(即ctrl + shift + T)我也将它们重命名,以帮助确定我被扔进哪台计算机。
Klik

只要有字符串“ terminal”就可以了。是这样吗?
Jacob Vlijm

@JacobVlijm事实并非如此。我经常根据正在执行的操作将其名称更改为“ ssh”或“ Local”。我可以修改标题更改脚本以包含唯一前缀。即“%。%”或类似的名称。
Klik

Answers:


13

我将一个终端固定在位置10上的Unity启动器侧栏上。这样,我可以按Super+ 0以“单击”启动器图标,该图标将最新的终端窗口置于顶部。

在此处输入图片说明

如果您可以将其安装在启动器中(前10个位置之一,否则不会获得快捷方式!),则可以使用。


哦,这是个好主意!我喜欢这个答案,但是我将等待其他人提出来。我当时正在考虑使用xdotool创建一个脚本来查找终端并将其带到最前面。
Klik

我认为该解决方案是最容易实现的,并且正好满足了我要寻找的目的。因此,我将其标记为答案。
Klik

10

我使用guake,对此感到非常满意。按F12,出现一个终端窗口,再次按F12,它消失,但继续在后台运行。另外:看起来真的很酷。


在这里再次投票给瓜科。值得一提的是,如果您使用多个(不同大小)的显示器,则某些版本需要修复才能使其正常工作-仍然值得。
Holloway 2015年

变得非常依赖guake,以至于当我切换到xmonad时,我会在其中进行仿真。一定有!
托尼·马丁

6

您可以将脚本放在下面的组合键下。如果按组合键,终端窗口将消失(完全)。再按一次,它们将再次完全按照您的状态弹出。

您唯一需要做的就是在终端的窗口名称中添加标识字符串(大多数情况下,终端窗口具有相同的名称)

使用它

同时安装xdotoolwmctrl

sudo apt-get install xdotool
sudo apt-get install wmctrl
  1. 将脚本复制到一个空文件中,另存为 hide_terminal.py
  2. 在标题部分,设置终端窗口名称的标识字符串
  3. 在组合键下运行它:

    python3 /path/to/hide_terminal.py
    

剧本

#!/usr/bin/env python3
import subprocess
import os

home = os.environ["HOME"]
hidden_windowid = home+"/.window_id.txt"

get = lambda cmd: subprocess.check_output(cmd).decode("utf-8")
# --- set the identifying string in the terminal window's name below (you mentioned "Terminal"
window_idstring = "Special_window"
# ---
def execute(cmd):
    subprocess.check_call(cmd)

w_id = [l.split()[0] for l in get(["wmctrl", "-l"]).splitlines() if window_idstring in l]
if len(w_id) !=0:
    for w in w_id:
        execute(["xdotool", "windowunmap", w])
        with open(hidden_windowid, "a") as out:
            out.write(w+"\n")
else:
    try:
        with open(hidden_windowid) as read:
            for w in [w.strip() for w in read.readlines()]:
                try:
                    execute(["xdotool", "windowmap", w])
                except subprocess.CalledProcessError:
                    pass
        with open(hidden_windowid, "wt") as clear:
            clear.write("")
    except FileNotFoundError:
        pass

1
您拥有适用于所有内容的脚本,不是吗?; D
字节指挥官

1
@ByteCommander我无法抗拒,它比我强:)
Jacob Vlijm 2015年

请注意,如果您不使用,还需要在最后一行更改终端的名称gnome-terminal。另外,如果您有多个打开的终端,则会中断。在我的系统上,第一个运行隐藏活动的,第二个运行隐藏第二个,第三个运行仅返回第二个终端。第一永远失去。
terdon 2015年

@terdon Arrgh,你是对的!将修复它并使其隐藏/显示所有终端窗口。
Jacob Vlijm 2015年

更重要的是,为什么不仅仅用bash做到这一点?如果您对python所做的所有工作都是在启动系统调用,为什么还要将python引入其中?
terdon 2015年

5

这与用bash编写的Jacob Vlijm的答案相同:

#!/usr/bin/env bash

## window_name will be the first argument passed or, if no
## argument was given, "Terminal"
window_name=${1:-"Terminal"}

## Get the list of open terminals
terms=( $(wmctrl -l | grep "$window_name" | cut -d ' ' -f 1) )

## If all terminals are hidden
if [ -z "${terms[0]}" ]
then
    ## Read the IDs of hidden windows from .hidden_window_id
    while read termid
    do
        xdotool windowmap "$termid"
    done < ~/.hidden_window_id
## If there are visible terminals
else
    ## Clear the .hidden_window_id file
    > ~/.hidden_window_id
    ## For each open terminal
    for i in "${terms[@]}"
    do
        ## Save the current ID into the file
        printf "%s\n" "$i" >> ~/.hidden_window_id
        ## Hide the window
        xdotool windowunmap "$i"
    done
fi

如果将其另存为~/bin/show_hide.sh,则可以通过提供要隐藏的任何窗口的标识字符串来运行它。如果没有给出字符串,它将在Terminal

show_hide.sh Terminal

1

我使用的gnome-shell是'Drop Down Terminal'扩展名,默认快捷方式是TAB但很容易更改。


1

这个简单的wmctrl命令将引发一个带有标题中给定字符串的窗口,或者如果不存在包含该字符串的窗口,请运行命令。

wmctrl -a <str> || <command to launch application>

例如我可以使用的gedit

wmctrl -a gedit || gedit

要为您的应用程序窗口找到合适的字符串,请打开您的应用程序并运行

wmctrl -l

0

以下方法对我有用:

#!/usr/bin/env bash

# Written by Eric Zhiqiang Ma (http://www.ericzma.com)
# Last update: Jul. 9, 2014

# Read the tutorials at
# http://www.systutorials.com/5475/turning-gnome-terminal-to-a-pop-up-terminal/

# Required tools: xdotool

terminal="gnome-terminal"
stat_file="/dev/shm/actiavte-termianl.term.$USER"
termtype="Terminal"
wait_sec=1
max_wait_cnt=4

# parse options first
if [ "$1" != "" ]; then
    terminal="$1"
fi


term_exists () {
    allterms=`xdotool search --class "$termtype"`
    for e in $allterms; do [[ "$e" == "$1" ]] && return 0; done
    return 1
}

create_terminal () {
    echo "Create new terminal"
    $terminal --maximize &

    exists=1
    wait_cnt=0
    until [ "$exists" == "0" ]; do
        # sleep a while
        sleep $wait_sec

        # Note that the focus window may be from a terminal that
        # already exists; the makes create_terminal choose the existing terminal
        # Making the wait_sec large enough so that the terminal can be created and
        # displayed can make the false choosing more unlikely.

        term=$(xdotool getwindowfocus)
        term_exists "$term"
        exists=$?
        # avoid infinite wait
        let wait_cnt=wait_cnt+1
        if [ $wait_cnt -gt $max_wait_cnt ]; then
            echo "Wait for too long. Give up."
            term=""
            exists=0
        fi
    done

    echo "Created terminal window $term"
    # save the state
    echo "$term" >$stat_file
}

# read the state
if [ -f $stat_file ]; then
    term=$(cat $stat_file)
fi

# check whether it exists
term_exists "$term"
exists=$?
if [[ "$exists" != "0" ]]; then
    create_terminal
    exit 0
fi

# check whether it is already activated
curwin=$(xdotool getwindowfocus)

if [ "$term" == "$curwin" ]; then
    # deactivate (minimize) the terminal if it is currently activated
    xdotool windowminimize $curwin
else
    # activate the terminal if it is not currently activated
    xdotool windowactivate $term
fi

exit 0

然后只需为其授予执行权限,并将脚本绑定到设置中的某个键即可。

资源:

http://www.systutorials.com/5475/turning-gnome-terminal-to-a-pop-up-terminal/


1
从链接中添加一些重要部分,以防链接中断或发生更改。
乔治·乌德森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.