AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 433273
Accepted
maddingl
maddingl
Asked: 2018-03-25 07:15:04 +0800 CST2018-03-25 07:15:04 +0800 CST 2018-03-25 07:15:04 +0800 CST

在 zsh 和 vim 中根据模式更改光标样式

  • 772

我在oh-my-zsh中使用vi-mode和af-magic主题。

我希望光标样式指示我是处于正常模式(块)还是插入模式(光束),无论是 inzsh还是 in vim。

这是我到目前为止所拥有的:

在我的~/.zshrc:

    # vim mode config
    # ---------------

    # Activate vim mode.
    bindkey -v

    # 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

    # Use beam shape cursor on startup.
    echo -ne '\e[5 q'

    # Use beam shape cursor for each new prompt.
    preexec() {
       echo -ne '\e[5 q'
    }

如发现here。

在vim中,我使用Vundle和总站。

使用这些配置,当独立考虑时,两者都可以正常工作zsh。vim但是,当我vim从插入模式zsh进入时,以正常模式开始(应该如此),但仍显示光束形状光标。同样,当我退出时,我回到插入模式,但光标仍然是块状(因为最后一个模式是正常的)。vimvimzshvim

在此之后,当我第一次切换模式(在zsh和中vim)时,光标再次按照应有的方式运行。

如何让它们在进入和退出后也显示正确的光标vim?

我试着把

    autocmd VimEnter * stopinsert
    autocmd VimLeave * startinsert

在我的~.vimrc,但这不会影响光标。

zsh vim
  • 6 6 个回答
  • 16383 Views

6 个回答

  • Voted
  1. Best Answer
    Pawel Wiejacha
    2019-01-27T05:25:43+08:002019-01-27T05:25:43+08:00

    我认为最好使用precmd()而不是preexec():

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

    这边走:

    • 你不必改变.vimrc
    • 当您在不执行命令的情况下创建新提示时,光标也已修复
    • 你不必echo -ne '\e[5 q'在你的.zshrc.
    • 18
  2. Cornelius Roemer
    2020-10-13T13:53:43+08:002020-10-13T13:53:43+08:00

    这对我来说非常有效,它取自这里: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.
    
    • 6
  3. Tera
    2021-12-27T12:21:17+08:002021-12-27T12:21:17+08:00

    只需添加以下行:

    export VI_MODE_SET_CURSOR=true
    

    到你的~/.zshrc. 在issue #9570的讨论中提到了它。

    • 3
  4. maddingl
    2018-03-25T12:28:32+08:002018-03-25T12:28:32+08:00

    我找到了一个解决方案:

    我把这个放在我的~/.vimrc:

    autocmd VimEnter * silent exec "! echo -ne '\e[1 q'"
    autocmd VimLeave * silent exec "! echo -ne '\e[5 q'" 
    
    • 2
  5. Rickyson
    2019-02-12T17:22:43+08:002019-02-12T17:22:43+08:00

    你也可以使用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
  6. serge
    2020-06-16T13:57:20+08:002020-06-16T13:57:20+08:00

    以下脚本适用于我。每次启动/退出程序后都会更改光标。

    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

相关问题

  • 什么情况下路径中最先找到的可执行文件不会被使用

  • 符号链接所有点文件和目录

  • 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _

  • 如何在`zsh`中增加一个动态命名的变量

  • 为什么我不能在 zsh 中定义一个名为 path 的只读变量?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve