Ssh

zsh-cursor 在 ssh 上的位移

  • February 13, 2021

我在本地執行 Arch Linux。當我通過 連接到我的遠端 Debian 10 伺服器時ssh,游標的行為很尷尬:

只要每個命令都返回狀態碼 0,一切都很好。當返回另一個程式碼時,游標和右側提示向左移動 2 個字元,如下圖所示。第一個提示正常,按Ctrl+C後第二個:

----|---------------------------------
~ »                    user@hostname
--|-----------------------------------
~ »            130 ↵ user@hostname

之後我手動更改了破折號線以顯示游標所在的位置:在|. »當我開始輸入命令時,我實際上是在覆蓋。

然後,當我嘗試使用歷史記錄中的命令並對其進行更改時,我將其更改為與螢幕上顯示的字元不同的字元,這非常令人困惑和煩人。

在下一個返回狀態碼 0 的命令之後,游標又恢復正常了。

這似乎發生在終端上(我在控制台中嘗試過並使用 Alacritty 和 URXVT)。

我正在使用“af-magic” - 主題。當我切換到另一個不顯示狀態程式碼的主題時,問題就消失了。但對於其他顯示狀態碼的主題(例如“smt”)也是如此。所以關於狀態碼顯示的某些東西似乎是導致問題的原因。

.zshrc的本地和遠端都是一樣的。在本地,我沒有這個問題。

HISTSIZE=1000000
SAVEHIST=1000000
HISTFILE=~/.cache/zsh/history

## oh my zsh
export ZSH="$HOME/.config/zsh/oh-my-zsh"

ZSH_THEME="af-magic"

plugins=(
 git vi-mode zsh-autosuggestions history-substring-search
)

ZSH_DISABLE_COMPFIX="true"
source $ZSH/oh-my-zsh.sh

## Load aliases
[ -f "${XDG_CONFIG_HOME:-$HOME/.config}/shell/aliasrc" ] && source "${XDG_CONFIG_HOME:-$HOME/.config}/shell/aliasrc"

## vim mode config
# ---------------
bindkey -M vicmd 'k' history-substring-search-up
bindkey -M vicmd 'j' history-substring-search-down

# Activate vim mode.
bindkey -v

# autosuggest config
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=#3a3a3a"
bindkey '^ ' autosuggest-accept

# Remove mode switching delay.
KEYTIMEOUT=5

# Change cursor shape for different vi modes.
function zle-keymap-select {
 if [[ ${KEYMAP} == vicmd ]] ||
    [[ $1 = 'block' ]]; then
   echo -ne '\e[1 q'

 elif [[ ${KEYMAP} == main ]] ||
      [[ ${KEYMAP} == viins ]] ||
      [[ ${KEYMAP} = '' ]] ||
      [[ $1 = 'beam' ]]; then
   echo -ne '\e[5 q'
 fi
}
zle -N zle-keymap-select

_fix_cursor() {
  echo -ne '\e[5 q'
}
precmd_functions+=(_fix_cursor)

關於如何解決這個問題的任何提示?

locale的沒有設置。我現在設置它,它的工作原理!

引用自:https://unix.stackexchange.com/questions/633848