이 답변마우스 기본 버튼과 보조 버튼을 바꾸는 명령줄을 보여줍니다. 하지만 실행될 때마다 마우스 버튼을 자동으로 바꾸는 스크립트를 원합니다. 누군가 나에게 이 작업을 수행하는 방법에 대해 힌트를 줄 수 있습니까? 저는 bash 스크립트에 대해 거의 아무것도 모릅니다.
답변1
xinput list
on 의 출력을 제공하지 않고당신의시스템에서는 누구도 귀하가 직접 사용할 수 있는 답변을 제공할 수 없습니다. 이는 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 list'는 동일한 장치를 두 번 표시하고 장치 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!" 배열이 가능함).
가장 간단한 구성(및 해석)이 있다고 가정하면 스크립트에서 다음과 같은 작업을 수행할 수 있습니다.
#!/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 실행 시 해당 파일에 'normal'을 씁니다.
xinput set-button-map 12 2 3 취할 실제 조치는 파일 읽기에 따라 다릅니다. 스크립트가 시작될 때 파일 내용이 있거나 normal
파일이 없으면 첫 번째 단계를 수행하고, 내용이 있으면 두 번째 단계를 수행합니다. 이다 reverse
.
호출할 때마다 파일 내용이 에서 로 전환됩니다 reverse
. normal
실제 상태는 재부팅 후와 같이 파일의 내용을 반영하지 않을 수 있으므로 시각적 알림을 위해 새로운 상태가 무엇인지 화면에 인쇄하십시오. 파일이 상태와 동기화되지 않은 경우 스크립트를 한 번 호출하면 다시 동기화됩니다.