Настройка emacs на новой машине с init.el и установкой пакета - PullRequest
1 голос
/ 07 марта 2019

Как и, по-видимому, многие пользователи emacs, у меня есть свой собственный файл конфигурации emacs ~/.emacs.d/init.el для настройки emacs так, как мне нравится. Поэтому, когда я начинаю использовать новую машину, я копирую на нее свой конфигурационный файл emacs. Теперь проблема в том, что мой файл конфигурации emacs зависит от нескольких пакетов, которые я установил через менеджер пакетов emacs, но из-за отсутствующих пакетов я не могу успешно установить пакеты.

Конечно, я могу запустить emacs без моего конфигурационного файла (emacs -q), но тогда проблема в том, что доступно только репо по умолчанию, поэтому я не могу фактически установить пакет, который мне нужно установить, чтобы успешно запустить emacs с мой конфигурационный файл.

Итак, что я обычно делал, это временно закомментировал материал в моем файле конфигурации emacs, чтобы я мог успешно установить пакеты, а затем я могу раскомментировать его и перезапустить emacs с моей полной конфигурацией. Но это громоздко, и обычно требуется несколько попыток, прежде чем я закомментирую все необходимые вещи. Наверняка должен быть лучший способ, по которому я скучаю?

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Что вы можете сделать, это объявить пакеты, которые вы используете.Затем добавьте код, который запускается каждый раз, когда вы открываете Emacs.Он проверяет каждый пакет из этого списка, был ли он установлен или нет.Когда это не так, он устанавливает его.

Быстрый пример из моего файла конфигурации :

;; first, declare repositories
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("marmalade" . "http://marmalade-repo.org/packages/")
        ("melpa" . "http://melpa.org/packages/")))

;; Init the package facility
(require 'package)
(package-initialize)
;; (package-refresh-contents) ;; this line is commented 
;; since refreshing packages is time-consuming and should be done on demand

;; Declare packages
(setq my-packages
      '(cider
        projectile
        clojure-mode
        expand-region
        helm
        jinja2-mode
        magit
        markdown-mode
        paredit
        wrap-region
        yaml-mode
        json-mode))

;; Iterate on packages and install missing ones
(dolist (pkg my-packages)
  (unless (package-installed-p pkg)
    (package-install pkg)))

И все хорошо.

2 голосов
/ 08 марта 2019

Вы можете поместить elisp инициализации, который устанавливает нужные вам пакеты, в отдельный файл, затем запустить emacs -q, затем загрузить и оценить файл elisp пакетов.

Я использую следующий код в отдельном файле для обработки пакетов. Этот код также определяет используемые мной пакеты и позволяет динамически добавлять и загружать пакеты.

Если вы сначала загрузите этот файл из init.el, то вы, вероятно, сможете просто запустить Emacs как обычно, и пропущенные требуемые пакеты будут установлены автоматически.

Обновление

Я был несколько обеспокоен тем, как я использовал defvar для определения переменной списка пакетов. Я немного прочел и исправил приведенный ниже код - теперь это defvar переменная my-packages-package-list, а затем setq это список пакетов для установки. Насколько я понимаю, это более идиоматический способ определения и использования переменных. В результате этот код теперь байт-компилируется без каких-либо предупреждений.

Для тех, кто заинтересован, некоторую информацию об использовании defvar и setq можно найти здесь и в руководстве Emacs` .

(require 'package)

(setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")
                         ;; ("marmalade" . "https://marmalade-repo.org/packages/")
                         ("melpa" . "https://melpa.org/packages/")
             ("org" . "https://orgmode.org/elpa/")))


(setq package-archive-priorities '(("melpa" . 10)
                   ("gnu" . 5)
                   ("org" . 2)
                   ;; ("marmalade" . 0)
                   ))

(package-initialize)

(when (not package-archive-contents)
  (package-refresh-contents))

;; the following code will install packages listed in myPackages if
;; they are not already installed
;; https://realpython.com/emacs-the-best-python-editor/

(defvar my-packages-package-list "List of custom packages to install.")

;;; this allows for dynamically update and install packages while
;;; Emacs is running, by modifying this list, and then evaluating it
;;; and tha mapc expression below it
(setq my-packages-package-list
      '(;; add the ein package (Emacs ipython notebook)
    ein

    ;; python development environment
    elpy

    ;; beutify python code
    py-autopep8

    ;; git emacs interface
    magit

    ;; debuggers front end
    realgud

    ;; multiple major mode for web editing
    ;; multi-web-mode

    ;; major mode for editing web templates
    web-mode

    ;; docker modes
    docker-compose-mode
    dockerfile-mode

    ;; list library for emacs
    dash
    ;; collection of useful combinators for emacs lisp
    dash-functional

    ;; major modes for yaml
    yaml-mode

    ;; major modes for markdown
    markdown-mode

    ;; major modes for lua
    lua-mode

    ;; major modes for fvwm config files
    fvwm-mode

    ;; treat undo history as a tree
    undo-tree

    ;; flychek
    ;; flychek-clojure
    ;; flychek-pycheckers

    ;; Clojure for the brave and true - below; amit - some packages
    ;; commented out by me until I'll be sure they are needed

    ;; makes handling lisp expressions much, much easier
    ;; Cheatsheet: http://www.emacswiki.org/emacs/PareditCheatsheet
    paredit

    ;; key bindings and code colorization for Clojure
    ;; https://github.com/clojure-emacs/clojure-mode
    clojure-mode

    ;; extra syntax highlighting for clojure
    clojure-mode-extra-font-locking

    ;; integration with a Clojure REPL
    ;; https://github.com/clojure-emacs/cider
    cider

    ;; allow ido usage in as many contexts as possible. see
    ;; customizations/navigation.el line 23 for a description
    ;; of ido
    ;; ido-ubiquitous

    ;; Enhances M-x to allow easier execution of commands. Provides
    ;; a filterable list of possible commands in the minibuffer
    ;; http://www.emacswiki.org/emacs/Smex
    ;; smex

    ;; project navigation
    ;; projectile

    ;; colorful parenthesis matching
    rainbow-delimiters

    ;; solarized theme
    solarized-theme

    ;; edit html tags like sexps
    ;; tagedit

    ;; help finding keys
    which-key

    ;; xkcd
    xkcd

    ;; Clojure exercises
    4clojure
))

(mapc #'(lambda (package)
    (unless (package-installed-p package)
      (package-install package)))
      my-packages-package-list)
...