2008-10-02 16 views
26

Tôi đang chạy zsh làm vỏ mặc định trên hộp Ubuntu và mọi thứ hoạt động tốt bằng cách sử dụng gnome-terminal (theo như tôi biết mô phỏng xterm). Khi tôi đăng nhập từ một cửa sổ hộp thông qua ssh và putty (mà cũng giả lập xterm) suddendly các phím home/end không còn làm việc.Trang chủ/Phím kết thúc trong zsh không hoạt động với putty

tôi đã có thể để giải quyết rằng việc thêm những dòng sau vào tệp zshrc của tôi ...

bindkey '\e[1~' beginning-of-line 
bindkey '\e[4~' end-of-line 

... nhưng tôi vẫn đang tự hỏi có gì sai ở đây. Bất kỳ ý tưởng?

+0

Cám ơn các ràng buộc trên. Làm việc ngay bây giờ cho tôi trong SecurtCRT – MikeRoger

Trả lời

54

tôi thấy đó là một sự kết hợp:

Một

Các nhà phát triển ZSH không nghĩ rằng ZSH cần xác định những hành động của Trang chủ, Kết thúc, Del, ... keys.

Debian và Ubuntu sửa lỗi này bằng cách xác định các hành động bình thường mà người dùng trung bình mong đợi trong tệp /etc/zsh/zshrc toàn cầu. Theo các mã có liên quan (nó giống nhau trên Debian và Ubuntu):

