prog 모드에서 기호를 단어로 취급


12

Emacs에는 "단어"에 적용되는 명령이 많이 있습니다. 예로는 forward-word, kill-word, upcase-word, mark-word, transpose-words, 등 "단어"의 정의는 명령과 조금 다를 것으로 보인다. 예를 들어 forward-word단어 (예 :) 내에서 밑줄에서 멈추지 foo_barmark-word밑줄에서 멈추지 않습니다.

내가 prog 모드에있을 때 "word"의 정의를 변경하여 Emacs가 현재 언어의 구문에 적절한 단어 경계를 사용할 수 있습니까?

내가있을 때 밑줄을 건너 뛰고 c-mode싶습니다 . 내가 forward-word있을 때 하이픈과 밑줄 등을 건너 뛰고 lisp-mode싶습니다 forward-word.

답변:


4

이맥스는 이미 " 현재 언어의 구문에 적합한 단어 경계 "를 사용해야 합니다 . 그렇지 않은 경우 해당 언어의 주 모드에 대한 버그를 신고하십시오.

그러나 아마도 당신은 정말로 단어를 의미하지는 않습니다 . 어쩌면 단어 구문이 아닌 기호 구문 을 의미 할 수도 있습니다 . 이맥스는 두 가지를 구별합니다.

기호 구문, 사용 기호 명령이 아닌 단어 명령의 경우 : forward-symbol당신의 설명에서, 이것은 당신이 정말 원하는 것입니다.

실제로 심볼에 단어 함수를 사용하려는 경우 특정 문자의 구문 범주 를 기호 구성 구문 대신 단어 구성 구문으로 변경할있습니다 . 그러나 일반적으로 이것은 당신이하고 싶은 것이 아니며 그렇게 할 필요가 없습니다.

문자 구문에 대한 정보는 Elisp 매뉴얼을 참조하십시오. 또한 기호 (Lisp 기호가 아니라 기호 구문이있는 텍스트)에 대해 작동하는 명령 및 기타 기능에 대해서는 Emacs 설명서 및 Elisp 설명서를 참조하십시오.

그리고 sexps 작업은 종종 기호 C-M-f( forward-sexp), C-M-t( transpose-sexps) 등의 작업에도 유용합니다 .


C-M-fforward-sexp당신이 묘사 한 것과 얽매이지 않습니다. 내가 원하는 것은 기호로 탐색하는 것이 옳지 만 그 옵션은 보이지 않습니다.
nispio

@nispio forward sexp는 본질적으로 forward-symbol대부분의 경우 일치하는 중괄호를 넘어서도 다양한 기능을 제공합니다. 기회를 주어야합니다.
Malabarba

@Malabarba 난 강력하게 그 반대 forward-sexp의 근사치입니다 forward-symbol. 우선, 전체 기능을 혼란스럽게 뛰어 넘을 수 있으며 시작한 곳에서 수백 줄을 착륙시킬 수 있습니다. 또한 인수 목록 등을 뛰어 넘습니다. 다음 lisp 코드가 (global-set-key [remap list-buffers] 'ibuffer)있으면 커서를 단어 중간에 놓고 몇 번 remap실행 forward-sexp하십시오. 이 오류를 발생시킵니다 는 폐쇄에 도달 할 때 ]. 고맙지 만 사양 할게.
nispio

@nispio 나는 항상 sexp와 단어 탐색의 조합을 사용합니다. 그렇게하면 두 가지의 다양성을 유지하면서 이러한 문제를 피할 수 있습니다. 그러나 그것은 모두 선호의 문제입니다. ;-) 당신이 단어 탐색을 놓치지 않을 것이라는 것을 안다면, superword-mode당신의 남자가 될 것입니다.
Malabarba

죄송합니다, 나는 제안하지 말았어야 C-M-f하고 C-M-t(그들은 sexps 행동) 심벌 역할을합니다. 그 인상을 수정하기 위해 편집하겠습니다. 그러나 forward-symbol특히 유용한 키를 찾으면 원하는 키에 바인딩 할 수 있습니다 . 이 transpose-symbols없지만 유용하다고 생각되면 다시 작성할 수 있습니다.
Drew

11

한 번 봐 superword-mode하고 subword-mode. 슈퍼 워드는 밑줄을 경계 대신 단어의 일부로 취급하므로 foo_bar 단일 단어로 취급됩니다 .
Subword는 camelCase와 반대로 작동하지만 fooBar한 단어 대신 두 단어로 처리됩니다.

원하는 동작 cc-mode을 사용하는 것 같습니다 superword-mode.

(add-hook 'c-mode-common-hook 'superword-mode)

subword-mode이 두 가지 모드가 원하는 것을 정확하게 수행하지 않더라도 단어 감지 동작을 변경하는 방법을 보여 주므로 에 대한 소스를 읽는 것이 좋습니다 .

emacsreduxergomacs 에 대한 자세한 설명 .


superword-mode함께 놀 수 paredit있습니까? 예를 들어, 활성화 된 paredit-forward-kill-word경우 전체 단어 (밑줄 포함)를 삭제하지 않습니다 superword-mode.
Renan Ranelli

그것은 단어의 정의를 바꾸고 있으며 paredit그것을 존중하고 있기 때문에 그것이 요구되는 것을하고 있다고 생각합니다.
dgtized

문제는 패러디가 그것을 존중 하지 않는다는 것 입니다. paredit-forward-kill-word에 의해 정의 된 동일한 단어를 죽이지 않습니다 superword-mode.
Renan Ranelli

오, 읽었 어 흠. 방금 살펴 보았고 paredit-forward-kill-word자체 파싱하는 것처럼 보입니다. 따라서 그것을 바꿀 수는 있지만 아마도 아닐 수도 있습니다.
dgtized

3

귀하의 질문을 이해하면 언어 구문 표를 수정할 수 있습니다 (예 : c ++).

(modify-syntax-entry ?_ "w" c++-mode-syntax-table)

M-x apropos 구문 테이블을 찾아 보면 도움이 될 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.