~ / .emacs.d / init.el 및 ~ / emacs.d의 내용을 구성 하시겠습니까?


28
  1. ~/.emacs.d/init.el다양한 목적으로 (파이썬 모드, emacs-eclim, ... 등) 점점 더 많은 행을 추가 하면 파일이 길고 읽기 어려워집니다. 콘텐츠 구성에 도움이되는 방법이 있습니까?
  2. 내 현재 ~/.emacs.d는 이렇게 생겼어

    $ ls *
    init.el
    
    auto-save-list:
    
    elisp:
    python-mode.el-6.1.3
    
    elpa:
    archives        auctex-readme.txt         s-20140910.334
    auctex-11.87.7  emacs-eclim-20140809.207
    
    eshell:
    history
    

    python-mode.el-6.1.3emacs-eclim-20140809.207의해 설치되는 동안 수동으로 설치 되었으며 elpa다른 항목 elpa/이에 의해 100 % 확실하지 않습니다 elpa. 의 내용을 ~/.emacs.d/어떻게 구성 할 수 있습니까?

답변:


32

덜 편집기를 사용하는 사람들은 코드를 여러 파일로 나누는 것을 좋아합니다. Emacs를 사용하는 경우, 그렇게 할 이유가 없습니다. 하나의 큰 파일을 사용하여 섹션으로 나눕니다.

각 섹션은

^L
;;; title of the section

을 입력하여 ^L문자 를 삽입하십시오 C-q C-l. 그런 다음 C-x ]( forward-page) 또는 C-x n p( narrow-to-page) 와 같은 명령을 사용 하여 파일을 탐색 할 수 있습니다. 자세한 내용 은 Emacs 매뉴얼의 섹션 25.4 (페이지) 를 참조하십시오 .


16
특별한 이유도 있습니다 없는 여러 개의 파일로 분할 코드는. 그것은 물건 그룹화가 무엇을 의미하는지, 당신이 어떻게 행동하기를 원하는지에 달려 있습니다. 그리고 그것은 얼마나 큰지에 달려 있습니다. 또한 코드 조각이 다른 라이브러리와 같이 다른 사람과 공유되는지 여부에 따라 달라질 수 있습니다.
Drew

2
@Drew의 의견을 피기 백하면 사용자는 다른 emacs 버전 및 환경에 대해 다른 구성을 갖고 그에 따라 관련 elisp를로드 할 수 있습니다. 즉, 나는 페이지 매김 팁을 좋아합니다.
Harvey

3
@Harvey : 페이지 매김과 별도의 파일 사용은 텍스트를 구성하는 독립적 인 방법입니다. 분명히 둘 다 사용할 수 있습니다. 모든 라이브러리에서 페이지 매김을 사용하여 섹션을 구분합니다. 그러나 나는 또한 별도의 라이브러리 (파일)를 가지고 있습니다.
Drew

1
@jch이 스타일을 사용하는 경우 섹션 및 기능을 접을 수 있도록 개요 보조 모드 또는 이와 유사한 기능을 활성화 할 수도 있습니다. 모든 최상위 제목을 접 으면 Emacs 구성의 모든 섹션에 대한 개요가 제공됩니다.
lunaryorn

@lunaryorn, 나는 시도했지만 그것을 산만하게 발견했습니다. 대부분의 페이지 이동 명령을 충분히 발견하고 있습니다. 때로는 좁힐 필요가 있습니다. 아마 내 .emacs.wl길이가 충분하지입니다.
jch

20

이 작업을 수행하는 고전적인 방법은 귀하 .emacs를 별도의 파일로 분할하는 것 입니다. 예를 들어, 모든 웹 항목을 이동 ~/.emacs.d/web-config.el한 다음 내부에로드 할 수 있습니다 init.el.

(load "~/.emacs.d/web-config.el")

~/.emacs.d좀 더 체계적 으로 유지하려면 이러한 구성 파일을 자체 디렉토리로 옮길 수도 있습니다.

(load "~/.emacs.d/config/web.el")

이제 설정을 변경할 때 적절한 파일로 이동할 수 있습니다.

이것에서 빠진 한 가지는 사용자 정의 시스템을 통해 설정된 변수입니다. 이것들은 여전히 ​​모두 메인 init.el에 있습니다. 분명히 init split 이라는 작은 유틸리티 가 있습니다.이 유틸리티는 사용자 정의 설정이 어디로 이동하는지에 대한 규칙을 만들 수 있지만 직접 사용하지는 않았습니다. 또는 "사용자 정의"시스템은 설정을 수정하기 위해 별도의 파일을 사용하도록 구성 할 수 있습니다. "customize"설정을 읽고 쓸 위치custom-file지정 하려면 변수를 설정하십시오 .

