defcustom을 올바르게 사용하는 방법은 무엇입니까?


15

대부분의 Emacs 사용자와 마찬가지로 변수를 변경하여 모드를 사용자 정의했습니다. 나에게 결코 일어나지 않은 것은 커스터마이징이 가능하다는 배후의 프로그래밍 정신입니다. eshell의 소스 코드를 살펴보기 시작했을 때 이것을 깨달았습니다. 내가 elisp 프로그래머 아니지만, 특별히 em-ls.el사용하는 것 defcustom, defgroup등이 전 세계적으로 정의 변수 그 elisp 코드 사용의 그림자 세계가 될 것 같다. 하나의 질문은, defcustom(사용자 정의 가능한) 전역 변수를 수행하는 다른 방법을 사용하는 것입니까?

누구나 내 아이디어를 올바르게 사용하는 방법 (사용 우선)을 defcustom언제, 언제, 왜, 언제 사용하지 않는지에 대해 밝힐 수 있습니까? elisp 초보자를위한 초보자 예제 일 수 있습니다.


당신이 요구하는 것을 명확히 할 수 있습니까? 언제 customize시설 을 사용하고 언제 손으로 사용자 정의 해야하는지 알고 싶 습니까? 아니면 모드 작성에 관심이 있습니까? 후자는 실제로 등을 사용하여 자신을 찾을 수있는 상황입니다 defcustom.
Dan

답변:


20

맞춤 시스템은 A가 이맥스의 기능을 내장 정확하게이 문제를 해결하기 위해 설계 설명을-프로그램은 일반 사용자가 자신의 편집기를 구성하는 이상적인 방법하지 않을 수 있습니다.

사용자 정의 기능의 기본 진입 점은 M-x customize RET(또는 Options > Customize Emacs > Top-level Customization Group메뉴에서)입니다. 여기에서 설정 조정을위한 대화식 메뉴 시스템이 표시됩니다. 이 인터페이스는 사용자가 프로그래밍 방식으로 Emacs를 구성 할 때 발생하는 주요 오류 원인을 피하면서 모든 설정이 올바른 유형 (숫자, 문자열, 색상 등)이되도록합니다. 사용자가 UI를 통해 변경 한 내용을 유지하기로 선택한 경우 설정은 사용자의 초기화 파일의 특수 섹션 (읽기 :)에 저장됩니다 .emacs.

defcustom같은 주변 저수준 이맥스 리스프 기능 래퍼 defvar모두 변수를 선언하는 것이 커스터마이즈 인터페이스 내에는 볼 수는. 또한 개발자는 적절한 대화 형 제어를 표시하는 데 필요한 추가 메타 데이터를 제공 할 수 있습니다. 즉,이 변수에 어떤 유형의 값이 저장됩니까? 임의의 문자열? 숫자? 고정 옵션 세트에서 선택? etc. defgroup는 이러한 사용자 정의 가능한 옵션에 대한 그룹화 구성이므로 멋진 계층 구조로 배열 될 수 있습니다.

이 기능은 데이터의 일부가 라이브러리의 내부 세부 사항이 아니라 사용자를 위해 구성 가능한 옵션으로 간주 될 때마다 사용해야합니다.

다음은 작은 라이브러리에서 가져온 간단한 예입니다.

(defgroup checkbox nil
  "Quick manipulation of textual checkboxes."
  :group 'convenience)

(defcustom checkbox-states '("[ ]" "[x]")
  "Checkbox states to cycle between.
First item will be the state for new checkboxes."
  :group 'checkbox
  :type '(repeat string))

defgroup최상위 레벨에서 사용자 정의 인터페이스 내에서 새 그룹을 생성 convenience항목을 선택합니다. 그런 다음 가능한 확인란 상태를 저장하는 변수가 필요했습니다. 나는 사용할 수 defvar있었지만 이것을 쉽게 사용자 정의 할 수 있기를 원했기 때문에을 사용하기로 결정했습니다 defcustom. :group부분은 이전에 정의 된 그룹에 속하는 것을 나타내고,는 :type그 문자열의 시퀀스임을 나타낸다. 기본값과 설명도 있습니다. 사용자가 입력 한 값을 변환하기위한 추가 기능 (여기에는 표시되지 않음)도 있습니다.

이제 실행 M-x customize RET하고로 이동 Convenience > Checkbox하면 다음이 표시됩니다.

커스터마이즈 인터페이스

세계에서 가장 아름다운 인터페이스는 아니지만 "체크 박스 상태"( checkbox-states내부적으로) 의 값을 사용자 정의하기위한 대화식 도구가 있습니다 . INS(삽입) 및 DEL(삭제) 버튼 과 함께 현재 문자열 값을 표시하고 편집 상자에서 문자열 값을 편집 할 수 있습니다. 완료되면 변경 사항을 적용할지, 되돌릴 지 또는 향후 세션에 적용하고 저장할지 결정할 수 있습니다.


2
좋은 소식! 사용자 정의 (와에 가장 중요한 장점은 defcustom)는 점이다 자동으로 처리한다 : (1) 유형 검사는 도움을 제공 (변수에의 작가 잘못된 값을 할당하지 못하도록 defcustom적절한 유형을 제공하기 위해 만든 노력을 확인), (2) 초기화 ( :initialize) 및 업데이트 동작 (트리거 됨) ( :set).
Drew

감사! 귀하의 제안을 반영하여 게시물을 업데이트했습니다.
camdez

7

defcustom을 사용하는 것이 (customizable) 전역 변수를 수행하는 또 다른 방법입니까?

예. 특히 코드 사용자가 Mx 사용자 정의 인터페이스를 통해 변수를 쉽게 변경할 수 있도록하려면 .

defcustom 은 사용자에게 두 가지 중요한 이점 인 문서 및 유형 안전을 제공합니다. 문서는 바로 거기에 있습니다. 타입 안전성은 변수가 취할 수있는 유효한 값의 종류를 지정할 수있게합니다.

물론 defvar 는 사용자가 자신을 위해 사용자 정의하고 더 넓은 사용을 기대하지 않는 경우 좋습니다. 그러나 일부 사람들은 defcustom을 통해 고집 하는 것이 좋은 습관 이라고 말합니다 .

누구나 올바르게 사용하는 방법에 대해 밝히도록 지시 할 수 있습니까?

defcustom에 대한 매뉴얼 페이지는 더 해명있다. 매뉴얼의 사용자 정의 주제 에 완전한 세부 사항이 있습니다.

... 사용할 때 왜 그렇지 않습니까?

defvar 및 setq의 재로드 문제 를 처리 할 필요가 없으므로 개발 중에 defcustom이 덜 번거 롭습니다 .

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