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


14

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

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

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

wgUlhx필요한만큼 여러 번 사용할 수 있지만 문제는 길이가 다양한 단어에 대해서는 작동하지 않는다는 wgUlhxwgUlhxconvert 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 플러그인을 사용합니다.

켜려고 fooBarfoo_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.