Posso usar o modo organizacional para estruturar meu arquivo .emacs ou outro arquivo de configuração .el?


48

Meu .emacsarquivo de configuração fica cada vez maior e eu gostaria de ter uma melhor visão e estrutura adicionando títulos, subtítulos e poder ocultar ou mostrá-los como eu posso fazer com o Emacs org-mode.

Percebi que org-modetambém posso ativar o .emacsbuffer e que é possível adicionar títulos e recolhê-los. Mas o Emacs / Aquamacs ainda poderá carregar o código Elisp do documento se eu adicionar org-modetítulos (por exemplo, linhas começando com um ou mais asteriscos)?

Eu posso ter tudo isso em um arquivo ou eu teria que ter um .*orgarquivo e, em seguida, regularmente exportar o código Elisp para outro arquivo?

Respostas:


46

Sim, você certamente pode, pode usar org-babel-load-filepara fazer isso.

No seu init.el, coloque o seguinte:

(require 'org)
(org-babel-load-file
 (expand-file-name "settings.org"
                   user-emacs-directory))

(Estou usando ~ / .emacs.d / settings.org, mas isso é preferência pessoal). No settings.orgarquivo, você pode organizá-lo da maneira que desejar, envolvendo o elisp em:

* Turn off menu bar
#+BEGIN_SRC emacs-lisp
(menu-bar-mode -1)
#+END_SRC

Quando você inicia o Emacs, ele determina automaticamente se o arquivo settings.org foi alterado e, se necessário, emaranha-o para produzir um settings.elarquivo que será carregado.


11
Como você alteraria isso para carregar o mais recente orgdo elpa, em vez do orgque está disponível em um emacs limpo? Parece que o packagecódigo de inicialização precisaria ser extraído settings.orge inserido init.el?
Mankoff

3
@mankoff Está correto, este é o meu init.el: (require 'package) (package-initialize) (setq custom-file "~/.emacs.d/custom.el") (when (file-exists-p custom-file) (load custom-file)) (require 'org) (org-babel-load-file (expand-file-name "settings.org" user-emacs-directory))
Lee H

2
@mankoff Desculpe pela má formatação, eu tenho uma versão mais legível perto do topo da writequit.org/org/settings.html
Lee H

2
Existem mais do que alguns exemplos de configurações alfabéticas do Emacs. Talvez esteja na hora de iniciar um índice. Aqui está o meu, por exemplo, github.com/grettke/home
grettke

11
lembre-se de não configurar coisas relacionadas à organização dentro do arquivo organizacional, se desejar usar a versão mais recente da organização (9) disponível no Melpa. Estou fazendo isso github.com/cescoferraro/dotfiles/blob/master/src/emacs.d/…
CESCO

23

Se tudo o que você deseja é exibição seletiva de seções e navegação entre títulos, não será necessário o modo Org. Tudo que você precisa é o modo de estrutura de tópicos . O modo de estrutura de tópicos é basicamente o gerenciamento de visibilidade de seção e nível de cabeçalho do modo de organização. De fato, o modo Org era originalmente as extensões do autor para o modo Contorno, e cresceu, cresceu e cresceu ... Ainda hoje org-modeé derivado outline-mode.

O modo de estrutura de tópicos existe tanto no modo principal quanto no modo secundário. O modo secundário pode ser usado em qualquer modo principal. Você pode configurá-lo para usar um formato de cabeçalho compatível com a sintaxe do programa, e muitos modos principais o fazem, definindo a outline-regexpvariável como um regexp que corresponda ao início de um cabeçalho. Por exemplo, este é o valor padrão no modo Emacs Lisp:

";;;\\(;* [^ \t\n]\\|###autoload\\)\\|("

ou seja, os cabeçalhos das seções começam com três ou mais ponto-e-vírgula e um único espaço, ou um parêntese de abertura na margem esquerda. A variável outline-levelcontém o nome de uma função para determinar a profundidade de um cabeçalho; o valor padrão é o comprimento da string correspondente outline-regexpe o modo Emacs Lisp a substitui para atribuir uma profundidade maior a (e ;;;###autoload.

Se você não gostar do formato padrão do cabeçalho, defina a variável outline-regexpem uma declaração de variável local do arquivo . É isso que eu uso - meus cabeçalhos de seção são todos ;;;seguidos pela sequência clássica de estrelas:

;;; Local Variables:
;;; outline-regexp: ";;;\\*+\\|\\`"
;;; End:

Se você deseja que o modo secundário de estrutura de tópicos seja ativado automaticamente ao carregar o arquivo, adicione a seguinte linha na seção Variáveis ​​locais - observe que isso avisará sobre código não seguro no Emacs ≤23.x.

;;; eval: (outline-minor-mode 1)

Os comandos para o modo secundário de contorno usam o C-c @prefixo bastante inconveniente por padrão. Eu o movo para M-o(nunca uso as ligações facemenu), você pode preferir outra tecla ou replicar as ligações do modo Org (que divergiram bastante do modo Estrutura de tópicos).


4
Eu segundo isso. A organização é ótima, mas, para isso, tudo que você precisa é o modo de estrutura de tópicos. E fica ainda melhor se você combiná-lo com os modos outshine, outorg e navi. Com outshine e outorg, você não precisa usar o org-babel e seus emaranhados em arquivos separados para obter bons comentários no estilo org. Aqui está uma essência do código elisp que eu uso para fazer com que o código Python, elisp e shell funcione e dobre muito bem em estrutura de tópicos / outshine.
blujay

14

A programação alfabética leva você ao máximo, o modo org é compatível com o org-babel . Duas soluções possíveis são explicadas no blog de @malabarba :

A maneira mais simples é carregar o modo organizacional e, em seguida, usar seu recurso de desembaraçar para carregar uma configuração alfabética do Emacs:

(require 'org)
(org-babel-load-file
 (expand-file-name "emacs-init.org"
                   user-emacs-directory))

Como alternativa (para evitar o carregamento completo da organização), o desembaraço pode ser feito com as primitivas Emacs Lisp:

(defvar endless/init.org-message-depth 3
  "What depth of init.org headers to message at startup.")

(with-temp-buffer
  (insert-file "~/.emacs.d/init.org")
  (goto-char (point-min))
  (search-forward "\n* init.el")
  (while (not (eobp))
    (forward-line 1)
    (cond
     ;; Report Headers
     ((looking-at
       (format "\\*\\{2,%s\\} +.*$"
               endless/init.org-message-depth))
      (message "%s" (match-string 0)))
     ;; Evaluate Code Blocks
     ((looking-at "^#\\+BEGIN_SRC +emacs-lisp.*$")
      (let ((l (match-end 0)))
        (search-forward "\n#+END_SRC")
        (eval-region l (match-beginning 0))))
     ;; Finish on the next level-1 header
     ((looking-at "^\\* ")
      (goto-char (point-max))))))

6

Mais um voto no modo de estrutura de tópicos. Por exemplo, para organizar, .emacseu uso a seguinte sintaxe:

;;; HEADING:

as partes importantes são ;;;e:\n

(add-hook 'emacs-lisp-mode-hook 
          (lambda ()
            (make-local-variable 'outline-regexp)
            (setq outline-regexp "^;;; ")
            (make-local-variable 'outline-heading-end-regexp)
            (setq outline-heading-end-regexp ":\n")
            (outline-minor-mode 1)
            ))

Aqui está uma amostra .emacs:

;;; preliminaries:
;; load-path:
;; This little monster adds all non-dot dirs to Your load path recursively
(let* ((my-lisp-dir "~/.emacs.d/site-lisp/")
       (default-directory my-lisp-dir)
       (orig-load-path load-path))
  (setq load-path (cons my-lisp-dir nil))
  (normal-top-level-add-subdirs-to-load-path)
  (nconc load-path orig-load-path))

;; ...

;;; modes:

;; python-mode:
(setq py-install-directory "~/.emacs.d/site-lisp/python-mode")
(add-to-list 'load-path py-install-directory)
(require 'python-mode)

;; ...

;;; customizations:
(custom-set-variables
 '(blink-cursor-mode nil)
)

;; ...

Deve-se ativar outline-minor-modee, em seguida, os dois pressionamentos de tecla necessários são:

  • C-c @ C-t - mostra estrutura de nível superior

    o acima se torna

    ;;; preliminaries:
    ;;; modes:
    ;;; customizations:
    
  • C-c @ C-a - mostrar tudo de novo

Um uso típico é mostrar a estrutura de nível superior, passar para o título de interesse e mostrar tudo novamente.


11
podemos usar diretivas como no modo org: por exemplo, #+STARTUP: overviewou show allou contentsopções.
doctorado

@doctorate: o suporte ao modo organizacional para dobrar também é construído sobre o modo de estrutura de tópicos. Não podemos usar apenas as diretivas: porque, ao contrário do modo org - no elisp #não é um sinal de comentário, o intérprete elisp interno do emacs ficaria confuso quando atingisse #+STARTUPou algo assim. (ou ter eu mal você comentar?)
Adobe

Quer dizer que há uma maneira de implementar o STARTUPinterior directiva orgstruct-mode, por exemplo, este foi um tampão de R mas a mesma ideia: emacs.stackexchange.com/a/8065/2443
doutoramento

3

Na resposta SO a seguir, você verá como fazer isso, projetos de exemplo usando um único arquivo organizacional ou muitos, qual é o benefício de usar Cask e links para documentação.

https://stackoverflow.com/questions/25430029/whats-the-best-way-to-package-my-emacs-installation-packages-and-config-so-tha/25430745#25430745

Mudei minha configuração para a organização há alguns meses e não estou totalmente satisfeito com isso. Requer alguma configuração e leitura do manual organizacional para ter um arquivo organizacional útil que facilita a edição do código elisp. É necessário ativar a fonte do bloco src (desativado por padrão -> usar uma variável por arquivo), verificar se outros modos não conflitam para editar os blocos src (modo de preenchimento automático), etc. Não se deseja usar o Cc (backtick) (org-edit-src-block`) para editar um bloco src. E isso atrapalha um pouco a depuração.

Meu conselho seria: comece quebrando seu arquivo init em pequenos pedaços de elisp, tente um pacote mais restrito, use helm-swooppara navegação rápida e considere usar org-mode.


1

Recentemente, investi algum tempo para fazer exatamente isso. Eu terminei com uma configuração que - é mantida no modo org - usa 'use-package' para instalar automaticamente os pacotes ausentes - é um repositório do github que meio que instala automaticamente (plug descarado: https://github.com / pascalfleury / emacs-config )

Inicializei algumas máquinas (Linux e Mac) clonando o repositório e adicionando uma única linha no ~ / .emacs et voila. Estou configurado como eu gosto.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.