web-dev-qa-db-ja.com

Unity用のテキストベースのウィンドウスイッチャーはありますか?

ビジュアルスイッチャーは、コンテキストの提供が非常に貧弱です。例えば。ブラウザウィンドウのサムネイルは小さすぎて見分けがつかず、ほとんどの場合、空白になっています(スクリーンショットを参照)。 Unity switcher with useless thumbnails

ウィンドウタイトルのリストを表示するスイッチャーはありますか?できれば、スマートファジーオートコンプリートを使用してください(例 https://github.com/ctrlpvim/ctrlp.vim または https://github.com/junegunn/fzf ):-)

3
Jean Jordaan

「自家製の製品」の楽しい部分は、あなたが好きなようにそれをかなり正確に作ることができるということです。考えられる欠点は、プロジェクトに取り掛かることができれば、プロジェクトに少し夢中になってしまうことです...

以下のスクリプトの場合はそうかもしれません:)。私はそれが「内部で」どのように機能するかについての詳細な説明を追加することを望んだでしょうが、これは「すぐに使える」ソリューションです。コメント行をいくつか追加しましたが、コードの簡単な内部説明を与えることは困難です。しかし、あなたが探しているものに近いようです。

それはなんですか

このスクリプトは、開いているすべての「通常の」アプリケーションウィンドウを一覧表示する(そして選択したウィンドウを1つ上げる)純粋にテキストベースのソリューションですが、いくつかのオプションがあります。

  1. ウィンドウ名でソートされたウィンドウのリスト:

    次のコマンドで実行します。

    python3 <script> -win
    

    enter image description here

    探しているウィンドウの最初の文字を入力し、Returnキーを押してウィンドウを前面に表示します。

  2. アプリケーションでソートされたウィンドウを一覧表示します。

    次のコマンドで実行します。

    python3 <script> -app
    

    enter image description here

  3. workspaceでソートされたウィンドウを一覧表示します。

    次のコマンドで実行します。

    python3 <script> -ws
    

    enter image description here

ご覧のとおり、表示される列はウィンドウ名アプリケーションワークスペースです。事前設定されたソート列は常に最初の列です。

ファジー?

リストから項目を選択するには、最初の文字を入力するだけです。入力した文字と一致する項目がさらにある場合、矢印キーは入力した文字と一致する項目のみを参照します。

enter image description here

さらに:

ワークスペース表示
現在のワークスペースは*でマークされています。 2*が表示されている場合は、ウィンドウがワークスペース2にあることを意味しますおよびワークスペース2は現在のワークスペースです。これは、ワークスペースの数に関係なく機能します。

ウィンドウサイズ
選択ウィンドウのは、ウィンドウの(最長の)名前と表示されるウィンドウの数に自動的に設定されます。例:

enter image description here

または:

enter image description here

使い方

