Подтвердить что ты не робот

Заглавная буква каждого слова в выборе с помощью vim

В vim, я знаю, мы можем использовать ~ для использования одного char (как упоминалось в этом вопросе), но есть ли способ капитализировать первая буква каждого слова в выборе с помощью vim?

Например, если я хочу изменить

hello world from stackoverflow

к

hello world from stackoverflow

Как мне это сделать в vim?

4b9b3361

Ответ 1

Вы можете использовать следующую подстановку:

s/\<./\u&/g
  • \< соответствует началу слова
  • . соответствует первому символу слова
  • \u сообщает Vim о нижнем регистре следующего символа в строке подстановки (&)
  • & означает замену того, что соответствовало LHS

Ответ 2

:help case говорит:

To turn one line into title caps, make every first letter of a word
uppercase: >
    : s/\v<(.)(\w*)/\u\1\L\2/g

Пояснение:

:                      # Enter ex command line mode.

space                  # The space after the colon means that there is no
                       # address range i.e. line,line or % for entire
                       # file.

s/pattern/result/g     # The overall search and replace command uses
                       # forward slashes.  The g means to apply the
                       # change to every thing on the line. If there
                       # g is missing, then change just the first match
                       # is changed.

Эта часть шаблона имеет этот смысл.

\v                     # Means to enter very magic mode.
<                      # Find the beginning of a word boundary.
(.)                    # The first () construct is a capture group. 
                       # Inside the () a single ., dot, means match any
                       #  character.
(\w*)                  # The second () capture group contains \w*. This
                       # means find one or more word caracters. \w* is
                       # shorthand for [a-zA-Z0-9_].

Результат или часть замены имеет это значение:

\u                     # Means to uppercase the following character.
\1                     # Each () capture group is assigned a number
                       # from 1 to 9. \1 or back slash one says use what
                       # I captured in the first capture group.
\L                     # Means to lowercase all the following characters.
\2                     # Use the second capture group

Результат:

ROPER STATE PARK
Roper State Park  

Альтернативой очень волшебному режиму:

    : % s/\<\(.\)\(\w*\)/\u\1\L\2/g
    # Each capture group requires a backslash to enable their meta
    # character meaning i.e. "\(\)" verses "()".

Ответ 3

Wim Tips Wiki имеет отображение TwiddleCase, которое переключает визуальный выбор на нижний регистр, верхний регистр и заголовок.

Если вы добавили функцию TwiddleCase к вашему .vimrc, тогда вы просто визуально выбираете нужный текст и нажимаете символ тильды ~ для циклического перехода по каждому случаю.

Ответ 4

Попробуйте это регулярное выражение..

s/ \w/ \u&/g

Ответ 5

Существует также очень полезный vim-titlecase плагин для этого.