繁体   English   中英

根据 vi 模式更改交互式 IPython 控制台中的光标形状

[英]Changing the cursor shape in the interactive IPython consle depending on vi-mode

通过将以下内容添加到~/.ipython/profile_deafult/ipython_config.py ,我可以在交互式 IPython 控制台中从 emacs 更改为 vi 绑定:

c.TerminalInteractiveShell.editing_mode = 'vi'

目前,光标始终是 I 型梁 ( | )。 有没有一种方法可以让光标在 vi 的正常模式下将形状更改为块,然后在插入模式下返回到 I 型梁?


我的终端模拟器(终结器,基于 gnome-terminal)支持在光标格式之间切换,因为我可以通过将以下内容添加到我的~./zshrc来自 Unix SE )来启用 zsh 中的行为:

bindkey -v
# Remove delay when entering normal mode (vi)
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
# Start with beam shape cursor on zsh startup and after every command.
zle-line-init() { zle-keymap-select 'beam'}

根据GitHub 问题(和此更新中的此评论,您可以将以下代码段添加到~/.ipython/profile_default/ipython_config.py以在插入和正常模式之间切换时使光标改变形状。

import sys
from prompt_toolkit.key_binding.vi_state import InputMode, ViState


def get_input_mode(self):
    return self._input_mode


def set_input_mode(self, mode):
    shape = {InputMode.NAVIGATION: 1, InputMode.REPLACE: 3}.get(mode, 5)
    raw = u'\x1b[{} q'.format(shape)
    if hasattr(sys.stdout, '_cli'):
        out = sys.stdout._cli.output.write_raw
    else:
        out = sys.stdout.write
    out(raw)
    sys.stdout.flush()
    self._input_mode = mode


ViState._input_mode = InputMode.INSERT
ViState.input_mode = property(get_input_mode, set_input_mode)
c.TerminalInteractiveShell.editing_mode = 'vi'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM