2014-04-07 9 views
4

이맥스를 커스터마이징 할 때 패키지를로드하기 전에 해당 변수를 설정해야합니까?로드하기 전에 이맥스 setq

즉,

(setq some-variable some-value) 
(require 'some-package) 

또는

(require 'some-package) 
(setq some-variable some-value) 

는 모두 작업 대부분의 시간을 일부 패키지가 명시 적으로로드 한 후 init을 요구하는 경우를 제외하고 나에게 보인다. 내가 맞습니까?

+0

대부분의 경우 자동로드되지 않은 함수를 호출 할 필요가 없다면'(require 'mode)'가 필요하지 않습니다! – gavenkoa

답변

1

두 경우 모두 대개 수용 가능합니다. 그러나 특별한 경우에는 항상 그런 것은 아닙니다.

예를 들어 *Python* 프로세스를 실행 한 후 python-shell-interpreter을 설정하면 *Python* 실행 파일이 변경되지 않습니다. *Python* 버퍼를 삭제하고 변경 사항을 적용하려면 다시 실행해야합니다.

또한 일부 변수는 다른 변수의 값에 따라 파일로드시 바인드됩니다. 따라서 기본 변수의 변경 사항은 파생 값으로 전파되지 않습니다. 이것을 확인하기 위해 소스 코드를 읽으십시오.

.emacs에 코드를 넣으면 모드 워드 프로세서가 다른 것을 말하지 않는 한 두 경우 모두 거의 동일합니다 (설명서의 Emacs 로딩 프로세스를 읽으십시오. 그 단계에서 Emacs는 사용자 버퍼를 처리하지 않습니다).

그러나 버퍼 처리 후에 변수를 변경하면 작동하지 않을 수 있습니다. Emacs가 사용자 버퍼를 처리 할 때 내부 캐시를 초기화/채울 수 있습니다. 이 캐시 (소스 또는 문서를 읽어야 함)를 찾고 재설정 또는 리로드 트리거 방법을 이해하기가 어렵습니다 (nil으로 설정하거나 mode-reinit 기능 호출). 어떤 경우

내가 아주 쉽게 이맥스 소스를 읽는 발견 ...

일부 패키지는, GNUS처럼 깨끗하고 하역 (gnus-group-exit)을 허용, 그래서 이전에로드되지 않은 것처럼 다시로드 할 수 있습니다 - 당신이있는 경우 문제는 변수/함수 선언을보고 설정 방법과 사용 된 기능을 이해하는 것입니다.

로드하기 전에 내가 조정 모드를 필요로 내 .emacs에서이 예제 (내가 INFOPATH의 ENV var에에서 Cygwin에서와 :와 함께 작업을 선호하는 경우 그래서 기본 이맥스 ;를 사용하지 않습니다) : 변수가

;; Assume that cygwin-mount already activated. 
(when (featurep 'cygwin-mount) 
    (setenv "INFOPATH" "/usr/share/info/:~/usr/share/info/:") 
    ;; Redefine path-separator to UNIX to update Info-directory-list. 
    (let ((path-separator ":")) 
    (require 'info) 
    (info-initialize) 
    )) 
4

경우 사용자 옵션은 패키지를로드하기 전에 수행하십시오. 패키지에 옵션을 정의하는 defcustom이 포함되어 있지만 변수에 이미 값 (예 : setq)이있는 경우 defcustom은 값을 설정하지 않습니다.

마찬가지로 변수가 사용자 옵션이 아닌 전역 적으로 정의 된 변수 인 경우, 즉 defvar을 사용하여 패키지에 의해 정의됩니다. defvardefcustom과 같이 기존 값을 덮어 쓰지 않습니다.

한편 변수에 따라 패키지가로드 된 후 값을 변경하려는 경우가 있습니다. 그것은 모두 패키지가하는 일과 그 변수가 어떻게 사용되는지에 달려 있습니다.

에 관계없이 내가 위에 말한 무엇을, IMO 당신의 init 파일에 setq를 사용하여 전역 변수 값 (옵션 여부를) 변경 일반적으로 나쁜 생각입니다. 옵션에 대한
  • , 그것은 사용자 정의 UI를 사용하여 사용자 정의 할 수 있도록하거나, init 파일의 기능 custom-set-variables 또는 customize-set-variable 중 하나를 사용하는 것이 바람직하다 (즉, 명시 적으로 자신). 이는 옵션을 정의하는 defcustom이 값 초기화 및 업데이트를 위해 "트리거"를 가질 수 있고을 업데이트 할 수 있으며 다른 특수 처리를 할 수 있기 때문입니다. 그리고 주어진 defcustom은 그것의 디폴트 값 표현을 평가하기 위해 파일 앞에 나타나는 다른 것들에 의존 할 수 있습니다.

    방금 ​​초기화하거나 옵션을 업데이트 setq를 사용하는 경우

    는 당신은 당신이 원하는 아마 하지 어떤 특별 취급을 무시하고 놀라움에있는 이어질 수 있습니다. 당신은 당신이 무엇을하고 있는지 확신하지 않는 한

  • 유사하지만 덜 중요한 일반적으로, 단순히 옵션이 아닌 (즉, defvar) 변수에 setq를 사용하는 것은 좋은 생각이 될 수 있습니다.

나의 추천 :를 사용하여 사용자 정의하지만, 은 당신의 init 파일에 쓸 수 없습니다. 대신, 변수 custom-file을 정의하십시오 (실제로 옵션이지만 실제로는 사용할 수는 없지만 사용자 정의는 해당 개별 파일에 쓰고 수동으로 수정할 수 있도록 init 파일을 남겨 둡니다). (당신은 아직도 당신의 init 파일에 customize-set-variable을 사용할 수 있습니다.)

을 당신이 당신의 init 파일에서 파일 custom-file을로드 할 필요 , 그렇게한다면. 그리고 init 파일의 어느 시점에서 초기화 파일의 주어진 변수 설정이 custom-file (Customize가 관리하는 설정)을로드하기 전이나 후에 가져올지를 결정할 수 있습니다.

+0

'사용자 지정'을 고려하고 있지만이 경우 모든 사용자 지정 내용을 하나의 파일에 저장해야합니다. 나는'prelude'와 같이'xxx-conf.el'에 각 패키지를 따로 설정하는 것을 선호합니다. – gongzhitaao

+1

@ gongzhitaao : 무슨 뜻인지에 따라 모든 사용자 지정 내용을 하나의 파일에 넣지 않아도됩니다. *** 사용자 정의 ***는 * 하나의 파일에서 처리하는 모든 사용자 정의를 저장하지만 다른 사용자 정의는 원하는만큼 많은 파일로 분산 될 수 있습니다. IMO, 변수'custom-file'을 정의하고 적절한 시간에 init 파일에서 해당 파일을로드함으로써 Customize가 관리하는 내용을 init 파일에서 관리 *하는 것이 좋습니다. – Drew

+0

첫 번째 단락에서 (custom-file로드)가 (package-initialize) 이전에 있어야한다고 결론 내릴 수 있습니까? –