매크로에서 단어를 camelCase로 어떻게 변환 할 수 있습니까?


14

다음과 같은 단어 목록이 있습니다.

these are
some
words that I want
to convert to
camel case

나는, 예를 들어, 설정하는 방법을 필요 camel case로camelCase 매크로 (또는 시각적 줄 선택의 모든 줄을 낙타 경우로 바꾸는 방법).

wgUlhx필요한만큼 여러 번 사용할 수 있지만 문제는 길이가 다양한 단어에 대해서는 작동하지 않는다는 wgUlhxwgUlhx것 convert this please입니다.convert these pretty please ).

위의 라인에 대한 원하는 출력은

theseAre
some
wordsThatIWant
toConvertTo
camelCase

이것을 자동화하는 방법이 있습니까?

답변:


16

하나의 라이너

간단한 정규 표현식 대체를 찾았습니다 ( '매직'이 설정되어 있다고 가정).

:s/ \([a-zA-Z]\)/\u\1/g

공백 뒤에 하나의 문자와 일치하여 문자를 저장합니다. 그런 다음 줄의 모든 일치 항목에 대해 저장된 대문자로 된 대문자 ( \u= 대문자, \1= 첫 번째 저장된 일치)로 바꿉니다 .

와 %사이 에 넣어 전체 파일에 적용하십시오 .:s

이 솔루션의 단점은 라인 방식 (예제에서 작동 함)이지만 한 줄 내에서 많은 단어 중 낙타 사례 만 원한다면 부족합니다.

풀러 솔루션

map <leader>g~ :set opfunc=MyCamelCase<CR>g@
function! MyCamelCase(type, ...)
  let searchsave=@/
    silent s/\%>'\[ \([a-zA-Z]\)\%<']/\u\1/g
  let @/=searchsave
 endfunction

동작에서 작동 할 수있는 새 연산자를 만듭니다. <leader>as 가있는 경우 \다음 텍스트를 |커서로 지정하십시오.

This is some |example text to work with.

타이핑 \g~3w은

This is some exampleTextTo work with.

즉, 우리는 낙타가 3 단어 이상을 차지했습니다.

대체에 대한 설명 :

