vim을 사용하여 선택한 각 단어의 첫 글자를 대문자로 표시


83

vim에서 ~단일 문자를 대문자로 사용할 수 있다는 것을 알고 있지만 ( 이 질문 에서 언급했듯이 ) vim을 사용하여 선택 항목에서 각 단어의 첫 글자를 대문자로 표시하는 방법이 있습니까?

예를 들어, 다음에서 변경하려면

hello world from stackoverflow

...에

Hello World From Stackoverflow

vim에서 어떻게해야합니까?


1
또한 함께 할 수 나오지도
jpaugh

답변:


173

다음 대체를 사용할 수 있습니다.

s/\<./\u&/g
  • \< 단어의 시작과 일치
  • . 단어의 첫 문자와 일치
  • \u Vim에게 대체 문자열에서 다음 문자를 대문자로 지정합니다. (&)
  • & LHS에서 일치하는 항목을 대체하는 것을 의미합니다.

4
특히 모든 세부 사항을 설명해 주셔서 감사합니다!
keelar

이 작업을 수행하고 과도하게 반복 한 매크로를 사용했고 더 나은 방법이 있어야한다는 것을 알고 있었지만 정규식을 사용하지는 않았습니다. 이것은 훌륭합니다. 감사.
Isaac Nequittepas

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
이것은 나에게 가장 흥미로운 대답이었습니다. 마법 모드는 본 적이 없습니다. 나는 답을 이해 한 후에 답을 문서화 할 것이라고 생각했습니다.
Greg

또한이 답변은 모든 소문자, 모두 대문자 또는 대소 문자 혼합 문자열을 처리합니다.
Greg

이 대답은 MVP
New Alexandria

12

Vim Tips Wiki에는 시각적 선택을 소문자, 대문자 및 제목 케이스로 전환 하는 TwiddleCase 매핑 이 있습니다.

TwiddleCase함수를 추가하면 .vimrc원하는 텍스트를 시각적으로 선택하고 물결표 문자 ~를 눌러 각 케이스를 순환합니다.


2

이 정규식을 사용해보십시오 ..

s/ \w/ \u&/g

나는의 사용에 대한 대답을 좋아 &했지만 문자열 문자열이 대문자로 시작하거나 모두 대문자로 시작하면 작동하지 않습니다.
Greg

2

옵션 1- 이 매핑은 키q를매핑하여 커서 위치의 문자를 대문자로 표시 한 다음 다음 단어의 시작 부분으로 이동합니다.

:지도 q gUlw

이를 사용하려면 줄의 시작 부분에 커서를 놓고 q각 단어에 대해 한 번 눌러 첫 글자를 대문자로 만듭니다. 첫 글자를 그대로 두려면 w대신을 눌러 다음 단어로 이동하십시오.

옵션 2-이 매핑q은 커서 위치에있는 문자의 대소 문자를 반전하도록 키를매핑한 다음 다음 단어의 시작 부분으로 이동합니다.

:map q ~w

이를 사용하려면 q첫 글자의 대소 문자를 반전하기 위해 각 단어에 대해 한 번씩 히트 한 줄의 시작 부분에 커서를 놓습니다 . 첫 글자를 그대로 두려면 w대신을 눌러 다음 단어로 이동하십시오.

매핑을 해제합니다. -q 키에할당 된 매핑을 매핑 해제 (삭제)하려면:

:unmap q

왜 실제 매크로가 아닌 매핑입니까? qq~wq그리고 @q뒤에 @@?
D. Ben Knoble


0

수정을 시각적 선택으로 제한하려면 다음과 같이 사용해야합니다.

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

\%V ............... see help for this
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.