2008-10-02 29 views
26

我在Ubuntu盒子上運行zsh作爲默認shell,並且使用gnome-terminal(據我所知它模擬xterm),一切正常。當我通過ssh和putty(它也模擬xterm)從windows窗口登錄時,突然間home/end鍵不再起作用。zsh中的主頁/結束鍵不能與putty配合使用

我已經能夠解決這些行添加到我的zshrc文件...

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

...但我仍然不知道什麼是錯在這裏。任何想法?

+0

感謝上述綁定。現在在SecurtCRT爲我工作 – MikeRoger 2015-02-17 17:12:07

回答

54

,我發現這是一個組合:

一個

zsh的開發商並不認爲ZSH應該定義的行爲主頁結束,刪除,...鍵。

Debian和Ubuntu通過定義普通用戶在全球/etc/zsh/zshrc文件中預期的常規操作來解決此問題。繼相關的代碼(這是Debian和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 

所以,如果你要連接到一個Debian或Ubuntu中,你不必做任何事情。一切都應該自動工作(如果沒有,見下文)。

但是...如果您連接到另一個盒子(例如FreeBSD),則可能沒有用戶友好的默認設置zshrc。該解決方案當然是將Debian/Ubuntu zshrc中的行添加到您自己的.zshrc

兩個

修補劑發送xterm作爲終端類型到遠程主機。但是在某處發生混亂,並且不會發送正確的控制代碼主頁,結束,......人們期望從xterm。或者一個xterm終端預計不會發送那些或任何...(刪除密鑰確實在xterm工作,但是,如果您在ZSH配置它)。另請注意,您的Numpad鍵在Vim中有趣,例如xterm終端。

解決方案是配置膩子發送另一種終端類型。我試過xterm-colorlinuxxterm-color固定主頁/結束的問題,但數字鍵盤仍然有趣。將其設置爲linux可以解決這兩個問題。

您可以在連接 - >數據下在Putty中設置終端類型。不要試圖設置你的終端類型.zshrcexport TERM=linux,這是錯誤的。終端類型應由您的終端應用程序指定。因此,例如,如果您使用Mac機箱與Mac SSH客戶端連接,則可以設置它自己的終端類型。

請注意,TERM指定您的終端類型,並且與您要連接的主機無關。我可以在Putty中將我的終端類型設置爲linux,並且可以毫無問題地連接到FreeBSD服務器。

因此,解決這兩個這些事情,你應該罰款:)

+3

解決有趣的小鍵盤行爲的另一種方法是:打開會話設置,進入終端 - >功能,並選中標記爲「禁用應用程序鍵盤模式」的框。看到這裏:http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-appkeypad – exhuma 2010-04-05 09:36:09

+1

我不得不添加``vi-beginning-of-line``和``vi-行尾綁定到viins模式以及完全解決我的問題與zsh +膩子。現在它可以工作。 – 2011-12-01 20:16:22

+0

我沒有成功使用@hopla粘貼的.zshrc代碼。所以我不得不在下面的zsh wiki頁面上使用這個解決方案[http://zshwiki.org/home/zle/bindkeys](http://zshwiki.org/home/zle/bindkeys) terminfo []加上hopla的關於將終端類型設置爲「linux」的解決方案。 ZSH維基頁面說基本相同,但沒有傳遞給bindkey的「-M ...」選項。這隻適用於我的「vi」bindkey模式。 – 2012-02-15 02:31:24

0

這些綁定似乎不是在emacs模式下設置的默認綁定的一部分。

在運行「bindkey -e」後,在默認的zsh安裝中執行「where-is-beginning-of-line」顯示它僅綁定到^ a。也許你應該問zsh開發者爲什麼:-)

+0

默認的ubuntu安裝將它們綁定到全局zshrc文件中,但據我所見,綁定對於膩子不起作用。 – agnul 2008-10-02 13:01:26

3

這似乎是一個膩子的東西。 Gnome-terminal分別爲Home和End發送代碼^[OH^[OF,而膩子發送^[[1~^[[4~。在putty中有一個選項可將標準的模式的Home/End鍵從改變爲rxvt模式,並且這似乎修復了Home鍵,但沒有End鍵(現在發送^[Ow)。猜猜它的時間來提交某處的bug報告... :-)

13

在膩子配置對話框,進入連接 - >數據和類型Linux的到連接前的終端類型的字符串。

2

適當的答案應該是可跨所有發行版(不necessarly zsh中的所有版本雖然因人而異這裏)是使用zkbd輔助工具從zkbd。

鍵盤定義
的大量的鍵盤,工作站,終端,仿真器和視窗系統的可能的組合使得它不可能zsh來已經內置了對各種情況下的鍵綁定。在函數/雜項中找到的zkbd實用程序可以幫助您快速創建用於配置的鍵綁定。

運行zkbd無論是作爲一個自動裝載功能,或作爲一個shell腳本:

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

當你運行zkbd,它首先要求您輸入您的終端類型;如果它提供的默認值是正確的,只需按回車即可。然後它會要求您按多個不同的鍵來確定鍵盤和終端的特性;如果它發現任何不尋常的東西,例如發送既不^ ^也不^ ^的刪除鍵,zkbd會警告你 。

zkbd讀取的擊鍵記錄爲名爲key的關聯數組的定義,寫入到您的HOME或ZDOTDIR目錄中的子目錄.zkbd中的文件中。文件的名稱由TERM,VENDOR和OSTYPE 參數組成,並用連字符連接起來。

您可以將此文件讀入您​​的.zshrc文件或另一個啓動文件中,其中包含source' or。'命令,然後引用關鍵參數bindkey命令,就像這樣:

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

注意,爲了讓`自動加載zkbd」工作,zkdb文件必須在指定的目錄中你fpath數組(請參閱zshparam(1))。如果你有一個標準的zsh安裝,這應該已經是這種情況了;如果不是,則將Functions/Misc/zkbd複製到適當的目錄。

看到man -P "less -p 'keyboard definition'" zshcontrib,或搜索的元手冊頁zshall

5

這是爲我工作

bindkey -v 

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