Shell 检测Vi视觉模式的zsh键映射模式

Shell 检测Vi视觉模式的zsh键映射模式,shell,zsh,vi,prompt,Shell,Zsh,Vi,Prompt,Zsh使用zle功能检查提示符的状态 有一个KEYMAP变量,根据您使用的Vi模式,该变量应该保存某些值 它在INSERT和COMMAND模式下工作正常,但在VISUAL模式下我无法获得触发器 从Zsh手册: 18.2关键地图 ZLE中的键映射包含键序列和 ZLE命令。无法绑定空键序列 任何时候都可以有任意数量的关键点地图,并且每个关键点地图都有 一个或多个名称。如果删除了所有键映射的名称,则 消失了。bindkey可用于操纵键映射名称 最初,有八个关键地图: emacs emacs仿真 vii

Zsh使用
zle
功能检查提示符的状态

有一个
KEYMAP
变量,根据您使用的Vi模式,该变量应该保存某些值

它在
INSERT
COMMAND
模式下工作正常,但在
VISUAL
模式下我无法获得触发器

从Zsh手册:

18.2关键地图

ZLE中的键映射包含键序列和 ZLE命令。无法绑定空键序列

任何时候都可以有任意数量的关键点地图,并且每个关键点地图都有 一个或多个名称。如果删除了所有键映射的名称,则 消失了。bindkey可用于操纵键映射名称

最初,有八个关键地图:

emacs emacs仿真

viins vi仿真-插入模式

vicmd vi仿真-命令模式

viopp vi仿真-运算符挂起

可视化虚拟仪器仿真-选择激活

isearch增量搜索模式

命令读取命令名

.安全备用钥匙图

我尝试了以下方法:

function zle-keymap-select {
    echo $KEYMAP
}
zle -N zle-keymap-select

但是输出在
vicmd
main
之间不断变化,当我按
v
进入视觉模式时,没有输出。

确切地说,我可以理解您的担忧,如果您不介意使用插件,我认为下面的插件可以帮您大忙,此外,在vi模式等方面获得更好体验的额外好处

zsh vi模式:更好、更友好的zsh vi(vim)模式插件。

该插件提供了一个
ZVM_MODE
变量,用于检索当前vi模式并更好地显示指示器

目前支持以下模式:

ZVM_MODE_NORMAL
ZVM_MODE_INSERT
ZVM_MODE_VISUAL
ZVM_MODE_VISUAL_LINE
为了更新vi模式指示器,我们应该在选择vi模式命令后将命令添加到
zvm\u。例如:

安装此插件后

# The plugin will auto execute this `zvm_after_select_vi_mode` function
function zvm_after_select_vi_mode() {
  case $ZVM_MODE in
    $ZVM_MODE_NORMAL)
      # Something you want to do...
      ;;
    $ZVM_MODE_INSERT)
      # Something you want to do...
      ;;
    $ZVM_MODE_VISUAL)
      # Something you want to do...
      ;;
    $ZVM_MODE_VISUAL_LINE)
      # Something you want to do...
      ;;
  esac
}
以下是一个例子:


确切地说,我可以理解您的担忧,如果您不介意使用插件,我认为下面的插件可以非常完美地帮助您,还可以在vi模式下获得更好的体验,等等

zsh vi模式:更好、更友好的zsh vi(vim)模式插件。

该插件提供了一个
ZVM_MODE
变量,用于检索当前vi模式并更好地显示指示器

目前支持以下模式:

ZVM_MODE_NORMAL
ZVM_MODE_INSERT
ZVM_MODE_VISUAL
ZVM_MODE_VISUAL_LINE
为了更新vi模式指示器,我们应该在选择vi模式命令后将命令添加到
zvm\u。例如:

安装此插件后

# The plugin will auto execute this `zvm_after_select_vi_mode` function
function zvm_after_select_vi_mode() {
  case $ZVM_MODE in
    $ZVM_MODE_NORMAL)
      # Something you want to do...
      ;;
    $ZVM_MODE_INSERT)
      # Something you want to do...
      ;;
    $ZVM_MODE_VISUAL)
      # Something you want to do...
      ;;
    $ZVM_MODE_VISUAL_LINE)
      # Something you want to do...
      ;;
  esac
}
以下是一个例子:


在zsh中,视觉模式不是单一状态:它是由设置的标记、激活的区域和vi命令模式的组合定义的。您可以使用自定义小部件或emacs小部件单独更改这些状态。viopp和visual仅用作本地键映射,vicmd保留选定的键映射。这意味着您不需要在三个键映射中重复许多vi风格的绑定:vicmd中的绑定是共享的,请注意,与vicmd相比,visual和viopp包含的绑定是多么少。但这也意味着它们从未被选中触发回调。我用它来获取一个名为vivis的可视模式键映射。在zsh中,可视模式不是一个单一的状态:它是由设置的标记、活动的区域和vi命令模式的组合定义的。您可以使用自定义小部件或emacs小部件单独更改这些状态。viopp和visual仅用作本地键映射,vicmd保留选定的键映射。这意味着您不需要在三个键映射中重复许多vi风格的绑定:vicmd中的绑定是共享的,请注意,与vicmd相比,visual和viopp包含的绑定是多么少。但这也意味着它们从未被选中触发回调。我用它来获取一个名为vivis的可视模式键映射。可能就是你想要的。