xmonadのカスタムデスクトップでアプリケーションを開く

xmonadのカスタムデスクトップでアプリケーションを開く

たとえばshell-command、私がemacs電話しているとします。この例では、この方法で起動されたアプリケーションを(shell-command "evince")自動的に 。evince5xmonad

答え1

精神的に何かをしてうまくいく悪魔の勢力これらの問題を解決するために作成されました何でも標準準拠WMたとえば、正しく構成されたXMonad、また見てくださいよくある質問)。

行に応じたいくつかの構成(使用このチュートリアル、Evinceを一致させるこの方法が実際に有効かどうかはわかりません。おそらく他の方法が必要かもしれません(文書を参照)。

(if
  (is (application_name) "Evince")
    (begin
    (set_workspace 5)
    (maximize)
  )
)

仕事をしなければなりません。デビルズパイを参照してくださいここでよく言われる、より便利な情報をワンクリックで確認することができます。

答え2

純粋なxmonad構成でこれを達成できます。プログラムで.xmonad/xmonad.hsこれを行うには、ManageHookを設定する必要があります。意図的に1つ以上の「ルール」を含めました。

theManageHook = composeAll [
    -- send applications to the right workspace
    className =? "Evince" --> doShift "5",
    className =? "Pidgin" --> doShift "4"
    --- more settings ...
]

main = do
    xmonad $ gnomeConfig { 
        manageHook = theManageHook <+> manageHook gnomeConfig
    }

xprop目的のウィンドウをクリックすると、そのウィンドウのクラス名が表示されます。 className は xprop 出力の 2 番目の項目を表します。一部のxpropertiesだけが必要な場合は、xpropそれをパラメータとして受け入れます。

~ $ xprop WM_CLASS WM_NAME
WM_CLASS(STRING) = "evince", "Evince"
WM_NAME(STRING) = "Document Viewer"

より多くの関連コンテンツは、以下で見つけることができます。Xmonad FAQ

答え3

xdotoolこれは、ウィンドウのクラスを変更した後、またはDevil's Pieを5使用してXMonadデスクトップに移動する方法です。

#!/bin/sh
$1 &
NEW_WINDOW_PID=$!

WINDOW_EXISTENCE=$(xdotool search --pid ${NEW_WINDOW_PID} 2> /dev/null) #is empty if the window hasn't finished opening.
COUNTER=0
while [[ -z $WINDOW_EXISTENCE && $COUNTER < 6 ]] #waits for the window to open
do
    WINDOW_EXISTENCE=$(xdotool search --pid ${NEW_WINDOW_PID} 2> /dev/null)
    sleep 1
    (( COUNTER++ ))
done

if [ $COUNTER != "6" ]; then
    NEW_WINDOW_ID=$(xdotool search --onlyvisible --pid ${NEW_WINDOW_PID}) #finds the window that was just opened
    xdotool set_window --class yay ${NEW_WINDOW_ID}; #change the class of the window to yay
fi

次に、emacsに関数を作成します。

(defun window-in-desktop-5 (cmd)
  "start shell command on desktop 5"
  (interactive "sshell-command: ")
  (shell-command  (concat "/path/to/xdotoolscript " cmd)))

Emacs関数を介してプログラムを呼び出すたびに、ウィンドウのPIDがそれを呼び出した関数と同じである限り、ウィンドウのクラス名が変更されます。それ以外の場合、スクリプトは6秒後にタイムアウトします。

関連情報