C ++에 짧은 문자열이 있는데 실수로이 문자열을 끝내는 큰 따옴표를 삭제했다고 가정합니다. Emacs가하는 일은 코드의 나머지 부분을 하나의 매우 긴 문자열로 강조하는 것입니다. 큰 따옴표를 다시 넣을 때까지 모든 형식을 엉망으로 만듭니다. 또한 전체 버퍼를 다시 글꼴화할 때 약간 느리게 느껴집니다.
cc-mode.el
를 훑어 보았지만 설정이나 문자열 글꼴이 발생하는 위치를 찾을 수 없었습니다.
방법이 있습니까? C ++ 모드 (또는 글꼴 잠금?)에 내 문자열에 개행 문자가 포함되어 있지 않으며 종결되지 않은 문자열 리터럴을 찾으면 첫 번째 개행을 넘어서는 안된다고 알려주시겠습니까?
Comments
- 구문 검사기를 사용합니까? 즉, flycheck 또는 flymake와 같은가요? 오류가있는 줄을 보여 주므로 쉽게 수정할 수 있습니다.
- @Ian 큰 따옴표가 누락 된 위치를 알고 있어도 하나의 긴 따옴표처럼 보이더라도 전체 버퍼가 끈. 이것 이 ' 피하려고하는 것입니다.
- 이것을 변경 하시겠습니까? 시스템이 설계된대로 작동하여 코드가 올바르지 않다는 피드백을 제공합니다 '.
- @TrippLilley 예 : 글꼴을 해제 한 다음 문자열 뒤에있는 전체 버퍼의 글꼴을 다시 지정합니다. 보기 흉하고 UI 지연도 눈에 띄게 나타납니다. Flycheck 및 lsp는 어쨌든 구문 오류에 대해 항상 알려줍니다. 예를 들어 Xcode는 마지막 따옴표가 누락 된 문자열을 다음 줄 바꿈까지만 강조 표시합니다. 그 방식이 훨씬 나아 보입니다.
- I ' m 이 모드가 자체적으로 글꼴 잠금을 수행하지 않을 수 있으므로 구문 테이블 변경이 포함된다고 가정합니다.
Answer
The function < progmodes/cc-engine.el
에 정의 된 div id = “80150e3dd7″>
는 모든 c-mode
변형에서 문자열과 주석을 식별하는 방법을 결정합니다. 이를 위해 다음 두 정의를 사용합니다.
;; String syntax chars, suitable for skip-syntax-(forward|backward). (defconst c-string-syntax (if (memq "gen-string-delim c-emacs-features) "\"|" "\"")) ;; Regexp matching string limit syntax. (defconst c-string-limit-regexp (if (memq "gen-string-delim c-emacs-features) "\\s\"\\|\\s|" "\\s\""))
안타깝게도 구성 가능한 변수가 아니므로 재 할당 할 수 없으며 c-mode
가 원하는 작업을 수행하도록 할 수 있습니다. 대신 상수를 사용하는 c-literal-limits
함수에 대해 기본적으로 “advice”(defadvice
참조)를 구현해야합니다. 이러한 상수는 문자열 표현식을 종료하기 위해 EOL (즉, "\\s$"
)을 추가합니다.
물론 C / C ++ 과는 다릅니다. 하지만 언어 는 작동하므로이 작업을 수행하지 않는 것이 좋습니다. 그러나 선택은 귀하의 몫입니다. 보시다시피 쉬운 경로가 아닙니다.
댓글
- ' C ++ 0x까지는 C ++에 여러 줄 문자열 리터럴이있었습니다. C는 ' 아무도 AFAIK를 사용하지 않습니다.
- 맞습니다. Emacs가 비 C ++ 파일에서 오류로 플래그를 지정하는 것이 더 나은 방법이라고 생각합니다.
- Multi C ++의 줄 문자열 리터럴에는 C ++ 11에 도입 된 특수 구문이 있습니다. ' 이맥스에 대한 일반 문자열처럼 반드시 나타나는 것은 아닙니다 (예 :
R""(string-contents)""
. - 작동하지만 ' " 수락 "이 답변은 조언을하기에는 너무 복잡해 보입니다. 이 기능을 얻으려면 cc-engine.el을 편집하십시오. 내가 올바르게 이해했다면 이것은 c- 모드에서만 작동합니다. ' 문자열 리터럴을 식별하는 것이 emacs 자체에서 수행 한 다음
.
- @Kirill " 작동하지만 저는 작동하지 않습니다. ' 이 답변을 " 수락 "하고 싶습니다. cc-engine.el을 얻기 위해 조언 / 편집해야하는 것이 너무 복잡해 보입니다. 이 기능 " 들립니다.
c-mode
의 구문 엔진은 불행히도 많은 기능을 지원하기 때문에 항상 유연하지는 않습니다 …