用于大小写操作的小部件:普通模式下的 `gU` 和可视模式下的 `U`

widgets for case manipulation: `gU` in normal and `U` in visual mode

我估计 zle 中已经有一个用于 g~ 操作的小部件。所以 g~iw 会反转单词的大小写。

我阅读了 zshzle 手册,但没有找到可以在 vim 中为我提供 gU(大写操作)行为的小部件。

例如:对于单词"path_variable",当光标在v上时,gUiW 会将世界更改为"PATH_VARIABLE",依此类推。

小部件 capitalize-word 似乎不是答案。我已经测试过了。

我还发现在可视化模式下按键U并没有将可视化选中的text/region大写。我在手册中也没有找到可以给我所需行为的小部件。

这是编写自定义小部件的问题,还是必须向上游提交包含 C 代码更改的补丁?如何在正常模式下绑定 gU 并在可视模式下绑定 U 以在 zle vi 模式下实现所需的行为?

ZSH 5.3 将为此预构建小部件。但如果你等不及了,那就是:

# credits go to Oliver Kiddle <opk@zsh.org>,
# who personally shared these upper/lower widgets.
# I just corrected a small bug.
vi-lowercase() {
  local save_cut="$CUTBUFFER"
  local save_cur="$CURSOR"

  zle .vi-change || return
  zle .vi-cmd-mode

  CUTBUFFER="${CUTBUFFER:l}"

  if [[ $CURSOR = '0' ]]; then
    zle .vi-put-before -n 1
  else
    zle .vi-put-after -n 1
  fi

  CUTBUFFER="$save_cut" 
  CURSOR="$save_cur"
}

vi-uppercase() {
  local save_cut="$CUTBUFFER" 
  local save_cur="$CURSOR"

  zle .vi-change || return
  zle .vi-cmd-mode

  CUTBUFFER="${CUTBUFFER:u}"

  if [[ $CURSOR = '0' ]]; then
    zle .vi-put-before -n 1
  else
    zle .vi-put-after -n 1
  fi

  CUTBUFFER="$save_cut" 
  CURSOR="$save_cur"
}

# can safely disable this after commit zsh commit #a73ae70 (zsh-5.2-301-    ga73ae70)
zle -N vi-lowercase
zle -N vi-uppercase
bindkey -a 'gU' vi-uppercase
bindkey -a 'gu' vi-lowercase
bindkey -M visual 'u' vi-lowercase
bindkey -M visual 'U' vi-uppercase