設定はかなり簡単です:

  1. スクリプトには(間違いなく)wmctrlが必要です。

    Sudo apt-get install wmctrl
    
  2. 次に、以下のスクリプトを空のファイルにコピーし、list_windows.pyとして保存します

  3. 次に、次のコマンドでテスト実行します。

    python3 /path/to/list_windows.py -app
    python3 /path/to/list_windows.py -win
    python3 /path/to/list_windows.py -ws
    
  4. すべて正常に機能する場合は、1つ以上の優先コマンドを1つ以上のショートカットキーに追加します。[システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。 「+」をクリックして、コマンドを追加します

スクリプト

(まだ「磨かれていない」コード)

#!/usr/bin/env python3
import subprocess
import socket
import sys

arg = sys.argv[1]
# list (column) header titles and their (data) position in the produced window data list
cols = [["Workspace", -1], ["Application name", -2] , ["Window name", -3]]
# rearrange columns, depending on the chosen option
if arg == "-app":
    cols = [cols[1], cols[2], cols[0]]
Elif arg == "-ws":
    cols = [cols[0], cols[2], cols[1]]
Elif arg == "-win":
    cols = [cols[2], cols[1], cols[0]]
# extract headers, list positions, to be used in the zenity list
col1 = cols[0][0]; i1 = cols[0][1]
col2 = cols[1][0]; i2 = cols[1][1]
col3 = cols[2][0]; i3 = cols[2][1]
# just a helper function
get = lambda cmd: subprocess.check_output([
    "/bin/bash", "-c", cmd
    ]).decode("utf-8")
# analyse viewport data, to be able to calculate relative/absolute position of windows
# and current viewport
def get_spandata():
    xr = get("xrandr").split(); pos = xr.index("current")
    res = [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
    spandata = get("wmctrl -d").split()
    span = [int(n) for n in spandata[3].split("x")]
    cols = int(span[0]/res[0]); rows = int(span[1]/res[1])
    curr_vector = [int(n) for n in spandata[5].split(",")]
    curr_viewport = int((curr_vector[1]/res[1])*cols + (curr_vector[0]/res[0])+1)
    return {"resolution": res, "n_columns": cols, "vector": curr_vector, "current_viewport": curr_viewport}

posdata = get_spandata()
vector = posdata["vector"]; cols = posdata["n_columns"]
res = posdata["resolution"]; currvp = posdata["current_viewport"]
# function to distinguish "normal" windows from other types (like the desktop etc)
def check_window(w_id):
    w_type = get("xprop -id "+w_id)
    if " _NET_WM_WINDOW_TYPE_NORMAL" in w_type:
        return True
    else:
        return False
# split windowdata by machine name
mach_name = socket.gethostname()
wlist = [[l.strip() for l in w.split(mach_name)] for w in get("wmctrl -lpG").splitlines()]
# split first section of window data
for i, w in enumerate(wlist):
    wlist[i][0] = wlist[i][0].split()
# filter only "real" windows
real_wlist = [w for w in wlist if check_window(w[0][0]) == True]
# adding the viewport to the window's data
for w in real_wlist:
    w.append(get("ps -p "+w[0][2]+" -o comm=").strip())
    loc_rel = [int(n) for n in w[0][3:5]]
    loc_abs = [loc_rel[0]+vector[0], loc_rel[1]+vector[1]]
    abs_viewport = int((loc_abs[1]/res[1])*cols + (loc_abs[0]/res[0])+1)
    abs_viewport = str(abs_viewport)+"*" if abs_viewport == currvp else str(abs_viewport)
    w.append(abs_viewport)
# set sorting rules
if arg == "-app":
    real_wlist.sort(key=lambda x: x[-2])
Elif arg == "-ws":
    real_wlist.sort(key=lambda x: x[-1])
Elif arg == "-win":
    real_wlist.sort(key=lambda x: x[-3])
# calculate width and height of the zenity window:
# height = 140px + 23px per line
h = str(140+(len(real_wlist)*23))
# width = 250px + 8px per character (of the longest window title)
w = str(250+(max([len(w[-3]) for w in real_wlist])*8))
# define the zenity window's content
cmd = "zenity --list --hide-column=4 --print-column=4 --title='Window list' "\
      "--width="+w+" --height="+h+" --column='"+col1+"' --column='"+col2+"' --column='"+col3+\
      "' --column='w_id' "+(" ").join([(" ").join([
          '"'+w[i1]+'"','"'+w[i2]+'"','"'+w[i3]+'"','"'+w[0][0]+'"'
          ]) for w in real_wlist])
# finally, call the window list
try:
    w_id = subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8").split("|")[0]
    subprocess.Popen(["wmctrl", "-ia", w_id])
except subprocess.CalledProcessError:
    pass
4
Jacob Vlijm

暫定的な回答:

  • 私は http://www.webupd8.org/2013/07/fuzzy-window-switcher-for-ubuntu.htmlhttps:// github。 com/XCMer/fuzzy-window-switcher ..これは有望に見えます。

  • Webupd8のコメントは、CompizScaleプラグインにも同様の機能があることを指摘しています。入力を開始すると、検索に一致するようにウィンドウのサムネイルが絞り込まれます。 Scale Addonsプラグインを使用すると、すべてのウィンドウのウィンドウタイトルを表示できます。ただし、タイトルはサムネイルの幅で切り捨てられ(エディターやシェルのような長いタイトルのウィンドウでは不適切です)、検索はあいまいではありません。

  • PyPIの別のもの: http://pypi.python.org/pypi/windownow/

2
Jean Jordaan