디렉토리 자체가 진행되는 한 항상 기본 레이아웃에 만족했습니다. 내가 변경 한 주요 사항은에서 관리 하지 않는 모든 사용자 정의 패키지 및 라이브러리에 대한 디렉토리를 작성하는 것입니다 package.el. 이것은 구성과 관련이없는 맞춤형 커스텀 홈을 제공합니다.


감사. (1) package.el이 관리하는 패키지 및 라이브러리의 디렉토리는 무엇입니까? (2) 디렉토리의 내용은 다음에 elpa의해 관리 elpa됩니까? 다른 곳으로 옮길 수 있습니까?
Tim

2
변수를 설정하여 custom-file변수 사용자 정의에 별도의 파일을 지정할 수 있습니다 . 출처
Kaushal Modi

@Tim : package.el이 관리하는 디렉토리는 elpa입니다. Elpa는 lisp 패키지가 아니라 패키지 저장소입니다. Package.el은 elpa 디렉토리에 설치하는 모든 패키지를 (elpa 또는 다른 저장소에서 --- 예를 들어, eclim 및 s는 elpa라고 생각하지 않습니다) 패키지에 추가합니다. 예,이 디렉토리의 내용에 대해 걱정할 필요가 없습니다.
T. Verron

(더 이상 편집 할 수 없음) 위에서 쓴 내용은 엄격하지 않습니다. elpa는 패키지 아카이브의 형식이고 package.el은 패키지 관리자입니다. 사용자에게는 둘 사이에 실질적인 차이가 없습니다. 위의 의견은 elpa를 GNU elpa로 잘못 생각합니다. GNU elpa는 사용 가능한 elpa 패키지 중 하나이며 유일한 공식 패키지입니다.
T. Verron

16

조직 모드를 좋아하는 경우 조직 모드를 사용하여 .emacs분할하지 않고 구성 할 수 있습니다 . 내 현재 구성에서 내 .emacs파일은 내가 가지고있는 init.org 파일을 부트 스트랩합니다.~/.emacs.d/init/init.org

