GNOME Terminalをショートカットキー1つで表示したりしなかったりする


<br>
# GNOME Terminalを使い始めて思ったこと

**1つのキーでターミナルを表示させたり最小化させたりできないのがダルいな......**

macOSでiTerm2を使っていた私は思いました。そこで、Hotkeyを実現させるべく、ちょっと何かしました。
常に他のウィンドウに重なったり、~~複数のワークスペースにまたがって表示されたりはしません。ただ、すぐに呼び出せるだけです。~~
→ **[されました](#追記)**。 記事の下に追記しています。

他の方法があるかどうかとかは知りません。超ド素人なのでご容赦ください。
<br>
## 環境
Ubuntu 20.04
<br>
## xdotoolをインストール

コマンドラインからウィンドウが操作できるxdotoolをインストールします。


```sh
$ sudo apt install xdotool
```
細かい操作方法は[こちら](https://blog.capilano-fw.com/?p=3477)をご覧ください。

<br>
## シェルスクリプトを作成

好きなところに置いてください。私は、termwindow.shという名前でホームディレクトリに保存しました。
<br>

```sh
$ vim ~/termwindow.sh
```


``` sh:termwindow.sh
#!/bin/bash

TERMID=`xdotool search --onlyvisible gnome-terminal`
ACTIVEID=`xdotool getactivewindow`

if [ $TERMID = $ACTIVEID ]; then
        xdotool windowminimize $TERMID
  else
        xdotool windowactivate $TERMID
fi
```
<br>
`xdotool search --onlyvisible gnome-terminal`でGNOME TerminalのウィンドウIDを取得しています。見えない部分で動いているものもヒットしてしまうので、`--onlyvisible`としています。複数ウィンドウ開いていたら、該当するIDはその数だけあるのですが、~~そこらへんの処理は適当にしています。どうにかしてください。すみません......~~。    →**[どうにかなりました](#追記)。** こちらも追記をご覧ください。
<br>
`xdotool getactivewindow`でアクティブなウィンドウのIDを取得しています。

if文の中身は、GNOME Terminalのウィンドウがアクティブだったらしまう、アクティブじゃなかったらアクティブにする。ただそれだけです。

<br>

次に、権限を変更します。

```sh
$ sudo chmod u+x termwindow.sh
```
<br>

## 設定からキーボードショートカットにスクリプトを割り当てる
Ubuntuの設定からキーボードショートカット→独自のショートカットと進み、追加を押したら、コマンドの欄に`bash/home/ユーザー名/termwindow.sh`みたいな感じにコマンドとスクリプトの場所を入力して実行させるようにします。フルパスじゃないと動きません。好きな名前とキーを設定して完了です。

ターミナルを表示する度に「`xdotool search`は`--name`か`--class`とかと使うのがデフォルトです」みたいなことを言われる場合は、それを表示させないために`bash /home/ユーザー名/termwindow.sh 2>/dev/null`でエラーを捨ててしまって結構です。
<br>
![termwindow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244579/1135b507-04e3-ef03-69ac-34ef1b62c227.png)

<br>


**設定したキーを押すと、ターミナルが飛んできてくれます。嬉しいね！**
![20210306_comp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244579/9639f992-b57d-33e8-f06a-8ac7782051b8.gif)
（ガビガビGIFで失礼します）

<br>

## 追記
ショートカットキーひとつでウィンドウを切り替えたり、ワークスペースを自由自在に行き来できるGNOME Terminal用シェルスクリプトがなんとなくできました。xdotool楽しいですね。記事の編集が大変面倒なので、コードだけ置きます......。すみません。
[こちら](http://manpages.ubuntu.com/manpages/trusty/man1/xdotool.1.html)にコマンドの詳細が載っています。

```sh:termwindow.sh
#!/bin/bash

TERMID=`xdotool search --onlyvisible gnome-terminal | tail -n1`               # ターミナルのウィンドウのIDを取得
LASTTERMID=`xdotool search --onlyvisible gnome-terminal | head -n1` # 他のウィンドウのうち最後に控えているやつのIDを取得
ACTIVEID=`xdotool getactivewindow`                                            # アクティブなウィンドウのIDを取得
CURRENTSPACE=`xdotool get_desktop` # get current workspace                    # 現在使用中のワークスペース（デスクトップ）番号を取得
TERMSPACE=`xdotool get_desktop_for_window $TERMID`                            # ターミナルのウィンドウがいるワークスペース番号を取得


if [ $TERMSPACE != $CURRENTSPACE ]; then                                      # ターミナルがいないワークスペースで呼んだら
    xdotool set_desktop_for_window $TERMID $CURRENTSPACE                      # ウィンドウを使用中ワークスペースへ移動
    xdotool set_desktop_for_window $LASTTERMID $CURRENTSPACE
    xdotool set_desktop $CURRENTSPACE                                         # 自分も目的のワークスペースに戻る
    xdotool windowactivate $TERMID
else
    if [ $TERMID = $ACTIVEID ]; then                                          # 以下、ターミナルがいるワークスペースで呼んだ時の処理
        xdotool windowminimize $TERMID
        if [ $LASTTERMID != $TERMID ]; then
            xdotool windowactivate $LASTTERMID ; xdotool windowminimize $LASTTERMID # ここで $TERMID と $LASTTERMID が入れ替わる
        else
            :
        fi
    else
        xdotool windowactivate $TERMID
    fi
fi
```

<br>

## 参考
参考にさせていただきました。ありがとうございます！！

* [xdotool コマンド全２６実例](https://blog.capilano-fw.com/?p=3477 "xdotool コマンド全２６実例")
* [Bashの便利な構文だがよく忘れてしまうものの備忘録 - Qiita](https://qiita.com/Ping/items/57fd75465dfada76e633 "Bashの便利な構文だがよく忘れてしまうものの備忘録 - Qiita")
* [シェルスクリプト(bash)のif文とtestコマンド([])自分メモ - Qiita](https://qiita.com/toshihirock/items/461da0f60f975f6acb10 "シェルスクリプト(bash)のif文とtestコマンド([])自分メモ - Qiita")
* [Linux / Unix | 標準エラー出力を捨てる - Qiita](https://qiita.com/Yinaura/items/0889fffa89ca65565d73 "Linux / Unix | 標準エラー出力を捨てる - Qiita")