TL; DR
ทุบตีมีการทำงานคล้ายกับzsh
's bindkey
ผ่านbind
แต่มันไม่ได้มีหลายรูปแบบเช่นvi
zsh
หลังจากที่set -o vi
คุณสามารถทำได้:
bind '"jk":vi-movement-mode'
ซึ่งเทียบเท่าของzsh
'sbindkey -M <all vi modes> jk vi-movement-mode
vi-movement-mode
ฟังก์ชั่นมาจากinputrc
(ดู/etc/inputrc
รายชื่อของพวกเขา)
ข้อความเต็ม
สตีเฟ่นแฮร์ริสชี้ให้เห็นในความคิดเห็นของเขา:
.bashrc
ถูกเรียกโดยbash
เสมอ (และไม่โดดเด่นด้วยกระสุนอื่น)
.bash_profile
ถูกเรียกบนเชลล์ล็อกอินเท่านั้น (และอีกครั้ง, ทุบตีเท่านั้น)
หลาย distros มาพร้อมกับ.bash_profile
โครงกระดูกที่มีลักษณะดังนี้:
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
ซึ่งเป็นเนื้อหาที่ดี.bash_profile
เพราะคุณสามารถลืมมันได้
ตอนนี้การแมปjkไปEscในเซสชั่นเปลือกนั่นเป็นไปไม่ได้จริงๆ เมื่อคุณทำ:
inoremap jk <esc>
ใน Vim หลังจากคุณพิมพ์jVim รู้ว่าต้องรอนิดหน่อยเพื่อดูว่าคุณพิมพ์kถัดไปหรือไม่และควรเรียกใช้การจับคู่ (หรือคุณพิมพ์คีย์อื่นและไม่ควรเรียกใช้การแมป) เป็นภาคผนวกนี้ถูกควบคุมโดย:set timeoutlen=<miliseconds>
ในกลุ่ม (ดู:h timeoutlen
)
เชลล์หลายตัวหรือ X11 ไม่มีการควบคุมการหมดเวลาและไม่อนุญาตให้ทำการแมปอักขระหลายตัว อนุญาตการทำแผนที่ของคีย์เดียวเท่านั้น (แต่ดูหมายเหตุสนับสนุนด้านล่าง)
set -o vi
ไม่ได้อ่าน.vimrc
มันเลียนแบบการผสมคีย์บางอย่างvi
(ไม่เท่ากันvim
) ที่สามารถใช้ในเชลล์ได้ เช่นเดียวกับที่ได้กล่าวเกี่ยวกับมันไม่ได้มาด้วยอำนาจเต็มของ-o emacs
emacs
สนับสนุน zsh
zsh
จริง ๆ แล้วสนับสนุนการหมดเวลาของแผนที่ และคุณสามารถใช้แผนที่ต่อไปนี้jk
เพื่อ<esc>
:
bindkey -v # instead of set -o vi
bindkey -e jk \\e
(นั่นจะต้องไป~/.zshrc
ไม่ได้~/.bashrc
)
ถึงกระนั้นฉันแนะนำต่อนี้ ฉันใช้vim
และzsh
ส่วนใหญ่เวลา ฉันมีinoremap jk <esc>
ในตัวของฉันvimrc
และฉันได้ลองใช้bindkey
ชุดค่าผสมด้านบน zsh
รอนานเกินไปที่จะพิมพ์j
เมื่อใช้งานและนั่นทำให้ฉันรำคาญมาก
สนับสนุนทุบตี
bash
readline
bind
สนับสนุน ฉันเชื่อว่าbash
สามารถรวบรวมได้โดยไม่ต้องreadilne
มีบางระบบที่หายากที่มีการทุบตีที่ไม่สนับสนุนbind
(ระวังตัว) ต้องการแมปjk
ไป<esc>
ในbash
ที่คุณต้องทำ:
set -o vi
bind '"jk":"\e"'
(ใช่ว่าเป็นข้อความสองระดับจำเป็นต้องมี)
ทำให้การพิมพ์j
น่ารำคาญอีกครั้ง แต่อย่างใดที่น่ารำคาญน้อยกว่าzsh
วิธีการแก้ปัญหาในเครื่องของฉัน
วิธีแก้ปัญหา (สำหรับเชลล์ที่ไม่ใช่ bash และ non-zsh)
เหตุผลในการแมปEscกุญแจใหม่คือปุ่มนั้นอยู่ไกลจากแป้นพิมพ์มากและการพิมพ์ต้องใช้เวลา เคล็ดลับที่สามารถยืมได้จากemacs
พวกนั้นคือทำการแมปใหม่CapsLockเพราะมันเป็นกุญแจที่ไร้ประโยชน์อยู่ดี emacs
พวกทำการแมปไปCtrlแต่เราจะทำการแมปEscใหม่
ลองใช้xev -event keyboard
เพื่อตรวจสอบ keycode ของCapsLock:
KeyPress event, serial 25, synthetic NO, window 0x1c00001,
root 0x496, subw 0x0, time 8609026, (764,557), root:(765,576),
state 0x0, keycode 66 (keysym 0xffe5, Caps_Lock), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
และเพื่อตรวจสอบการทำงานของEsc:
KeyPress event, serial 25, synthetic NO, window 0x1c00001,
root 0x496, subw 0x0, time 9488531, (571,525), root:(572,544),
state 0x0, keycode 9 (keysym 0xff1b, Escape), same_screen YES,
XLookupString gives 1 bytes: (1b) "
XmbLookupString gives 1 bytes: (1b) "
XFilterEvent returns: False
ดีมากCapsLockคือรหัสกุญแจ 66 และEscฟังก์ชั่นของมันถูกเรียกว่า "Escape" ตอนนี้เราสามารถทำได้:
# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"
ต้องทำตามลำดับข้างต้นนี้ ตอนนี้ทุกครั้งที่คุณกดปุ่มCapsLockมันจะทำงานเหมือนเป็นEscกุญแจ
ส่วนที่ยากคือที่ตั้งนี้ ไฟล์ที่~/.Xmodmap
มีเนื้อหา:
remove lock = Caps_Lock
keycode 66 = Escape
ควรได้รับการเคารพจาก distros ส่วนใหญ่ (จริง ๆ แล้วเป็นผู้จัดการการแสดง แต่ฉันกำลังพูดถึง distros เพื่อความเรียบง่าย) แต่ฉันเห็นคนที่ไม่เคารพ~/X*
ไฟล์หลายไฟล์ สำหรับสิ่งที่รบกวนคุณอาจลองทำสิ่งต่อไปนี้:
if [ "x" != "x$DISPLAY" ]; then
xmodmap -e "remove lock = Caps_Lock"
xmodmap -e "keycode 66 = Escape"
fi
.bashrc
ในของคุณ
(ในทางทฤษฎีที่น่าจะอยู่ในตำแหน่งที่ดีกว่า~/.xinitrc
แต่ถ้าผู้จัดการการแสดงผลไม่เคารพ.Xmodmap
มันจะไม่เคารพอย่างแน่นอน~/.xnintrc
)
หมายเหตุพิเศษ: นี้เท่านั้น remaps CapsLockไปEscในเซสชั่ X11 จึงแผนที่จะทำงานเฉพาะในการเลียนแบบขั้ว ที่จริงแล้วtty
จะไม่เห็นแผนที่
การอ้างอิงและการอ่านพิเศษ:
jk
? นั่นคือกุญแจพิเศษบางอย่างบนแป้นพิมพ์ของคุณ?