
私は、単純なキーの組み合わせを押すたびに、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 を使用
答え1
--sync
まさに私が探していたオプションでした!
ただし、この--sync
オプションは特定の get コマンドまたは search コマンドのセットにのみ存在します。
解決策は次のようになりました:xdotool getwindowfocus windowfocus --sync type [email protected]
ここで起こっていることは、まず を介してフォーカスされているウィンドウを取得することですgetwindowfocus
(getactivewindow
は、他が機能しない場合の代替手段です)。
異なる点は、アクティブ ウィンドウを取得して、それを同じものに設定することだけです。重要な違いは、前のコマンドが適用されるまで待機するように--sync
強制するオプションが存在することです。xdotool
したがって、特定のウィンドウにフォーカスが当てられ、コマンドを入力できることが保証されます。
答え2
キーストローク間の遅延を増やす必要がある場合があります--delay
(デフォルトは 12 ミリ秒)。
xdotool type --delay 100 [email protected]