if [[ "$TERM" != emacs ]]; then 
[[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char 
[[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line 
[[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line 
[[ -z "$terminfo[kich1]" ]] || bindkey -M emacs "$terminfo[kich1]" overwrite-mode 
[[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char 
[[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line 
[[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line 
[[ -z "$terminfo[kich1]" ]] || bindkey -M vicmd "$terminfo[kich1]" overwrite-mode 

[[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history 
[[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char 
[[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history 
[[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history 
[[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char 
[[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char 

# ncurses fogyatekos 
[[ "$terminfo[kcuu1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history 
[[ "$terminfo[kcud1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history 
[[ "$terminfo[kcuf1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char 
[[ "$terminfo[kcub1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char 
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line 
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line 
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line 
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line 
fi 

Vì vậy, nếu bạn đang kết nối với Debian hoặc hộp Ubuntu, bạn không phải làm bất cứ điều gì. Mọi thứ sẽ hoạt động tự động (nếu không, xem bên dưới).

Nhưng ... nếu bạn đang kết nối với một hộp khác (ví dụ: FreeBSD), có thể không có người dùng mặc định thân thiện zshrc. Giải pháp là tất nhiên để thêm các dòng từ Debian/Ubuntu zshrc vào của riêng bạn .zshrc.

Hai

Putty gửi xterm loại như thiết bị đầu cuối để các máy chủ từ xa. Nhưng làm hỏng một nơi nào đó và không gửi mã kiểm soát chính xác cho Trang chủ, Kết thúc, ... mà mã sẽ mong đợi từ một số xterm. Hoặc thiết bị đầu cuối xterm sẽ không được gửi hoặc bất kỳ thứ gì ... (Del phím hoạt động trong xterm tuy nhiên, nếu bạn định cấu hình thiết bị trong ZSH). Cũng lưu ý rằng các phím Numpad của bạn hoạt động hài hước trong Vim ví dụ với thiết bị đầu cuối xterm.

Giải pháp là định cấu hình Putty để gửi một loại thiết bị đầu cuối khác. Tôi đã thử xterm-colorlinux. xterm-color sửa số Trang chủ/Kết thúc vấn đề, nhưng Numpad vẫn hài hước. Đặt nó thành linux đã khắc phục cả hai vấn đề.

Bạn có thể đặt loại thiết bị đầu cuối trong Putty trong Connection -> Data. Không bị cám dỗ để đặt loại thiết bị đầu cuối của bạn trong .zshrc với export TERM=linux, điều đó thật sai. Loại thiết bị đầu cuối phải được chỉ định bởi ứng dụng đầu cuối của bạn. Vì vậy, nếu, ví dụ, bạn kết nối từ một hộp Mac với một khách hàng Mac SSH nó có thể thiết lập loại thiết bị đầu cuối của riêng nó.

Lưu ý rằng TERM chỉ định loại thiết bị đầu cuối của bạn và không liên quan gì đến máy chủ mà bạn đang kết nối. Tôi có thể đặt loại thiết bị đầu cuối của mình thành linux trong Putty và kết nối với máy chủ FreeBSD mà không gặp sự cố nào.

Vì vậy, sửa chữa cả những điều này và bạn nên sử dụng tốt :)

+3

Một thời gian chờ khác để khắc phục hành vi bàn phím vui nhộn: Mở các phiên làm việc của phiên, đi tới 'Thiết bị đầu cuối -> Tính năng' và chọn hộp có nhãn 'Tắt chế độ bàn phím ứng dụng'. Xem tại đây: http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-appkeypad – exhuma

+1

Tôi phải thêm 'vi-đầu-of-line'' và' 'vi- end-of-line'' bindings để viins chế độ là tốt để hoàn toàn sửa chữa vấn đề của tôi với zsh + putty. Bây giờ nó hoạt động mặc dù. –

+0

Tôi đã không thành công với mã .zshrc mà @hopla dán. Vì vậy, tôi đã phải sử dụng giải pháp trên trang wiki zsh sau đây [http://zshwiki.org/home/zle/bindkeys](http://zshwiki.org/home/zle/bindkeys) trong phần về đọc từ $ terminfo [] cộng với giải pháp của hopla về việc thiết lập kiểu terminal thành "linux". Trang wiki ZSH nói về cơ bản giống nhau nhưng không có các tùy chọn "-M ..." được chuyển tới bindkey. Điều này chỉ hoạt động trong chế độ "vi" bindkey cho tôi mặc dù. –

0

Các liên kết này đơn giản không phải là một phần của các ràng buộc mặc định được đặt trong chế độ emacs.

thực thi "bắt đầu-of-line" trên cài đặt zsh mặc định của tôi sau khi chạy "bindkey -e" cho biết nó chỉ bị ràng buộc với^a. Có lẽ bạn nên hỏi các nhà phát triển zsh tại sao :-)

+0

Cài đặt ubuntu mặc định liên kết chúng trong một tệp zshrc toàn cầu, nhưng theo như tôi có thể thấy các ràng buộc không làm việc cho putty. – agnul

3

Có vẻ như là một điều khó khăn. Gnome-terminal gửi mã số ^[OH^[OF cho Trang chủ và Kết thúc tương ứng, trong khi putty gửi ^[[1~^[[4~. Có một tùy chọn để thay đổi phím Home/End từ chế độ tiêu chuẩn sang chế độ rxvt và điều đó dường như khắc phục phím Home chứ không phải phím Kết thúc (hiện gửi ^[Ow). Đoán đó là thời gian nộp báo cáo lỗi ở đâu đó ... :-)

13

Trên hộp thoại cấu hình PuTTY, đi đến kết nối -> Dữ liệu và kiểu linux vào ga-type chuỗi trước khi kết nối.

+0

Đó là một! – lewis4u

2

câu trả lời thích hợp nên được di chuyển trên tất cả các phân cách (không cần thiết tất cả các phiên bản zsh, ymmv tại đây) là sử dụng tiện ích trợ giúp zkbd từ zkbd.

Keyboard Definition
Các số lượng lớn các kết hợp có thể có của bàn phím, máy trạm, thiết bị đầu cuối, giả lập, và các hệ thống cửa sổ làm cho nó không thể cho zsh đã được xây dựng trong tổ hợp phím cho mọi tình huống. Tiện ích zkbd, được tìm thấy trong hàm/Misc, có thể giúp bạn nhanh chóng tạo các ràng buộc chính cho cấu hình của bạn.

Run zkbd hoặc như là một chức năng tự động nạp, hoặc như một kịch bản shell:

zsh -f ~/zsh-4.3.17/Functions/Misc/zkbd 

Khi bạn chạy zkbd, nó lần đầu tiên yêu cầu bạn nhập loại thiết bị đầu cuối của bạn; nếu mặc định nó cung cấp là chính xác, chỉ cần nhấn trở lại. Sau đó nó sẽ yêu cầu bạn nhấn một số phím khác nhau để xác định các đặc điểm của bàn phím và thiết bị đầu cuối của bạn; zkbd cảnh báo bạn nếu nó tìm thấy bất kỳ thứ gì ngoài thông thường, chẳng hạn như phím Delete không gửi^H cũng không^?.

Các tổ hợp phím được đọc bởi zkbd được ghi lại dưới dạng định nghĩa cho mảng kết hợp có tên là khóa, được ghi vào tệp trong thư mục con .zkbd bên trong thư mục HOME hoặc ZDOTDIR của bạn. Tên của tệp được tạo từ các tham số TERM, VENDOR và OSTYPE , được nối bởi dấu gạch nối.

Bạn có thể đọc tệp này vào tệp .zshrc hoặc tệp khởi động khác với source' or. ' lệnh, sau đó tham khảo các thông số quan trọng trong lệnh bindkey, như thế này:

  source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE 
      [[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char 
      [[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char 
      # etc. 

Lưu ý rằng để cho `autoload zkbd' để làm việc, các tập tin zkdb phải nằm trong một trong những thư mục có tên trong bạn mảng fpath (xem zshparam (1)).Điều này đã được các trường hợp nếu bạn có một cài đặt zsh tiêu chuẩn; nếu không, sao chép hàm/Misc/zkbd vào một thư mục thích hợp.

thấy man -P "less -p 'keyboard definition'" zshcontrib, hoặc tìm kiếm meta-manpage zshall

5

này đang làm việc cho tôi

bindkey -v 

bindkey '\eOH' beginning-of-line 
bindkey '\eOF' end-of-line 
+0

Đó là mớ hỗn độn (loại). Bây giờ thay vì một dấu ngã, đó là viết hoa và hạ thấp chữ cái của tôi. – Jonathan

Các vấn đề liên quan