Виджеты для манипулирования регистром: `gU` в обычном режиме и`U` в визуальном режиме

Я считаю, что уже есть виджет для g~ действие в зле. Так g~iw инвертирует регистр слова.

Я прочитал руководство zshzle и не нашел виджет, который дал бы мне поведение gU (капитализировать действие) в Vim.

например: для слова "path_variable", с курсором на v, gUiW изменил бы мир на "PATH_VARIABLE", и так далее, и так далее.

виджет capitalize-word не кажется ответом. Я проверял это.

Я также обнаружил, что ключ U в визуальном режиме не используется заглавный текст / регион. Я не нашел в руководстве виджета, который бы дал мне желаемое поведение.

Это вопрос написания пользовательского виджета, или нужно будет отправить апстрим с изменениями кода c? Как я могу связать gU в норме и U в визуальном режиме для достижения желаемого поведения в zle vi-mode?

1 ответ

Решение

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
Другие вопросы по тегам