이 답변기본 마우스 버튼과 보조 마우스 버튼을 교체하기 위한 명령줄을 표시합니다. 하지만 실행할 때마다 마우스 버튼을 자동으로 바꾸는 스크립트를 갖고 싶습니다. 누군가 나에게 이 작업을 수행하는 방법에 대한 힌트를 줄 수 있습니까? 저는 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)]
이것은 내 데비안/테스트의 결과입니다:
$ 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가 하나 있을 수 있으며(xquartz 가상 포인터), 다른 시스템에는 세 가지 가능성이 있습니다. 이 내용을 주의 깊게 읽으면 여기에 인용된 예가 인위적인 것이 아님을 알 수 있습니다.
변경 사항(및 모호함)을 고려하여선적 서류 비치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
스크립트는 하나의 매개변수(마우스 장치의 식별자)를 허용합니다. 주어진 예에 대해(그리고 스크립트 이름을 "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
위 스크립트는 현재 매핑을 읽고 첫 번째와 세 번째 값을 바꾼 다음 새 매핑을 설정합니다.
답변4
장치의 상태를 전환해야 하는 경우(마우스 키의 순서를 뒤집거나 반전시키는 것이 이러한 상태임) 장치의 현재 상태를 쿼리하거나 일부 파일에서 상태를 유지할 수 있어야 합니다.
xinput
마우스에게 버튼 매핑을 요청하는 방법이 있는지 찾을 수 없으므로 상태를 파일(예: )에 저장해야 합니다 ~/.config/mousebuttons
. 스크립트는 실행될 때 파일에 "reverse"를 써야 합니다.
xinput set-button-map 12 3 2 1 실행 시 파일에 "정상적으로" 기록됩니다.
xinput set-button-map 12 2 3 실제로 수행되는 작업은 파일 읽기에 따라 다릅니다. 스크립트가 시작될 때 파일 내용이 있거나 파일이 존재하지 않으면 normal
첫 번째 단계가 수행되고, 내용이 다음과 같으면 그런 다음 두 번째 단계가 수행됩니다 reverse
.
호출할 때마다 파일 내용이 반전됩니다 reverse
. normal
재부팅 후와 같이 실제 상태가 파일 내용을 반영하지 않을 수 있으므로 시각적 알림으로 새 상태를 화면에 인쇄하십시오. 파일이 상태와 동기화되지 않은 경우 스크립트를 한 번만 호출하여 다시 동기화하면 됩니다.