Vim에서 사례 보존 대용품


154

Vim 에서이 작업을 수행 할 수 있습니까 ?

내 말은 'BadJob'을 검색하고 'GoodJob'으로 바꾸면 다음과 같은 대체 작업을 수행합니다.

'badjob' -> 'goodjob'  
'BadJob' -> 'GoodJob'  
'badJob' -> 'goodJob'  
'BADJOB' -> 'GOODJOB'

16
이것은 vim 기능이어야합니다. 너무 의미가 있습니다.
Bach

답변:


120

abolish.vim을 사용하십시오 .

:%S/badjob/goodjob/g

13
우리는 팀 포프를받을 자격이 없습니다.
Andrew Keeton

1
이 플러그인이 작동하지 않는 것 같습니다. 내가 좋아하는 단어 BadJob를로 바꾸고 싶다면을 GoodJob사용할 수 없습니다 %S/badjob/goodjob/g. 일치를 감지하지 못합니다.
Roymunson

@Roymunson 당신이해야 할 일은 이것입니다 : %S/BadJob/GoodJob/g. 그러면 Subvert 명령은 대소 문자 혼합 모드로 전환되고 OP에 의해 주어진 모든 Substition을 수행합니다.
shivams

28

이것이 당신이 찾고있는 해결책인지 모르겠지만 ... 이것을 사용했습니다 : keepcase.vim

vim에서는 달리 지원하지 않습니다 ...


11

확실히 너는 할 수있어

:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/

추신. keepcase.vim이 비슷한 논리를 캡슐화한다고 생각합니다. :)


네, 그것은 2007 년부터 수행합니다 : % SubstituteCase / \ cbadjob / GoodJob / g ^^
루크 Hermitte

gVim 7.2 이후의 의미? gVim 7.1 (2007 년 5 월 12 일)에서 시도했지만 작동하지 않습니다 :(
fc.

아니요, 2007 년에 플러그인에 : SubstituteCase 명령을 추가했습니다. 그게 전부입니다. 플러그인은 vim.org에서 사용할 수 있으며 대부분의 플러그인에서 평소와 같이 vim과 함께 제공되지 않습니다.
Luc Hermitte

1. 사용자가을 가질 때 실패합니다 :set ignorecase. 2. 대신에 Bad로 대체됩니다 . 3. 질문 의 " "부분은 무시되므로 →로 대체 됩니다. 이 버그들에 대한 수정 및 설명과 제 대답 에는 몇 가지 다른 것들이 있습니다. (또한 LOLOWLs!)GOODGoodjoblambadalamgooda
Aaron Thoma

7

당신은 이것을 붙여 넣고 적응시킬 수 있습니다 :
(물론, 때때로 이것을하는 경우이 괴물 대신 플러그인을 원할 것입니다.) 서두르고 한 번만 필요한 사람에게는 빠른 해킹입니다. 붙여 넣기의 즐거움을 위해 :)

:%s/\cbad\zejob/\= ( submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g' ) . ( submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood' )

검색 패턴 외에도 교체 코드에서 네 개의 '문자열 '을 편집해야합니다. 굵게 표시된 부분을 ​​편집하십시오 .

: % s / \ c 잘못된 \ ze 작업 / \ =
(submatch (0) [0] is # toupper (submatch (0) [0])? ' G ': ' g ').
(submatch (0) [1] is # toupper (submatch (0) [1])? ' OOD ': ' ood ')

줄 바꿈 문자도 명령을 위반하므로 붙여 넣기에이 '주황색'버전을 사용하지 마십시오.

/\ze는 긍정적 인 예측을 표시하기위한 vim regex 구문 설탕이다 : 이후 패턴 \ze이 점검되지만 대체되지는 않는다.


is#?? 설명하겠습니다… (관심이 있다면)

#( ==#기타 )도 대소 문자를 구분합니다. 그렇지 않으면 with :set ignorecase(유용한 것이 필요하기 때문에 내가 사용하는 :set smartcase), vim은 'a' == 'A'!!

미친 듯이, 우리는 그것을 정말로 고려해야합니다 : 그것은 사용자 설정에 의존하기 때문에 ==NEVAR을 사용해야합니다! (실제로 원하는 위치를 제외하고) ==#정수를 비교할 때 사용하는 권장 사항도 따르겠습니다 . http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively

is#대신 ==#방어 적으로 코딩하는 또 다른 방법입니다. 형식 안전성을 향상시킵니다. http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
문자열 리터럴과 비교할 때 사용해야합니다.

'single-quoted'"double quoted" 문자열 대신 다른 좋은 방법이 있습니다 : http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings


HT @fc. -이 대답은 자신을 기반으로 답변을 몇 가지 단점을 고정.


4

대소 문자를 정확히 사용하여 대소 문자를 구분하지 않는 정확한 문자열 만 일치시키는 경우 다른 가능성은 다음과 같습니다.

:s/abc/\={'abc':'xyz','Abc':'Xyz'}[submatch(0)]/i

2

keepcase 플러그인 의 대안 은 원래 대소 문자를 유지하면서 단어를 바꾸는 SmartCase 입니다. (나쁜 평가로 자신을 낙담시키지 마십시오.)


1
기억하기 어렵고 지루한 명령을 입력하는 데 도움이되는 트릭이 :%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig있습니까?
Michael Härtl

@ MichaelHärtl : :SmartCase명령을 사용할 수 있습니다 . 나는 그것을 내 자신의 포크로 확장했습니다 . 이것은 ingo-library 를 종속성으로 필요 로합니다.
Ingo Karkat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.