Emacs에는 “단어”에 적용되는 명령이 많이 있습니다. 예로는 forward-word
, kill-word
, upcase-word
, mark-word
, transpose-words
, 등 “단어”의 정의는 명령과 조금 다를 것으로 보인다. 예를 들어 forward-word
단어 (예 🙂 내에서 밑줄에서 멈추지 foo_bar
만 mark-word
밑줄에서 멈추지 않습니다.
내가 prog 모드에있을 때 “word”의 정의를 변경하여 Emacs가 현재 언어의 구문에 적절한 단어 경계를 사용할 수 있습니까?
내가있을 때 밑줄을 건너 뛰고 c-mode
싶습니다 . 내가 forward-word
있을 때 하이픈과 밑줄 등을 건너 뛰고 lisp-mode
싶습니다 forward-word
.
답변
이맥스는 이미 ” 현재 언어의 구문에 적합한 단어 경계 “를 사용해야 합니다 . 그렇지 않은 경우 해당 언어의 주 모드에 대한 버그를 신고하십시오.
그러나 아마도 당신은 정말로 단어를 의미하지는 않습니다 . 어쩌면 단어 구문이 아닌 기호 구문 을 의미 할 수도 있습니다 . 이맥스는 두 가지를 구별합니다.
기호 구문, 사용 기호 명령이 아닌 단어 명령의 경우 : forward-symbol
등 당신의 설명에서, 이것은 당신이 정말 원하는 것입니다.
실제로 심볼에 단어 함수를 사용하려는 경우 특정 문자의 구문 범주 를 기호 구성 구문 대신 단어 구성 구문으로 변경할 수 있습니다 . 그러나 일반적으로 이것은 당신이하고 싶은 것이 아니며 그렇게 할 필요가 없습니다.
문자 구문에 대한 정보는 Elisp 매뉴얼을 참조하십시오. 또한 기호 (Lisp 기호가 아니라 기호 구문이있는 텍스트)에 대해 작동하는 명령 및 기타 기능에 대해서는 Emacs 설명서 및 Elisp 설명서를 참조하십시오.
그리고 sexps 작업은 종종 기호 C-M-f
( forward-sexp
), C-M-t
( transpose-sexps
) 등의 작업에도 유용합니다 .
답변
한 번 봐 superword-mode
하고 subword-mode
. 슈퍼 워드는 밑줄을 경계 대신 단어의 일부로 취급하므로 foo_bar
단일 단어로 취급됩니다 .
Subword는 camelCase와 반대로 작동하지만 fooBar
한 단어 대신 두 단어로 처리됩니다.
원하는 동작 cc-mode
을 사용하는 것 같습니다 superword-mode
.
(add-hook 'c-mode-common-hook 'superword-mode)
subword-mode
이 두 가지 모드가 원하는 것을 정확하게 수행하지 않더라도 단어 감지 동작을 변경하는 방법을 보여 주므로 에 대한 소스를 읽는 것이 좋습니다 .
emacsredux 및 ergomacs 에 대한 자세한 설명 .
답변
귀하의 질문을 이해하면 언어 구문 표를 수정할 수 있습니다 (예 : c ++).
(modify-syntax-entry ?_ "w" c++-mode-syntax-table)
M-x apropos
구문 테이블을 찾아 보면 도움이 될 것입니다.