この答えマウスのプライマリ ボタンとセカンダリ ボタンを交換するコマンド ラインを表示します。ただし、スクリプトを実行するたびにマウス ボタンを自動的に交換したいです。これを行う方法について誰かヒントをいただけませんか。私は bash スクリプトについてほとんど何も知りません。
答え1
出力を提供しxinput list
ないあなたのシステムでは、直接使用できる答えを誰も提供できません。これは、xinput
図に示されているものとは異なるデバイスを表示できるためです。ターミナルからマウスボタンを左利き用に切り替えるにはどうすればよいですか?。
たとえば、OSX での出力は次のようになります。
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ xquartz virtual pointer id=6 [slave pointer (2)]
⎜ ↳ pen id=8 [slave pointer (2)]
⎜ ↳ cursor id=9 [slave pointer (2)]
⎜ ↳ eraser id=10 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ xquartz virtual keyboard id=7 [slave keyboard (3)]
私の Debian/testing での出力は次のとおりです。
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ VMware VMware Virtual USB Mouse id=7 [slave pointer (2)]
⎜ ↳ VirtualPS/2 VMware VMMouse id=9 [slave pointer (2)]
⎜ ↳ VirtualPS/2 VMware VMMouse id=10 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=8 [slave keyboard (3)]
つまり、あるシステムでは選択できる ID は 1 つ (xquartz 仮想ポインタ) ですが、別のシステムでは 3 つの可能性があります。これらを読んでいくと、ここで引用されている例が不自然なものではないことがわかります。
- マウスのキーマッピングを変更するにはどうすればいいですか
- 「xinput list」に同じデバイスが 2 回表示され、デバイス ID が変更されます。スクリプトで「set-prop」を使用するにはどうすればよいでしょうか?
変動(そして曖昧さ)を考慮するとドキュメントxinput
) の場合、マウス デバイスの ID を取得する部分を自動化することはできない可能性があります。
使用可能な識別子を選択したと仮定し、議論のためにそれを「12」と呼ぶことにします。スクリプトは、次の出力を読み取ることができます。
xinput get-button-map 12
を配列に変換します。一部のスクリプト言語では配列が提供されています (例: ) bash
。ただし、いくつか落とし穴があります。
- 私の OSX システムでは、リスト「1 2 3」が返されますが、Debian システムではリスト「1 2 3 4 5 6 7 8 9 10 11 12」が返されます。
- 追加のボタンが何か意味があるかどうかを推測する必要があり、
- 3 つのボタン番号の割り当てでも、左/中央/右が明確でない場合があります。
次に、キーを切り替えるスクリプトは、その状態をどこかに保存する必要があります。たとえば、ホームディレクトリのファイルに保存します。それを管理するスクリプトは、
- 現在のボタンでファイルを初期化する
- ボタンを切り替えるスキームに従って更新します (3 つの場合は「3!」の可能な配置があります)
最も単純な構成 (および解釈) があると仮定すると、スクリプトで次のような操作を実行できます。
#!/bin/sh
id=$1
cfg=$HOME/.mousebuttons
[ -f "$cfg" ] || xinput get-button-map $id | awk ' { printf "normal: %s\n", $0; }' >$cfg
mode=$(awk '{print $1;}' <$cfg)
# read and toggle
list=$(awk '{printf "%d %d %d\n", $3, $2, $4; }' <$cfg)
if [ "x$mode" = "xnormal" ]
then
mode=reverse
else
mode=normal
fi
# update the configuration
echo "$mode $list" | awk '{ printf "%s %d %d %d\n", $1, $2, $3, $4; }' >$cfg
xinput set-button-map $id $list
# show result
xinput get-button-map $id
スクリプトは 1 つのパラメータ (マウス デバイスの識別子) を受け入れます。指定された例 (スクリプトに「toggle-buttons」という名前を付け、実行可能にして に配置する$PATH
) の場合:
toggle-buttons 12
仕事はできるはずです。
答え2
他の回答は、マウスのプライマリボタン (1 と 3) を交換するという単純なタスクに対して過度に複雑であるように思われる場合があるため、これに対して独自の解決策を追加します。
#!/bin/bash
set -e
# To get the name of a devices, do "xinput list --name-only"
DEVICE_NAME="PixArt Microsoft USB Optical Mouse"
current_button_map=$(xinput get-button-map "$DEVICE_NAME")
if [[ $current_button_map =~ "1 2 3" ]]; then
echo "Making the mouse a lefty"
xinput set-button-map "$DEVICE_NAME" 3 2 1
else
echo "Making the mouse a righty"
xinput set-button-map "$DEVICE_NAME" 1 2 3
fi
答え3
私は次のようにします:
#!/bin/sh
mxid=$(xinput --list --short | awk '/Razer/{gsub(/.*id=/, "");gsub(/[[:blank:]].*/, "");print}')
bmap=$(xinput get-button-map $mxid)
nmap=$(awk '{s=$1;$1=$3;$3=s};1' <<<$bmap)
xinput set-button-map $mxid $nmap
これは、マウスの「名前」(私の場合はRazer
)を知っていて、 で取得するデフォルトのボタン マッピング(つまり、どのボタンが左でどのボタンが右で、それらを入れ替えることができるか)を知っていることを前提としていますxinput list $mxid
。
Button labels: "Button Left" "Button Middle" "Button Right"....
そしてxinput get-button-map $mxid
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
ご覧のとおり、私の場合1 =>> left
、3 =>> right
上記のスクリプトは現在のマッピングを読み取り、最初の値と 3 番目の値を交換して、新しいマッピングを設定するだけです。
答え4
デバイスの状態を切り替える必要がある場合 (マウス キーの順序を反転/反転解除することがそのような状態である場合)、デバイスの現在の状態を照会するか、状態を何らかのファイルに保持できる必要があります。
xinput
マウスにボタン マッピングを問い合わせる方法があるかどうかはわかりませんでしたが、たとえば というファイルに状態を保存する方がよいでしょう~/.config/mousebuttons
。スクリプトは実行時にファイルに 'reverse' を書き込む必要があります。
xinput set-button-map 12 3 2 1 を実行し、そのファイルに 'normal' を書き込みます。
xinput set-button-map 12 2 3 実際に実行されるアクションは、ファイルの読み取り内容によって異なります。スクリプトの開始時にファイルの内容が である場合normal
(またはファイルが存在しない場合) は最初の手順を実行し、内容が である場合は 2 番目の手順を実行しますreverse
。
ファイルの内容は、呼び出されるたびに から に切り替わりますreverse
。normal
再起動後など、実際の状態がファイルの内容を反映していない可能性があります。そのため、新しい状態も画面に出力して、視覚的なリマインダーとして確認してください。ファイルが状態と同期していない場合は、スクリプトを 1 回呼び出すだけで、再び同期されます。