Сделать заглавными первую букву каждого слова в выделении с помощью vim


83

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

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

hello world from stackoverflow

к

Hello World From Stackoverflow

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


1
Также можно сделать с помощью sed
jpaugh 08

Ответы:


173

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

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

4
Большое спасибо, особенно за объяснение каждой детали!
keelar

Мне просто нужно было сделать это и использовать макрос, который я повторил, и я знал, что должен быть какой-то лучший способ, но я никогда не думал о регулярном выражении. Это замечательно. Благодарю.
Исаак Некиттепас

4
сделать это во всем файле%s/\<./\u&/g
Габриэль Борхес Оливейра

51

: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
Для меня это был самый интересный ответ. Я никогда не видел самого волшебного режима. Я думал, что задокументирую ответ после того, как понял ответ.
Грег

Кроме того, этот ответ обрабатывает все строки в нижнем, верхнем регистре или строки со смешанным регистром.
Грег

этот ответ - MVP
Новая Александрия

12

Vim Tips Wiki имеет отображение TwiddleCase, которое переключает визуальное выделение на нижний регистр, ВЕРХНИЙ регистр и регистр заголовков.

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


2

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

s/ \w/ \u&/g

Мне понравился ответ с использованием символа, &но он не работает, если ваша строковая строка имеет смешанный регистр для начала или все в верхнем регистре для начала.
Грег

2

Вариант 1. - Это сопоставление сопоставляет клавишуqс заглавной буквой в позиции курсора, а затем она перемещается в начало следующего слова:

: map q gUlw

Чтобы использовать это, поместите курсор в начало строки и нажмите qодин раз для каждого слова, чтобы сделать первую букву заглавной. Если вы хотите оставить первую букву такой, какая она есть, wвместо этого нажмите, чтобы перейти к следующему слову.

Вариант 2. - Это сопоставление отображает клавишу,qчтобы инвертировать регистр буквы в позиции курсора, а затем он перемещается в начало следующего слова:

:map q ~w

Чтобы использовать это, поместите курсор в начало строки, нажимая qодин раз для каждого слова, чтобы инвертировать регистр первой буквы. Если вы хотите оставить первую букву такой, какая она есть, wвместо этого нажмите, чтобы перейти к следующему слову.

Отключить отображение. - Чтобы отменить отображение (удалить) сопоставление, назначенноеqклавише:

:unmap q

Почему отображение, а не фактический макрос? qq~wqи воспроизвести с @qпоследующим @@?
Д. Бен Нобл,


0

Чтобы ограничить модификацию визуальным выбором, мы должны использовать что-то вроде:

:'<,'>s/\%V\<.\%V/\u&/g

\%V ............... see help for this
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.