Изменение стиля курсора в зависимости от режима как в zsh, так и в vim

Попробуйте tar -tvf .tar.gz (:

6
24.03.2018, 22:32
5 ответов

Думаю, лучше использовать precmd()вместоpreexec():

#.zshrc

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

precmd_functions+=(_fix_cursor)

Сюда:

  • менять не надо.vimrc
  • Курсор исправлен также при создании новой подсказки без выполнения команды
  • вам не нужно дважды писать echo -ne '\e[5 q'в .zshrc.
15
27.01.2020, 20:27

Я нашел решение:

Я положил это в~/.vimrc:

autocmd VimEnter * silent exec "! echo -ne '\e[1 q'"
autocmd VimLeave * silent exec "! echo -ne '\e[5 q'" 
2
27.01.2020, 20:27

Вы также можете использоватьzle-line-init()

zle-line-init() {
    zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere)
    echo -ne "\e[5 q"
}

Я думаю, что эту проблему лучше решить с помощью этого, а не precmd()или preexec(), поскольку оба предназначены для использования для выполнения команд, а не для исправления подсказки.

0
27.01.2020, 20:27

У меня работает следующий скрипт. Он меняет курсор каждый раз после запуска/выхода из программы.

function _set_cursor() {
    if [[ $TMUX = '' ]]; then
      echo -ne $1
    else
      echo -ne "\ePtmux;\e\e$1\e\\"
    fi
}

# Remove mode switching delay.
KEYTIMEOUT=5

function _set_block_cursor() { _set_cursor '\e[2 q' }
function _set_beam_cursor() { _set_cursor '\e[0 q' }

function zle-keymap-select {
  if [[ ${KEYMAP} == vicmd ]] || [[ $1 = 'block' ]]; then
      _set_block_cursor
  else
      _set_beam_cursor
  fi
}
zle -N zle-keymap-select
# ensure beam cursor when starting new terminal
precmd_functions+=(_set_beam_cursor) #
# ensure insert mode and beam cursor when exiting vim
zle-line-init() { zle -K viins; _set_beam_cursor }
zle-line-finish() { _set_block_cursor }
zle -N zle-line-finish
0
15.06.2020, 21:57

У меня это отлично работает, взято отсюда:https://gist.github.com/LukeSmithxyz/e62f26e55ea8b0ed41a65912fbebbe52

# vi mode
bindkey -v
export KEYTIMEOUT=1

# 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
zle-line-init() {
    zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere)
    echo -ne "\e[5 q"
}
zle -N zle-line-init
echo -ne '\e[5 q' # Use beam shape cursor on startup.
preexec() { echo -ne '\e[5 q' ;} # Use beam shape cursor for each new prompt.

Вы можете настроить тип курсора, который вы хотите (мигать или нет, |, прямоугольник или _), изменяя числа в следующей последовательности\e[5 q(5 для луча, 1 для блока )как следует:

Set cursor style (DECSCUSR), VT520.
0  ⇒  blinking block.
1  ⇒  blinking block (default).
2  ⇒  steady block.
3  ⇒  blinking underline.
4  ⇒  steady underline.
5  ⇒  blinking bar, xterm.
6  ⇒  steady bar, xterm.
3
12.10.2020, 21:53

Теги

Похожие вопросы