Wie kann ich das Verhalten von Hotkeys in xmonad ändern, wenn das Programm ausgeführt wird?

12

Ich verwende einige Schlüsselzuordnungen in meiner xmonad.hsKonfigurationsdatei:

...
    , modMask = mod4Mask     -- Rebind Mod to the Windows key
...
 [ ((controlMask, xK_Print), spawn "sleep 0.2; scrot -s")
 , ((0, xK_Print), spawn "scrot")
 , ((controlMask, xK_f), spawn "firefox")
 ]

Das dritte Mapping wird firefoxbeim Drücken ausgeführt ctrl+f. Ich möchte etwas komplexeres machen:

if (firefox is running):
  focus and maximize firefox window:
else:
  run firefox

Und ich möchte ändern ctrl+fzu win+f. Wie kann ich das machen?

xralf
quelle
Ist Crossposting wie dieses (hier und bei Stackoverflow) wirklich ein gewöhnliches Geschäft?
11.
Nein: es wird aktiv entmutigt ...
Jasonwryan
Es ist Off-Topic auf SO, also bat ich sie, ihre Kopie loszuwerden
Michael Mrozek
@ dmitry.malikov Dies scheint ein besserer Ort für die Frage zu sein.
Xralf
Noch besser; xralf hat die SO-Kopie gelöscht. Vielen Dank
Michael Mrozek

Antworten:

8

Wenn Sie sich die Contrib-Pakete von XMonad ansehen , werden Sie feststellen XMonad.Actions.WindowGo, welche die folgende Funktion exportieren :

runOrRaiseMaster :: String -> Query Bool -> X ()

welches ein String-Argument des Programms benötigt, um ausgeführt zu werden , zB "Firefox"; und eine boolesche Abfrage , mit der über X11-Eigenschaften ermittelt wird, ob sie bereits ausgeführt wird, z. B. (className =? "Firefox")( Varianten siehe oben auf der XMonad.Actions.WindowGoSeite für Varianten).

Also alles , was Sie brauchen , ist zu binden , runOrRaiseMaster "firefox" (className =? "Firefox")um den Schlüssel , den Sie möchten, wie erläutertXMonad.Doc.Extending , über

((modMask, xK_f ), runOrRaiseMaster "firefox" (className =? "Firefox"))

als Teil der Tastenkombinationen Data.MapIhrer Konfiguration (Details unterscheiden sich je nach Art der Einstellungen, dh Ihrer gesamten xmonad.hs, siehe Hinzufügen von Tastenkombinationen ).

Beachten Sie, dass es keinen Sinn macht, ein Fenster in XMonad zu maximieren . Wenn Sie die Dinge wie erklärt einrichten, müssen Sie Mod4+ fwie folgt vorgehen:

  • Wenn es ein Fenster mit einem Klassennamen gibt, der mit "Firefox" übereinstimmt, wird es fokussiert und auf Master gesetzt , dh abhängig von Ihrem aktuellen Layout wird das große Fenster angezeigt
  • wenn keine Fenster Streichhölzer, wird Firefox werden hervorgebracht und auf Master gesetzt .

Die Maximierung kann durch Auswahl des FullLayouts nach dem Aufruf emuliert werden runOrRaiseMaster, wie hier beschrieben :

("M-<F1>", sendMessage $ JumpToLayout "Full")

(Beachten Sie, dass dieses Beispiel auch zeigt, XMonad.Util.EZConfigdass einfachere Schlüsselbindungsdefinitionen möglich sind.)

Die Kombination dieser beiden Dinge ist ebenfalls möglich. Beide sind vom Typ X (), dh sie sind in der X-Monade . Verwenden >>, was vom Typ ist (einchecken mit :t (>>)in ghci)

(>>) :: Monad m => m a -> m b -> m b

Wir haben (runOrRaiseMaster "firefox" (className =? "Firefox")) >> (sendMessage $ JumpToLayout "Full")auch eine Kombination von zwei X ()Arten von Typen X (), und es kann somit an einen Schlüssel gebunden werden.

BEARBEITEN Fehlt )in der Codezeile mit>>

Edit2 modm -> modMask.

Edit3 Das xmonad.hsfunktioniert hoffentlich.

( Warum lernst du nicht ein Haskell für großes Wohl? )

sr_
quelle
Vielen Dank für die Antwort und andere Informationen und das Haskell-Tutorial. Ich mag die Haskell-Syntax und das funktionale Paradigma. Das einzige, was nicht funktioniert, ist der Teil, >> (sendMessage $ JumptoLayout "Full")bei dem ein Fehler beim Konstruktor vorliegt. Vielleicht ist es etwas Leichtes, das ich lösen werde, nachdem ich Haskell gelernt habe.
Xralf
Ich habe vergessen: Aber das modmfunktioniert nicht, ich benutze es immer noch controlMask.
Xralf
@xralf, (1) es fehlte eine Klammer - funktioniert das jetzt? (2) Ich würde dein ganzes brauchen xmonad.hs, um das zu beheben; Schauen Sie sich besser hier im Konfigurationsarchiv um und sehen Sie, wie andere es tun oder verwenden Sie das erwähnte EZConfig.
sr_
Die Klammer hat nicht geholfen. Hier ist die Datei xmonad.hs, die ich verwende.
Xralf
(1) Die Klammern sind immer noch falsch, die Aktion des Typs X ()zum Binden an den Schlüssel sollte sein (runOrRaiseMaster ...) >> (sendMessage ...), was zu ,((...,...), (runOrR...) >> (send...) ) (a (vor run...)
sr_