xcape อนุญาตให้คุณใช้คีย์ตัวปรับแต่งเป็นอีกคีย์หนึ่งเมื่อกดและปล่อยด้วยตัวเอง โปรดทราบว่าการดำเนินการจะช้ากว่าการกดปุ่มเดิมเล็กน้อย เนื่องจากเหตุการณ์ที่กดจะไม่เกิดขึ้นจนกว่าจะปล่อยปุ่ม ลักษณะการทำงานเริ่มต้นคือการสร้างปุ่ม Escape เมื่อกดและปล่อย Left Control ด้วยตัวเอง (หากคุณไม่เข้าใจว่าทำไมใครๆ ถึงต้องการสิ่งนี้ ฉันเดาว่า Vim ไม่ใช่โปรแกรมแก้ไขข้อความที่คุณชื่นชอบ ;)
ขั้นแรกให้ติดตั้งการพึ่งพาการพัฒนา บนระบบที่ใช้ Debian (รวมถึง Ubuntu และ Linux Mint) ให้รัน:
$ sudo apt-get install git gcc make pkg-config libx11-dev libxtst-dev libxi-dev
บนระบบที่ใช้ Fedora ให้รัน:
$ sudo dnf install git gcc make pkgconfig libX11-devel libXtst-devel libXi-devel
จากนั้นเรียกใช้:
$ git clone https://github.com/alols/xcape.git
$ cd xcape
$ make
$ sudo make install
$ xcape [-d] [-f] [-t <timeout ms>] [-e <map-expression>]
-d
โหมดแก้ไขข้อบกพร่อง ไม่แยกเป็นพื้นหลัง พิมพ์ข้อมูลการดีบัก
-f
โหมดเบื้องหน้า ไม่แยกเป็นพื้นหลัง
-t <timeout ms>
หากคุณถือคีย์ไว้นานกว่าระยะหมดเวลานี้ xcape จะไม่สร้างเหตุการณ์คีย์ ค่าเริ่มต้นคือ 500 ms
-e <map-expression>
นิพจน์มีไวยากรณ์ 'ModKey=Key[|OtherKey][;NextExpression]'
รายการชื่อคีย์อยู่ในไฟล์ส่วนหัว X11/keysymdef.h
(ลบคำนำหน้า XK_
) โปรดทราบว่าเนื่องจากข้อจำกัดของแป้น Shift X11 จะต้อง ระบุเป็นแป้น Shift ตามด้วยแป้นที่จะกด แทนที่จะเป็นชื่อจริงของอักขระ ตัวอย่างเช่นในการสร้าง "{" สามารถใช้นิพจน์ 'ModKey=Shift_L|bracketleft'
ได้ (สมมติว่าคุณมีคีย์ที่มี "{" อยู่เหนือ "[")
คุณยังสามารถระบุคีย์ในรูปแบบทศนิยม (คำนำหน้า #
), ฐานแปด ( #0
) หรือเลขฐานสิบหก ( #0x
) พวกเขาจะถูกตีความว่าเป็นรหัสคีย์เว้นแต่จะไม่พบชื่อคีย์ที่เกี่ยวข้อง
สิ่งนี้จะทำให้ Left Shift สร้าง Escape เมื่อกดและปล่อยด้วยตัวเอง และ Left Control จะสร้างชุดค่าผสม Ctrl-O เมื่อกดและปล่อยด้วยตัวเอง
xcape -e 'Shift_L=Escape;Control_L=Control_L|O'
เมื่อใช้ร่วมกับ xmodmap คุณสามารถทำให้คีย์ธรรมดาทำหน้าที่เป็นตัวแก้ไขพิเศษได้ ขั้นแรกแมปคีย์กับตัวแก้ไขด้วย xmodmap จากนั้นตัวแก้ไขกลับไปที่คีย์ด้วย xcape อย่างไรก็ตาม สิ่งนี้มีข้อจำกัดหลายประการ: คีย์จะไม่ทำงานตามปกติจนกว่าจะเปิดตัว และโดยเฉพาะอย่างยิ่ง อาจทำหน้าที่เป็นตัวแก้ไขโดยไม่ได้ตั้งใจหากคุณพิมพ์เร็วเกินไป นี่ไม่ใช่จุดบกพร่องใน xcape แต่เป็นผลลัพธ์ที่หลีกเลี่ยงไม่ได้จากการใช้เครื่องมือทั้งสองนี้ร่วมกันในลักษณะนี้ ตามตัวอย่าง เราสามารถทำให้สเปซบาร์ทำงานเป็นปุ่ม Ctrl เพิ่มเติมได้เมื่อกดค้างไว้ (คล้ายกับ Space2ctrl) โดยใช้ลำดับคำสั่งต่อไปนี้
# Map an unused modifier's keysym to the spacebar's keycode and make it a
# control modifier. It needs to be an existing key so that emacs won't
# spazz out when you press it. Hyper_L is a good candidate.
spare_modifier="Hyper_L"
xmodmap -e "keycode 65 = $spare_modifier"
xmodmap -e "remove mod4 = $spare_modifier" # hyper_l is mod4 by default
xmodmap -e "add Control = $spare_modifier"
# Map space to an unused keycode (to keep it around for xcape to
# use).
xmodmap -e "keycode any = space"
# Finally use xcape to cause the space bar to generate a space when tapped.
xcape -e "$spare_modifier=space"
หากคุณมีนิสัยชอบเปลี่ยนคีย์โค้ดเป็นคีย์ซิมส์ (เช่น การใช้ xmodmap) คุณอาจพบปัญหาสองประการ
คุณจะต้องรีสตาร์ท xcape หลังจากทุกครั้งที่คุณแก้ไขการแมปจากรหัสคีย์เป็นคีย์ซิมส์ (เช่น ด้วย xmodmap) ไม่เช่นนั้น xcape จะยังคงใช้การแมปเก่า
คีย์ที่คุณต้องการส่งต้องมีรหัสที่กำหนดไว้ ตัวอย่างเช่น ด้วยการแมปเริ่มต้น Control_L=Escape
คุณยังคงต้องมีคีย์ Escape ที่กำหนดไว้ในการแมป xmodmap ของคุณ (ฉันแก้ไขสิ่งนี้ได้โดยใช้ 255 ซึ่งคีย์บอร์ดของฉันไม่สามารถส่งได้)
ค้นหาเวอร์ชันล่าสุดได้ที่https://github.com/alols/xcape
สามารถติดต่อผู้เขียนได้ที่ albin dot olsson ที่ gmail dot com