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

Кажется, в zle уже есть виджет для действия g~. Итак, g~iw инвертирует регистр слова.

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

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

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

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

Является ли это вопросом написания пользовательского виджета или нужно будет отправить патч вверх по течению с изменениями кода c? Как я могу связать gU в обычном режиме и U в визуальном режиме, чтобы добиться желаемого поведения в zle vi-режиме?


person ninrod    schedule 21.06.2016    source источник


Ответы (1)


ZSH 5.3 будет иметь встроенные виджеты для этого. Но если не терпится, вот:

# credits go to Oliver Kiddle <[email protected]>,
# 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
person ninrod    schedule 07.10.2016