s/대체를 시작합니다.
\%>'\[조금 아 is니다. 는 \%>'m마크의 오른쪽에 맞게 말한다. 우리는 mark [를 원하지만이 패턴에서도 탈출해야합니다. 따라서, 이것은 오퍼레이터에게 주어진 모션 후에 매치를 시작합니다.
\([a-zA-Z\)위의 하나의 라이너와 동일합니다.
\%<']이것은 모션의 끝 전에 일치하는 다른 끝입니다.
/\u\1/g위의 하나의 라이너에서 교체입니다.


실제로, 그것은 하나의 라이너만큼 매크로가 아니지만 키 조합에 매핑 할 수 있습니다.
— John O'M.

운영자 버전을 추가했습니다. 조금 더 잘 작동합니다.
— John O'M.

당신의 대답이 구체적으로 매크로를 사용하지 않는다면 괜찮습니다. asker는 제 생각에 XY 문제를 제시 했습니다 .
— tommcdo

@tommcdo 그렇습니다. 실제 매크로 일 필요는 없습니다. 그것은 일종의 자동화 된 방법 일 필요가 있습니다.
— Doorknob

12

대안으로 나는 강제 기능을 제공하는 vim-abolish 플러그인을 사용합니다.

켜려고 fooBar로 foo_bar? crs(뱀으로 강제 변환)을 누릅니다 . MixedCase ( crm), camelCase ( crc), snake_case ( crs) 및 UPPER_CASE ( cru)는 모두 3 번만 누르면 됩니다. 이 명령은 repeat.vim을 지원 합니다 .


2
내가 모르는 팀 포프의 플러그인이 항상 있기 때문에 +1.
— zool

5

다음 키 입력으로 한 줄에 대해이 작업을 수행하는 재귀 매크로를 만들 수 있습니다.

qqqqqf xgUl@qq

( f와 사이의 간격 x은 스페이스 바의 탭이며 일시 중지는 아닙니다.)

상세히:

  1. q 레지스터를 지우십시오. 재귀 매크로를 작성하기 때문에 필요합니다. (5 단계 참조) :qqq

  2. 레지스터 q에서 매크로 기록을 시작하십시오. qq

  3. w다음 줄로 넘어 가지 않고 줄 끝에 도달 할 때 매크로가 중단되기를 원하기 때문에 여기서 모션을 사용할 수 없습니다 . 대신 f키와 스페이스 바를 눌러 줄의 다음 공백 문자로 이동하십시오 .f<space>

  4. 공백을 삭제하고 다음 문자를 대문자로 입력하십시오. xgUl

  5. 재귀. q1 단계 에서 레지스터를 지웠으므로 아직 아무것도 없으므로 아무 것도 수행하지 않습니다.@q

  6. 매크로를 저장하십시오. q

그런 다음 범위를 사용하여이 매크로를 여러 줄에 적용 할 수 있습니다.

파일의 모든 줄에 매크로를 적용하십시오.

:%normal @q

2-5 행을 포함하여 매크로를 적용하십시오.

:2,5normal @q

시각적으로 선택한 다음을 입력하십시오 :normal @q. :키 를 누를 때 명령 행이 미리 채워져 선택의 모든 행에 매크로를 적용하는 명령이 생성됩니다.

:'<,'>normal @a

키 입력 기록을 시작하기 전과 q마찬가지로 레지스터 를 지울 필요는 없습니다 qq. 사실, 그것이 정확히 레지스터 qqq를 지우는 이유입니다. q:)
— tommcdo

물론 레지스터에 추가 해야하는 작업 q(예 :) 을 사용 qQ하는 경우 먼저 지우는 것이 필요할 수 있습니다.
— tommcdo

2
@tommcdo Vim의 사본에서는 사실이 아닙니다. (Vim 7.3.87,로 호출 vim -u NONE) 기존 내용은 6 단계에서 레지스터 를 저장할 때만 지워집니다. 따라서 되풀이하려면 시작하기 전에 레지스터를 지워야합니다 .
— Rich

@tommcdo이 단계가 필요한 이유를 더 명확하게하기 위해 답변을 업데이트했습니다.
— Rich

내 실수, 나는 일종의 총을 거기에서 뛰어 올랐다. 탁월한 설명!
— tommcdo

1

http://vim.wikia.com/wiki/Changing_case_with_regular_expressions를 참조하십시오 . \ U, \ L, \ u, \ l 수정자를 매우 명확하고 간결하게 설명합니다!

본질은 다음과 같습니다.

파일을 살펴보고 임의의 기준과 일치하는 문자의 대소 문자를 변경하려는 경우가 있습니다. 정규식을 잘 이해하면 실제로 쉽게 수행 할 수 있습니다.

대소 문자를 변경하려는 역 참조 앞에 \ U 또는 \ L을 배치하고 끝에 \ E를 배치하는 것만 큼 간단합니다. Vim은 역 참조 텍스트를 각각 대문자 또는 소문자로 만듭니다. 역 참조에서 맨 처음 문자의 대소 문자 만 변경하려면 \ u 및 \ l (끝에 \ E없이)을 사용하십시오.

"역 참조"는 정규 표현식의 이전 부분을 나타내는 정규 표현식의 일부입니다. 가장 일반적인 역 참조는 &, \ 1, \ 2, \ 3, ..., \ 9입니다.

이 기술의 힘을 보여주는 몇 가지 예 :

전체 파일을 소문자로

: % s /.*/ \ L & / g

(&는 일치하는 전체 텍스트를 나타내는 편리한 역 참조입니다.)

<앞에 오는 모든 단어를 대문자로 표시하십시오 (예 : HTML 태그 이름 열기).

:%s/<\(\w*\)/<\U\1/g

gu 및 gU 명령도 참고하십시오.

예를 들어, ggguG는 전체 파일을 소문자로 사용합니다. (gg = 맨 위로 이동, gu = 소문자, G = EOF로 이동).

이름 (\ 1, \ 2 등) 대신 \ 0 일반 역 참조를 사용하면 정규 표현식의 대체 스탠자에 대한 입력을 저장할 수 있습니다.

이 정규식 대문자는 파일에서 대문자로 명시적인 단어 집합을 나타냅니다.

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\0/g

로켓 과학은 아니지만 그렇지 않으면 다음을 수행해야합니다.

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\1\U\2\U\3\U\4\U\5/g

1
답변에서 언급 한 기사를 요약 해 주시겠습니까?
— EvergreenTree

만나요? 단일 링크 응답으로 문제가 해결되지 않으면 몇 년 후이 사이트에 삭제 된 링크가 가득 차게되는 것이 매우 중요합니다. 당신은 단지 당신이 참조 링크의 중요한 부분을 복사하지만 하고 또한 영업 이익은 더 정보를 정기적으로 얻을 수있는 링크를 제공, 그것은 괜찮습니다.
— peterh-Reinstate Monica
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.