単純なキーコンボを押すたびに、xmonadに共通の文字シーケンスを入力させようとしています。この問題の1つの例は、単にメールアドレスを入力することです。
これは、xmonadの構成ファイルが私にとってどのように見えるかです:
import XMonad
import XMonad.Config.Gnome (gnomeConfig)
import XMonad.Util.CustomKeys (customKeys)
import XMonad.Util.EZConfig
main = xmonad $ gnomeConfig {
keys = customKeys delKeys insKeys,
logHook = return ()
}
where
-- Remap mod-p to dmenu and mod-[sd] to swapping xinerama screens.
delKeys :: XConfig l -> [(KeyMask, KeySym)]
delKeys XConfig { modMask = modMask } =
[ (modMask, xK_p), (modMask, xK_w), (modMask, xK_e) ]
insertEmailAddress :: KeyMask -> [((KeyMask, KeySym), X())]
insertEmailAddress modMask = [ ((noModMask, xK_Menu), spawn "xdotool type [email protected]") ]
insKeys :: XConfig l -> [((KeyMask, KeySym), X())]
insKeys XConfig { modMask = modMask } = insertEmailAddress modMask
ただし、メニューキーを押すと(キーボードの右下にあります)、最後の半分しか取得できません。いいね:[email protected]
または[email protected]
。どこから印刷を開始するかはまったく予測できません。
xdotool
コマンドをxdotool sleep 0.1 type [email protected]
に変更することで回避策を見つけました。これは必ず機能するように見えますが、その理由はわかりません。何かご意見は?
xmonad 0.11およびxdotoolバージョン3.20140217.1を使用
--sync
オプションはまさに私が探していたものでした!
ただし、--sync
オプションは、getコマンドまたはsearchコマンドの特定のセットにのみ存在します。
ソリューションは次のようになりました:xdotool getwindowfocus windowfocus --sync type [email protected]
ここで何が起こっているかは、最初にgetwindowfocus
を介してフォーカスされたウィンドウを取得することです(他が機能しない場合は、getactivewindow
が代替です)。
私たちがやっていることは、アクティブなウィンドウを取得して同じものに設定することだけです。主な違いは、前のコマンドが適用されるまでxdotool
を強制する--sync
オプションの存在です。
そのため、特定のウィンドウにフォーカスし、コマンドを入力できるようになります。
--delay
(デフォルトは12ms)を使用して、キーストローク間の遅延を増やす必要がある場合があります。
xdotool type --delay 100 [email protected]