代码之家  ›  专栏  ›  技术社区  ›  agnul

zsh中的主/末端键不适用于油灰

  •  31
  • agnul  · 技术社区  · 16 年前

    我将zsh作为Ubuntu盒上的默认shell运行,并且使用gnome终端(据我所知,它模拟xterm)一切正常。当我通过ssh和putty(也模拟xterm)从windows box登录时,home/end键突然不再工作。

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

    ……但我还是想知道这里出了什么问题。有什么想法吗?

    6 回复  |  直到 15 年前
        1
  •  79
  •   Pit    9 年前

    我发现这是一个组合:

    , 终止 德尔 , ... 钥匙。

    Debian和Ubuntu通过定义普通用户在全局环境中期望的正常操作来解决这个问题 /etc/zsh/zshrc

    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 zshrc 你自己的 .zshrc .

    油灰发送 xterm 作为远程主机的终端类型。但是在某个地方出了问题,并且没有发送正确的控制代码 , 克斯特姆 . 或 终端不希望发送这些或任何东西。。。( 德尔 钥匙在你的房间里起作用 克斯特姆 但是,如果您在ZSH中配置它)。还请注意,在Vim中,Numpad键的行为很有趣,例如 克斯特姆

    解决方案是将Putty配置为发送另一种终端类型。我试过了 xterm-color linux . xterm颜色 / 终止 linux

    zshrc先生 具有 export TERM=linux

    请注意,该术语指定了终端类型,与要连接的主机无关。我可以将终端类型设置为 linux

    所以,解决这两个问题,你应该会很好:)

        2
  •  19
  •   Adam Pierce    15 年前

    在PuTTY配置对话框中,转到连接->数据和类型 linux 在连接之前,输入终端类型字符串。

        3
  •  7
  •   Rene    10 年前

    bindkey -v
    
    bindkey '\eOH'  beginning-of-line
    bindkey '\eOF'  end-of-line
    
        4
  •  6
  •   Trolzen Josh McGee    3 年前

    适当的答案,应该是可移植的 全部的 发行版(不一定是所有版本的zsh,这里是ymmv)使用来自zkbd的zkbd帮助工具。

    键盘定义
    键盘、工作站、终端、仿真器和窗口系统的大量可能组合使得zsh不可能在任何情况下都具有内置键绑定。可以在Functions/Misc中找到zkbd实用程序,它可以帮助您快速为配置创建键绑定。

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

    当您运行zkbd时,它首先要求您输入终端类型;如果它提供的默认值正确,只需按return。然后,它要求您按多个不同的键来确定键盘和终端的特征;zkbd警告您 如果它发现任何异常,例如既不发送^H也不发送^H的删除键?。

    zkbd读取的击键被记录为名为key的关联数组的定义,并写入HOME或ZDOTDIR目录下.zkbd子目录中的文件。文件名由术语、供应商和OSTYPE组成 参数,由连字符连接。

    您可以将此文件读入.zshrc或另一个启动文件中 source . 命令,然后引用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.
    

    请注意,为了 autoload zkbd 为了工作 zkbd 文件必须位于fpath数组中命名的目录之一(请参见zshparam(1))。如果您有标准的zsh安装,则应该已经是这种情况;如果不是,则将Functions/Misc/zkbd复制到适当的目录。

    看见 man -P "less -p 'keyboard definition'" zshcontrib ,或搜索元手册页 zshall

        5
  •  5
  •   Zenexer    5 年前

    这个问题首次发布至今已经将近11年了。当时,一些发行版确实附带了 putty TERM xterm putty-256color

    1. 确保主机有一个terminfo条目用于 腻子-256颜色 toe -a | grep -F putty
    2. 撤销任何可能使PuTTY与zsh或其他程序正常工作的黑客攻击。
    3. 确保腻子是最新的。当更新可用时,它不会通知您,如果更新过期,您可能会遇到许多相同的问题。您可能希望通过以下方式自动使其保持最新 Chocolatey
    4. 腻子-256颜色 .
    5. 在相同的配置屏幕上,添加一个新的环境变量以启用24位颜色。这个变量不是标准化的,但它是由许多其他主流终端仿真器(如iTerm2)发送的,许多程序都能理解它。
      1. 变量: COLORTERM
      2. 价值: truecolor
    6. 在撰写本文时,我还没有找到默认情况下通过SSH接受COLORTERM变量的发行版。您需要在主机上编辑OpenSSH配置以允许它。例如,在类似Debian的发行版上,编辑 /etc/ssh/sshd_config 色项 AcceptEnv
      1. 确保在进行更改后重新连接,或至少运行 exec zsh 更换后 学期 . zsh不会对环境的变化做出反应 学期 当它运行时。
      2. 学期 实际设置为您想要的: echo $TERM
      3. 你在用什么 screen tmux TERM=tmux-256color . 在屏幕内,尝试 TERM=screen-256color .
      4. 你有最新版本的腻子吗?
      5. 在尝试terminfo修复之前,是否已更改各种PuTTY设置以尝试修复问题?您可能需要重置这些设置。
        6
  •  3
  •   agnul    16 年前

    这似乎是一个油灰的东西。Gnome终端发送代码 ^[OH ^[OF 分别用于首页和尾页,而腻子发送 ^[[1~ ^[[4~ 标准 模式到 终端窗口 模式,这似乎修复了Home键,但没有修复End键(现在发送 ^[Ow ).我想是时候在某处提交错误报告了…:-)

        7
  •  0
  •   Sec    16 年前

    这些绑定似乎不是emacs模式下设置的默认绑定的一部分。