2016-09-16 2 views
2

정확한 문제 : C++의 소스가있어서 기호 이름을 다른 이름으로 바꿔야합니다. 그러나, 나는 이것이 단지 기호를 대체하는 것이지, 실수로 ""에있는 주석이나 텍스트에서 같은 단어를 찾는 것이 아니라는 것을 알아야합니다.Vim : 구문으로 선택된 텍스트 영역 만 대체하십시오.

소스 정보 특정 언어 섹션이 무엇인지는 구문 강조 표시 규칙에서 충분히 정의되어 있습니다. 나는 그들이 때때로 실패 할 수 있다는 것을 알고 있지만 이것이 문제가 아니라는 것을 말해 봅시다. 찾은 모든 문구를 살펴보고 어떤 부분이 있는지 확인한 다음 텍스트 나 주석이면이 문구를 건너 뛰어야합니다. 그렇지 않으면 즉시 교체하거나 잘 알려진 c 플래그에 따라 먼저 묻는 방식으로 교체해야합니다.

상상이 어떤 것 적어도 이론적으로는 가능 수 :

  • 이 대체 일을 할 때 좀 "콜백"갖는 (발견 된 각 구에 대해 호출을하고, 대체할지 여부를 답을 요구하는), 또는 추출물 문구가 발견 된 위치의 목록은 다음
  • 가 지정된 위치에있는 텍스트 색상을 사용하는 현재의 "하이 링크"구문 강조 규칙의 이름을 추출 그들 모두를 반복

전혀 문제가되지 않습니다. vim의 현재 기능 내에서 sible?

답변

1

예, :help sub-replace-expression을 사용하면 :substitute의 교체 부분에서 임의의 식을 계산할 수 있습니다. Vim의 synID()synstack() 함수를 사용하면 현재 구문 요소를 가져올 수 있습니다.

Luc Hermitte에는 문자열 내부의 대체를 생략하는 구현이 있습니다 (here). 이를 유스 케이스에 쉽게 적용 할 수 있습니다.

+0

, 하나 더 질문 : 그, 그것은 의견이나 상수를 제외하고 어디 대체 할 매우 쉽습니다 '상수'. 'cString' 또는'cCppString' 또는 다른 종류의 문자열 일 수도있는 직접 구문 요소 이름을 얻을 수도 있고, ID에'synIDtrans()'를 수행하여 최종 해상도를 얻을 수도 있습니다. 이것은 놀랍게도'Constant' (' 문자열'). 링크 된 항목의 "syn 링크 목록"또는 적어도 "직접 형제"(최종 해결책이 아님)을 얻을 수있는 방법이 있습니까? 그렇지 않다면 이름에 "String"이 포함되어 있어도 상관 없지만 조금 엉망입니다. – Ethouris

+0

불행하게도, 구문 요소의 이름 ('cString')과 마지막으로 유효한 하이라이트 그룹 이름 ('Constant') 만 얻을 수 있습니다. 나는 그 중 하나가'String'을 내부에 가지고 있는지 확인하는 것으로 갈 것입니다. –

+0

그래, 아직 충분히 좋을거야. 문제는 '$ VIMRUNTIME/syntax/syncolor.vim ...'에서 String과 Constant 사이의 명확한 연결이 있다는 것입니다. – Ethouris

0

ingo-library plugin 덕분에 짧은 약식 기능을 정의 할 수 있습니다. 일치의 의견과 상수 (문자열, 숫자 등) :

function! CommentOrConstant() 
    return ingo#syntaxitem#IsOnSyntax(getpos('.'), '^\%(Comment\|Constant\)$') 
endfunction 

PatternsOnText plugin 지금 :substitute처럼 작동하는 :SubstituteIf 명령을 제공하지만, 또한 조건 식을합니다. 는`하이 데프 link`에`String`을 연결하는이 : 내가 필요한 거의 완벽

:%SubstituteIf/pattern/replacement/g !CommentOrConstant()