Використовуйте vim з великої літери кожного слова у виділенні


83

У vim я знаю, що ми можемо використовувати ~великі літери одним символом (як згадано у цьому питанні ), але чи є спосіб прописувати першу літеру кожного слова у виділенні за допомогою vim?

Наприклад, якщо я хотів би змінити з

hello world from stackoverflow

до

Hello World From Stackoverflow

Як мені це зробити у vim?


1
Це також можна зробити з sed
jpaugh

Відповіді:


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
New Alexandria

12

Вікі Vim Tips має відображення TwiddleCase, яке перемикає візуальний вибір на нижній регістр, верхній регістр та регістр заголовка.

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


2

Спробуйте цей регулярний вираз ..

s/ \w/ \u&/g

Мені сподобалась відповідь із використанням, &але це не спрацює, якщо рядок рядка має змішаний регістр для початку або для початку всі великі регістри.
Грег

2

Варіант 1. - Це відображення відображає ключqдля написання великої літери в позиції курсора, а потім переміщується до початку наступного слова:

: карта 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.