[emacs] Emacs Lisp에서 setq와 setq-default의 차이점

Emacs Lisp에 대한 질문이 있습니다. setqsetq-default 의 차이점은 무엇입니까 ?

튜토리얼에서는 setq로컬 버퍼에 영향을 미치는 반면 setq-default 는 모든 버퍼에 영향을 미친 다고 말합니다 .

예를 들어 init.el에 (setq a-var a-vars-value)썼다 면 Emacs를 시작하고 새 버퍼를 연 후에 발견했습니다. a-var 도 거기에 있고 그 값은 a-vars-value입니다. 입니다. 거기에 있으면 안된다고 생각했습니다. setqsetq-default 사이에 차이가없는 것 같습니다 .

내 이해에 문제가 있습니까?

예를 들면 :

  1. 내가 쓴 (123 안녕하세요 SETQ)init.el 파일, 그리고 실행 abuffer 이맥스 쉘에서, 나는 입력이 “안녕하세요 CX 세륨은” 그것은 “123”을 보여줍니다. 모든 새 버퍼에서 이것을 실행할 때도 마찬가지입니다.

  2. 내가 쓴 (SETQ 탭 폭 4)init.el 파일. 탭 너비 Cx Ce를 실행하면 “8”이 표시됩니다 (현재 모드는 ‘텍스트’). 그러나 (setq-default tab-width 4) 를 사용하면 “4”가 표시됩니다. 이 현상을 설명 할 수 없습니다.



답변

Emacs의 일부 변수는 “buffer-local”입니다. 즉, 각 버퍼가 전역 기본값을 무시하는 해당 변수에 대해 별도의 값을 가질 수 있습니다. tab-width버퍼 로컬 변수의 좋은 예입니다.

변수가 버퍼 로컬이면 setq현재 버퍼에서 로컬 값을 setq-default설정하고 전역 기본값을 설정합니다.

변수는, 로컬 버퍼되지 않은 경우 setqsetq-default같은 일을한다.

귀하의 경우 2에서는 현재 버퍼에서 (setq tab-width 4)버퍼 로컬 값 tab-width을 4로 설정하고 전역 기본값은 tab-width여전히 8로 유지하므로 tab-width로컬 값이없는 다른 버퍼에서 평가할 때 8이 표시됩니다. 그런 다음, 기본값을 4로 설정하면 여전히 로컬 값이 없기 때문에 버퍼가 선택했습니다.


답변