(require 'org)

;; Load the actual configuration file
(org-babel-load-file
  (expand-file-name (concat user-emacs-directory "init/init.org")))

다른 파일을 사용하면 무언가 grep를 간단 C-s하게 검색 하지 않고 대신 해야합니다 . 또한 조직에 여러 수준을 추가하는 것이 더 쉽습니다.


1
나는 이것을 사용하려고 생각하지 않았지만 현재이 작업을 수행하고 있습니다 org-babel-load-file. 단! (예 : github.com/vermiculus/dotfiles/blob/… , github.com/larstvei/dot-emacs )
Sean Allred

이 질문에 대한 Emacs 구성에 org-mode 사용에
ShreevatsaR

9

코드 조각 init.el을 별도의 파일 (라이브러리) 로 옮기면 require됩니다. ( provide라이브러리에서 required로 사용하십시오 .) 원하는 위치에 파일을 넣고 load-path그에 따라 업데이트하십시오 .


감사. (1) 예를 들어? (2) ~ / .emacs.d /를 구성하는 것이 무엇을 제안합니까?
Tim

1
"의 내용을 구성 ~/.emacs.d/하시겠습니까? 원하는 것을 지정하지 않았습니다. 모든 디렉토리를 하나의 디렉토리에 저장하는 데 제약을받지 않습니다. 원하는 곳에 물건을 넣고 load-path그에 따라 수정할 수 있습니다. 일부 프로그램 / 도구는 물건 ~/.emacs.d/을 넣을 수없는 경우 (즉, 물건을 넣을 위치를 말할 수없는 경우) 해당 프로그램 / 도구가 완료된 후 원하는 곳으로 옮기십시오.
Drew

1
"예를 들어"는 무슨 뜻입니까? 예를 원하는 것은 무엇입니까? (require 'foobar)를 사용하는 예입니다 require. (add-to-list 'load-path "/my/lisp/dir")수정의 예입니다 load-path. (provide 'foobar)를 사용하는 예입니다 provide.
Drew

"~ / .emacs.d /의 내용을 구성함으로써, 나는 인간으로서, 이맥스가 이해하는 것이 아니라 그것을 더 잘 이해할 수 있습니다. 그것은 캐비닛, 서랍, 책장을 정리하는 것과 같은 습관입니다. 예를 들어, 파이썬 -mode.el-6.1.3은 elpa에 의해 수동으로 설치되고 emacs-eclim-20140809.207은 elpa에 의해 설치되었는데, 두 패키지 모두입니까? 만약 ~ / .emacs.d의 하위 디렉토리에 두는 것이 좋습니다.
Tim

당신은 어떤 조직이 당신이 그것을 더 잘 이해하도록 도울 수 있는지에 대답 할 수있는 인간입니다. (Emacs는 아무것도 이해하지 못합니다.) 원하는 폴더 구조를 사용하십시오. 캐비닛, 서랍, 책장 또는 폴더라고 부릅니다. 그리고 다시, 당신 init.el은 뿐만 아니라 어디에서나 라이브러리를로드 할 수 있습니다 ~/.emacs.d/.
Drew

7

나는 Emacs Wiki : Load directory 에있는 targzeta 의 제안을 사용합니다 .

기본적으로 ~ / .emacs.d / load-directory.el이 있습니다.

;;;; ~/.emacs.d/load-directory.el

;; Handy function to load recursively all '.el' files in a given directory
(defun load-directory (directory)
  "Load recursively all '.el' files in DIRECTORY."
  (dolist (element (directory-files-and-attributes directory nil nil nil))
    (let* ((path (car element))
           (fullpath (concat directory "/" path))
           (isdir (car (cdr element)))
           (ignore-dir (or (string= path ".") (string= path ".."))))
      (cond
       ((and (eq isdir t) (not ignore-dir))
        (load-directory fullpath))
       ((and (eq isdir nil) (string= (substring path -3) ".el"))
        (load (file-name-sans-extension fullpath)))))))

그런 다음 ~ / .emacs.d / config에 별도의 파일을 넣습니다.

~/.emacs.d/config ls
01-packages.el  02-style.el  03-modes.el  04-keybindings.el  05-functions.el

그리고 마지막으로 ~ / .emacs.d / init.el에 있습니다.

;; Load all ".el" files under ~/.emacs.d/config directory.
(load "~/.emacs.d/load-directory")
(load-directory "~/.emacs.d/config")

링크보다 더 많은 정보를 제공하기를 원합니다 (예 : 해당 링크의 내용에 대한 요약 설명).
Drew

네 말이 맞아, 나는 내 대답을 편집했다.
Boccaperta-IT

흠. 적어도 예의 바르게, 당신은 당신이 구두로 쓸어 넘긴 코드가 targzeta에 의해 쓰여졌다 고 말할 것 입니다. 상호 참조 페이지를 요약 한다고해서 내용을 표절하는 것은 아닙니다. (당신이 경우 물론 이다 targzeta, 다음 아마도 문제가 없습니다.)
드류

다시 한 번 편집했습니다. 감사.
Boccaperta-IT

감사. (제대로하는 데 약간의 시간이 걸리지 만 모두에게 조금 더 도움이됩니다.)
Drew

5

이 특정 고양이를 벗기는 방법은 여러 가지가 있습니다. 내가 가장 좋아하는 것은 outshineoutline-minor-mode 과 함께 사용하는 것입니다 . 발췌 :

;; * This here is my emacs init file
;; ** Many subsections with headlines like this one omitted
;; ** Customising modes
;; […] more lines omitted
;; *** Org and outline modes
(autoload 'outshine-hook-function "outshine")
(add-hook 'outline-minor-mode-hook 'outshine-hook-function)
;; […] and more
;; * Emacs Magic
;;; Local Variables:
;;; mode: emacs-lisp
;;; coding: utf-8
;;; mode: outline-minor
;;; fill-column: 79
;;; End:

자주 사용하는 패키지 저장소에서 눈에 띄어 야합니다.


1
나는 개요-부 모드로 시작했지만 키 바인딩이 너무 고통스럽고 자신에 대해 아무것도 할 시간을 찾지 못했습니다. 그래서 나는 org-mode를 발견 한 후에 orgstruct-mode로 옮겼지만, 나는 돋보인다. 다시 없는 기쁨! 나는 현재 elisp, 라텍스 및 기타 파일을 자체 메이저 모드로, org-mode로 모든 종류의 노트를 구성 할 때 outline + outshine을 사용합니다.
Harald Hanche-Olsen

2

패키지와 파일을 추적하기 위해 다음 구조를 사용합니다

~/.emacs.d
|-- elpa            ;; Package.el packages
|-- hack            ;; Development versions of packages (e.g. org, personal packages)
|-- single-lisp     ;; Individual lisp files from outside sources (e.g. EmacsWiki)
|-- site-lisp       ;; Lisp packages not managed by package.el (directories)
|-- user-config     ;; Machine/situation specific customization (work vs home)
|   `-- custom.el   ;; Customization settings
|-- lisp            ;; Individual .el files to keep init.el clean
|   `-- defaults.el ;; Default configuration settings
`-- init.el

그런 다음 use-package로드 된 패키지와 각 패키지에 대해 설정된 사용자 정의를 관리하는 데 사용 합니다. 시간 만 대부분의 hackelpa업데이트 필요, 다른 폴더에 대해 종종 일회성 내가 테스트 또는 사용을 간단하게하고 싶지만 (도 멍하니) 부하를 필요로하지 않는 패키지.

custom.el 사용하지 않는 (그리고 사용하더라도 버전을 지정하지 않는) 사용자 정의 설정을위한 것입니다.

defaults.el.el 파일로 덮어 쓸 수있는 일반적인 구성 (메뉴 막대, 글꼴, 인코딩 등)을 user-config/위한 것으로 예상대로 작동하지만 환경에 맞게 조정할 수 있습니다.

나는 이전에 유지하기 위해 노력했다 functions, macros, advice내용 사이의 묘사 수 있도록 별도의 패키지로하지만, 정의에 달렸다는 / 문제는 너무로 그 뒤를 뒀다 필요합니다 init.el. 그들은 결국에 다시 넣을 수 있습니다 ~/.emacs.d/lisp/.

init.el깔끔하게 유지 하고 기능과 목적에 따라 콘텐츠를 정렬하여 다시 찾는 것이 간단합니다. 나는 모 놀리 식 init.el파일을 가지고 끝에 새로운 내용을 계속 추가했습니다 (또는 그것이 맞을 것으로 생각되는 곳). 그러면 내가 추가 한 내용이나 찾을 때 추가 한 부분을 알지 못하게됩니다. 때로 isearch물건을 명명 한 방법을 기억할 수 없었기 때문에 때때로 검색을 사용하면 도움이되지 않았습니다.)


2

기존의 모든 답변은 친구 와 같은 수동으로 생성 된 파일 을 구성하는 모범 사례를 다룹니다 init.el. 다양한 패키지에서 자동으로 생성 된 모든 파일을 구성하는 것도 마찬가지로 중요하며이 경우 패키지 no-littering가 우수합니다.


1

나는 덧붙였다

  (when (string= (buffer-name) "init.el")
    (setq imenu-generic-expression
      '((nil "^;; \\[ \\(.*\\)" 1))))

emacs-lisp-mode-hook에 연결합니다. 그런 다음 파일 섹션 "yasnippet", "packaging", "java mode"등에 추가하십시오. 이것은 1000 줄의 코드 (주석 포함)에 적합합니다.

편집 : 마지막으로 helm-imenu로 섹션 간을 전환합니다. 실제로 일반 imenu 기능에 자동으로 연결되므로 필요한 것은

       (local-set-key (kbd "C-*") 'imenu)

후크 대신 파일 로컬 변수를 사용할 수 있습니다.
YoungFrog

1

상대적으로 작은 .emacs파일을 세 부분으로 나눕니다.

  • 부피가 크고 쓸모없는 많은 데이터를 추출하는 사용자 정의를위한 emacs-custom.el ; 파일은 기본 .emacs 파일 을 건드리지 않고 자동으로 다시 작성되어 잘못된 변경을 방지합니다.

    (setq custom-file "~/.emacs-custom.el")
    (load custom-file)
    
  • 구성 대신 코드의 경우 lg-lib.el : 패키지 디렉토리가 아닌 비표준 소스 위치에서 내 라이브러리를로드하고 다양한 기능 (대부분 적절한 패키지가없는 경우 복사 및 해킹)을 정의합니다. .emacs 줄 수 의 또 다른 큰 감소입니다 .

    (load "~/lg-lib")
    
  • 기본 .emacs 파일 : 부피가 큰 코드 및 부피가 큰 사용자 정의 변수 require가 없으면 패키지 호출, Customize 시스템에 속하지 않는 변수 및 패키지를로드하고 초기화하기위한 여러 함수 호출이 포함됩니다. 나는 동일한 패키지 또는 기능과 관련된 모든 행을주의 깊게 유지하고 패키지로드 및 패키지 관련 설정을 "핵심"기능과 분리하여 "구성"합니다. 상당히 대표적인 발췌 :

    (require 'ido)
    (ido-mode t)
    
    (require 'auto-complete)
    (add-to-list 'ac-dictionary-directories "~/.emacs.d/ac-dict")
    
    (require 'auto-complete-config)
    (ac-config-default)
    (global-auto-complete-mode t)
    

    이 섹션은 작지만 각 패키지에 대해 더 많은 구성 라인으로 관리 할 수 ​​있습니다.


1

https://github.com/purcell/emacs.d 와 같은 Emacs 마스터 설정을 따릅니다.

예를 들어 ELPA에서 설치 한 수동 설치 패키지 및 패키지를 구성하는 방법과 관련하여 Steven Purcell의 설정에는

a place for 3rd party code which isn't available in MELPA or other
package repositories. This directory and its immediate
subdirectories will be added to load-path at start-up time.

Notably, in Emacs 23.x, a backported package.el is automatically
downloaded and installed here

왜 주인을 따르는가? 내 "마스터 이맥스 1 년" 의 주요 요점은 초보자가 셋업 오버 헤드와 "차이"를 효율적으로 피할 수 있다는 것입니다.

많은 사람들이 저에게 동의하지 않는다는 것을 이해하지만 다음은 제 기사에 자세히 나와 있습니다 .

나는 Purcell의 존경받는 ( 2014 년 11 월 현재 1403 GitHub 스타!) 안정적인 (5 년 개발) 구성 을 사용하여 Emacs를 사용하기 시작했습니다 . 그것부터 시작했지만 여전히 많은 문제 가있었습니다 . Steve Purcell은 이러한 모든 문제를 해결하도록 도와주었습니다. (실제로 1 년 넘게 그의 Padawan 이되었습니다 .) 그의 설정과 레포 문제를 사용하여 문제를보고하고 그의 경험을 이용함으로써 많은 시간을 낭비하지 않았습니다. 오늘날에도 여전히 많은 사람들 git submodule이 타사 플러그인을 관리하는 데 사용 하고 있습니다. Steve와 나는 둘 다 PITA 일 수 있기 때문에 이것을 위해 포기했다git submodule .

그러나 당신이 당신의 기술에 대해 확신이 있거나 자기 학습을 선호한다면, 이것은 당신을위한 길이 아닙니다.


2
" 마스터에서 설정 복제 ": 훌륭한 기능이나 조언을 제공 할 수있는 참고 문헌과는 별도로 (나는 확인하지 않았습니다), 사람들은 일반적으로 사람들이 init 파일이나 다른 설정을 다른 사람으로부터 복제하여 시작해야한다는 것에 동의하지 않습니다. 그것은 심지어 문제를 야기 할 수 있기 때문에 명시 적으로 낙담 한 정책 인 IIRC였습니다. 기본 설정으로 사용하는 모든 것을 처음부터 시작하고 알고 있어야합니다. 물론 다른 사람들이 한 일을 연구하고 배우는 데 아무런 문제가 없습니다. 그러나 init 파일을 맹목적으로 복사하는 것은 좋지 않습니다. (단 한 의견)
Drew

1
실제로, 나는 아직도 많은 사람들이 셋업의 처음부터 시작해야한다고 믿고 있기 때문에 기사를 작성합니다. 내가 관찰 한 것처럼 대부분의 사람들에게 가장 좋은 방법은 아니며, 초보자에게는 불필요하게 어려운 방법입니다. 그냥 검색
첸 빈

1
그것은 이다 " 대부분의 사람들을위한 최선의 방법 ". 그냥 토론과 조언을 검색 에 대해 다른 사람의 초기화 파일을 사용하여 밖으로 시작. 검색 help-gnu-emacs@gnu.org하고 www.emacswiki.org, 그리고 emacs-devel@gnu.org, 심지어 debbugs.gnu.org. 즉, 다른 사람을 생각의 음식으로 제공하기 위해 init 파일을 공유하는 데 아무런 문제가 없습니다. 조언은 초보자가 그런 식으로 시작하지 않는 것입니다. 조언은 사람들이 자신의 시작 방법과 팁을 공유하지 않는 것이 아닙니다.
Drew

1
"생존권 편향"때문입니다. 많은 사람들이 emacswiki 나 메일 링리스트를 알기 전에 포기합니다.
chen bin

0

.emacs.d폴더 를 정리하는 혁신적이고 간단한 방법 은 org-mode소스 블록을 사용하여 모든 것을 사용 하고 설명하는 것입니다. 그런 다음 .emacs파일에서을 가리 킵니다 config.org.

이에 대한 훌륭한 자료는 Harry Schwartz입니다. 그는 만지는 유튜브 비디오세부 사항을 설명 하는 블로그 게시물을 가지고 있습니다. 나는 이맥스 멍청한 놈으로 그것을 따르고 모든 설정을 얻을 수있었습니다. 매력처럼 작동합니다. 전체 파일 1 개 init.

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