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


89

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"가 표시됩니다. 이 현상을 설명 할 수 없습니다.

답변:


100

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로 설정하면 여전히 로컬 값이 없기 때문에 버퍼가 선택했습니다.


내가 (탭 너비 4 설정) 평가할 때 모든 버퍼에서 항상 8입니다. 이유를 모르겠습니다. 효과가없는 것 같습니다. 그러나 (sets-default tab-width 4)를 사용하면 모든 버퍼에 적용됩니다. 나는 또한 알고하지 않는 이유 :(
ruanhao

(setq tab-width 4)표현식을 평가 한 버퍼에 적용됩니다. *scratch*버퍼 에서 평가하면 해당 버퍼에서 값을 조사하십시오.
tripleee 2013-08-11

tab-width버퍼 로컬 변수입니다. 따라서 (setq tab-width 4), 현재 버퍼에서 4로만 설정됩니다. 다른 모든 버퍼 tab-width는 전역 기본값 인 8을 유지합니다. 을 사용하면 전역 기본값 을 4 (setq-default tab-width 4)로 변경 tab-width하므로 이제 tab-width자체적으로 정의되지 않은 모든 버퍼 에 새 기본값이 있습니다.
dfan 2013-08-11

3
예. emacs의 Sequence of Actions at Startup 목록을 참조하십시오 . init 파일을 읽는 것은 12 단계이고 초기 버퍼를
불러오는

1
@ruanhao init.el에있는 경우 (setq tab-width 4) 해당 버퍼 (init.el)에만 적용됩니다. 이 변경 사항을 모든 새 버퍼에 적용하려면 (setq-default tab-width 4)이 작업을 수행합니다. 또한 특정 유형의 파일에 대한 모드를 생성하려는 경우 전역 기본값을 무시하지 않도록 (setq tab-width 4)를 사용할 수 있습니다.
Hemm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.