Emacs Lisp에 대한 질문이 있습니다. setq 와 setq-default 의 차이점은 무엇입니까 ?
튜토리얼에서는 setq 가 로컬 버퍼에 영향을 미치는 반면 setq-default 는 모든 버퍼에 영향을 미친 다고 말합니다 .
예를 들어 init.el에 (setq a-var a-vars-value) 를 썼다 면 Emacs를 시작하고 새 버퍼를 연 후에 발견했습니다. a-var 도 거기에 있고 그 값은 a-vars-value입니다. 입니다. 거기에 있으면 안된다고 생각했습니다. setq 와 setq-default 사이에 차이가없는 것 같습니다 .
내 이해에 문제가 있습니까?
예를 들면 :
-
내가 쓴 (123 안녕하세요 SETQ) 에 init.el 파일, 그리고 실행 abuffer 이맥스 쉘에서, 나는 입력이 “안녕하세요 CX 세륨은” 그것은 “123”을 보여줍니다. 모든 새 버퍼에서 이것을 실행할 때도 마찬가지입니다.
-
내가 쓴 (SETQ 탭 폭 4) 에 init.el 파일. 탭 너비 Cx Ce를 실행하면 “8”이 표시됩니다 (현재 모드는 ‘텍스트’). 그러나 (setq-default tab-width 4) 를 사용하면 “4”가 표시됩니다. 이 현상을 설명 할 수 없습니다.
답변
Emacs의 일부 변수는 “buffer-local”입니다. 즉, 각 버퍼가 전역 기본값을 무시하는 해당 변수에 대해 별도의 값을 가질 수 있습니다. tab-width
버퍼 로컬 변수의 좋은 예입니다.
변수가 버퍼 로컬이면 setq
현재 버퍼에서 로컬 값을 setq-default
설정하고 전역 기본값을 설정합니다.
변수는, 로컬 버퍼되지 않은 경우 setq
와 setq-default
같은 일을한다.
귀하의 경우 2에서는 현재 버퍼에서 (setq tab-width 4)
버퍼 로컬 값 tab-width
을 4로 설정하고 전역 기본값은 tab-width
여전히 8로 유지하므로 tab-width
로컬 값이없는 다른 버퍼에서 평가할 때 8이 표시됩니다. 그런 다음, 기본값을 4로 설정하면 여전히 로컬 값이 없기 때문에 버퍼가 선택했습니다.