TL; DR
Bash có chức năng tương tự như zsh
là bindkey
thông qua bind
, nhưng nó không có nhiều vi
chế độ như zsh
. Sau khi set -o vi
bạn có thể làm:
bind '"jk":vi-movement-mode'
đó là tương đương với zsh
'sbindkey -M <all vi modes> jk vi-movement-mode
Các vi-movement-mode
chức năng đến từ inputrc
(xem /etc/inputrc
danh sách của chúng).
Toàn văn
Như Stephen Harris đã chỉ ra trong bình luận của mình:
.bashrc
được gọi bởi bash
luôn luôn (và đáng chú ý là không phải bởi các shell khác).
.bash_profile
chỉ được gọi trên shell đăng nhập (và một lần nữa, chỉ bash).
Một số distro đi kèm với một .bash_profile
bộ xương trông như sau:
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
Đó là một nội dung tốt .bash_profile
vì bạn có thể quên nó tồn tại.
Bây giờ, để ánh xạ jktới Esctrong phiên shell, điều đó thực sự không thể. Khi bạn làm:
inoremap jk <esc>
Trong Vim, sau khi bạn nhập j, Vim biết rằng bạn cần đợi một chút để xem bạn có nhập ktiếp không và nó sẽ gọi ánh xạ (hoặc bạn nhập khóa khác và ánh xạ không được kích hoạt). Là một phụ lục, điều này được kiểm soát bởi :set timeoutlen=<miliseconds>
trong Vim (xem :h timeoutlen
).
Một số shell hoặc X11 không có kiểm soát thời gian chờ như vậy và không cho phép ánh xạ nhiều ký tự. Chỉ cho phép ánh xạ một khóa duy nhất (Nhưng xem các ghi chú hỗ trợ bên dưới.).
set -o vi
Không đọc .vimrc
, nó chỉ bắt chước một số tổ hợp phím vi
(thậm chí không vim
) có thể được sử dụng trong trình bao. Điều tương tự cũng có thể nói -o emacs
, nó không đi kèm với toàn bộ sức mạnh của emacs
.
hỗ trợ zsh
zsh
thực sự hỗ trợ thời gian chờ bản đồ. Và bạn có thể sử dụng như sau để ánh xạ jk
tới <esc>
:
bindkey -v # instead of set -o vi
bindkey -e jk \\e
(Điều đó sẽ cần phải đi đến ~/.zshrc
không ~/.bashrc
)
Tuy nhiên, tôi khuyên chống lại điều này. Tôi sử dụng vim
và zsh
hầu hết thời gian. Tôi có inoremap jk <esc>
trong tôi vimrc
và tôi đã thử bằng cách sử dụng bindkey
sự kết hợp trên. zsh
Chờ đợi quá lâu để in j
khi sử dụng nó, và điều đó làm tôi khó chịu rất nhiều.
hỗ trợ bash
bash
hỗ trợ readline
bind
. Tôi tin rằng bash
có thể được biên dịch mà không có readilne
do đó có thể có một số hệ thống hiếm có bash không hỗ trợ bind
(cảnh giác). Để ánh xạ jk
đến <esc>
trong bash
bạn cần làm:
set -o vi
bind '"jk":"\e"'
(vâng, đó là một mức trích dẫn kép, nó là cần thiết)
Một lần nữa, điều này làm cho việc gõ j
khá khó chịu. Nhưng bằng cách nào đó ít gây phiền nhiễu hơn zsh
giải pháp trên máy của tôi (có lẽ thời gian chờ mặc định ngắn hơn).
Giải pháp thay thế (cho các vỏ không bash và không zsh)
Lý do để ánh xạ lại Escphím là nó nằm khá xa trên bàn phím và việc gõ phím cần có thời gian. Một mẹo có thể mượn từ những emacs
kẻ đó là ánh xạ lại CapsLockvì dù sao nó cũng là một chìa khóa vô dụng. emacs
Các bạn sắp xếp lại Ctrlnhưng chúng tôi sẽ sắp xếp lại Esc.
Hãy sử dụng xev -event keyboard
để kiểm tra mã khóa của 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
Và để kiểm tra chức năng của 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
Rất tốt, CapsLocklà mã khóa 66 và Escchức năng của nó được gọi là "Thoát". Bây giờ chúng ta có thể làm:
# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"
Trên đây phải được thực hiện theo thứ tự này. Bây giờ mỗi khi bạn nhấn CapsLocknó hoạt động như một Escphím.
Phần khó khăn là nơi để thiết lập này. Một tập tin ~/.Xmodmap
có nội dung:
remove lock = Caps_Lock
keycode 66 = Escape
Nên được hầu hết các distro tôn trọng (thực tế là các trình quản lý hiển thị, nhưng tôi đang nói các distro vì đơn giản), nhưng tôi đã thấy các distro không tôn trọng một số ~/X*
tệp. Đối với các bản phân phối như vậy, bạn có thể thử một cái gì đó như:
if [ "x" != "x$DISPLAY" ]; then
xmodmap -e "remove lock = Caps_Lock"
xmodmap -e "keycode 66 = Escape"
fi
Trong của bạn .bashrc
.
(Về lý thuyết sẽ được đặt tốt hơn ~/.xinitrc
nhưng nếu người quản lý hiển thị không tôn trọng .Xmodmap
thì chắc chắn sẽ không tôn trọng ~/.xnintrc
.)
Lưu ý thêm: Điều này chỉ CapsLocknhắc lại Esctrong phiên X11, do đó bản đồ sẽ chỉ hoạt động trong trình giả lập thiết bị đầu cuối. Thực tế tty
sẽ không nhìn thấy bản đồ.
Tài liệu tham khảo và đọc thêm:
jk
? Đó có phải là một số phím đặc biệt trên bàn phím của bạn?