Как настроить spacemacs так, чтобы он выполнял код при запуске?

Предисловие

Я знаю, что заголовок выглядит субъективным, но я хочу, чтобы этот вопрос был плавным введением в spacemacs для новичков, не вообще из emacs (как в моем случае).

Вы можете задаться вопросом, почему я решил использовать spacemacs, который представляет собой очень нестандартный хак по сравнению с emacs, не потратив время на то, чтобы сначала привыкнуть к ванильным emacs. На самом деле, я пытался использовать emacs и vim в течение долгого времени, потому что я мог понять, почему это программное обеспечение могло повысить производительность и заставить вас чувствовать себя более "как дома" при кодировании / взлом.
К сожалению, пока я начинал немного привыкать к vim, время, которое вам нужно потратить на обучение, и, прежде всего, время, которое вам нужно потратить на настройку этого программного обеспечения , был слишком высок для меня.
Затем я обнаружил spacemacs, который берет немного того, что хорошо в vim, что хорошо в emacs, и объединяет их в красивый в основном предварительно настроенный пакет.

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

Чего я хочу достичь

Я хочу иметь возможность запускать emacs и видеть, как он выполняет некоторый собственный код, который я бы написал так, чтобы:

  • номера строк отображаются в любом открытом буфере
  • git live изменения показаны слева
  • символы подсвечиваются при наведении курсора
  • моя "домашняя страница" показывает список проектов, и я могу загрузить самый последний, который помнит конфигурацию буфера с последнего раза

Я хочу иметь возможность кодировать эти функции (и, возможно, множество других), когда это необходимо, или устанавливать их, когда они уже доступны.

Что я пробовал

(и что не работает)

Я (наивно) настроил свои spacemacs, как любой новичок в lisp / emacs:

(defun dotspacemacs/user-config ()
  "Configuration function for user code.
 This function is called at the very end of Spacemacs initialization after
layers configuration. You are free to put any user code."

  ;; TODO
  ;; - Display whitespaces
  ;; - Install workgroups2

  ;; interface  ;; this works
  (setq powerline-default-separator 'arrow)

  ;; mouse scroll  ;; this works? maybe
  (setq mouse-wheel-scroll-amount '(1 ((shift) . 1))) ;; one line at a time
  (setq mouse-wheel-progressive-speed nil) ;; don't accelerate scrolling

  ;; middle click copy-paste  ;; this works
  (setq x-select-enable-primary t)

  ;; diff-hl  ;; this used to work but now does not
  (diff-hl-flydiff-mode)
  (setq diff-hl-side 'left)

  ;; rust  ;; this works (and seems the right way to do it)
  (add-hook 'rust-mode-hook #'racer-mode)
  (add-hook 'racer-mode-hook #'eldoc-mode)

  ;; neotree  ;; this works? maybe
  (setq neo-show-hidden-files nil)

  ;; toggle preferences  ;; this does not work
  (spacemacs/toggle-automatic-symbol-highlight-on)
  (spacemacs/toggle-line-numbers-on)

  ;; COrrect DOuble CAps  ;; this does not works either (should be a hook)
  (doublecaps-mode 1)
)

Вопрос

Я осознаю, что существует концепция, называемая "основные режимы" и "второстепенные режимы", которые применяются соответственно ко всем буферам или только конкретным экземплярам буферов, но меня также очень смущает тот факт, что emacs имеет свои собственные глобальные и локальные переменные. (который, кажется, настраивается с помощью (setq)), что spacemacs также имеет переменные или методы для настройки (spacemacs/toggle-something-on), но также и (custom-set-variables), и что большая часть того, что я хочу сделать, достижимо с помощью "крючков".

Документация spacemacs оставляет меня в полном неведении, потому что она в основном предполагает, что вы знаете, как все работает, а emacs - это как руководство по обслуживанию атомной электростанции.

Может ли кто-нибудь, кто разбирается в spacemac, дать мне "точку входа" для понимания этих концепций?

Я хочу иметь возможность отвечать на вопросы: «О, я хочу настроить это поведение, где мне нужно кодировать? Какие методы я должен вызывать? Какие методы я НЕ должен вызывать? Какую переменную я могу изменить / create? Что на самом деле выполняется, когда я помещаю сюда свой код? ... и т. д. "


person Zoé Martin    schedule 06.05.2016    source источник


Ответы (1)


Вот что вам нужно знать, чтобы начать:

  • единственный файл, который вам нужно коснуться для настройки Spacemacs, - это ~/.spacemacs (или ~/.spacemacs.d/init.el, если вы предпочитаете каталог). Ничего не трогайте в ~/.emacs.d. У вас не должно быть и ~/.emacs файла.

  • Вам следует один раз прочитать ~/.spacemacs файл, чтобы увидеть все возможные варианты конфигурации, они хорошо документированы.

  • Файл ~/.spacemacs имеет следующие функции:

    • dotspacemacs/layers: Это место для настройки необходимых вам функций Spacemacs, таких как активированные слои, дополнительные пакеты, которые вам нужны, исключенные пакеты, которые вам не нужны, и т. Д. Вы не должны добавлять / удалять какие-либо переменные или код там просто измените существующие значения.

    • dotspacemacs/init: Здесь вы можете включить / выключить настройку, предлагаемую Spacemacs, такую ​​как изменение ключевой клавиши, использование https для обновления, включение номеров строк и т. Д. Вы не должны добавлять / удалять там какие-либо переменные или код, просто < strong> изменить существующие значения.

    • dotspacemacs/user-init: Здесь вы настроите Spacemacs до загрузки пакетов. В некоторых случаях это необходимо, только когда переменные должны быть установлены до загрузки пакетов. Например, установка ranger-override-dired на t, чтобы при загрузке ranger он делал то, что необходимо для отмены dired функций своими собственными. Сделать это после загрузки пакета не получится, так как будет слишком поздно. Если вы не уверены, стоит ли размещать настройку там или в dotspacemacs/user-config, вам, скорее всего, понадобится настройка в dotspacemacs/user-config. Сначала попробуйте там, и если это не сработает, вы можете попробовать установить здесь переменную.

    • dotspacemacs/user-config: Здесь вы, скорее всего, разместите всю свою личную конфигурацию. Это будет выполнено после, когда все пакеты будут загружены и настроены, поэтому он будет иметь приоритет над любой другой конфигурацией.

  • Конфигурация Emacs выполняется в Emacs lisp, поэтому вам потребуются базовые знания об этом для настройки Spacemacs, другого пути нет. На самом деле основы:

    • (<function>): function call.
    • (<function> <arg_1> <arg_2> …): вызов функции с аргументами.
    • (setq <variable> <value>): установить значение переменной.

По поводу ваших вопросов:

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

Некоторая дополнительная информация

  • Есть major-mode и minor-mode. Они не связаны с тем фактом, что применяются только к одному или ко всем буферам. Вместо этого в каждом буфере есть один, а только один, major-mode (например, python-mode, ruby-mode и т. Д.). В каждом буфере может быть несколько minor-mode (например, linum-mode). Некоторые minor-mode global в том смысле, что они влияют на все буферы, например global-centered-cursor-mode.

  • Переменные Emacs Lisp могут быть global или buffer-local. Изменение переменной global повлияет на все буферы. Изменение переменной buffer-local на (setq … повлияет только на текущий буфер. Можно изменить значение по умолчанию переменной buffer-local с помощью (setq-default …. Это изменит значение для всех вновь созданных буферов.

    buffer-local переменные имеют значения по умолчанию, но они могут быть отменены hooks при входе в какой-либо заданный режим. Для изменения таких значений для каких-то буферов в ловушку должна быть добавлена ​​функция, например:

    (setq-default fill-column 80)
    (add-hook 'mail-mode-hook (lambda () (setq fill-column 72)))
    (add-hook 'python-mode-hook (lambda () (setq fill-column 79)))
    
  • Spacemac действительно предоставляет некоторые функции переключения для некоторых функций. Они называются (spacemacs/toggle-…), и добавление -on или -off в конце включает или отключает их.

  • (custom-set-variables) является частью customize части Emacs, и пока этого следует избегать с помощью Spacemacs, поскольку их поведение не очень хорошо определено (https://github.com/syl20bnr/spacemacs/pull/5168 может решить эту проблему).

  • «Я хочу иметь возможность отвечать на вопросы:« О, я хочу настроить это поведение, где мне нужно кодировать? Какие методы я должен вызывать? Какие методы я НЕ должен вызывать? Какую переменную я могу изменить / create? Что на самом деле выполняется, когда я помещаю сюда свой код? ... и т. д. »:

    Spacemacs, как Emacs или vim, - мощный инструмент. Как и любому мощному инструменту, ему нужно время, чтобы привыкнуть к нему, чтобы освоиться. Если вы хотите начать пилотировать самолет, вы интуитивно не будете знать, какую кнопку нажать, чтобы сделать то или это. Если вы хотите чего-то добиться, вам нужно пройти действительно длинное руководство или получить инструктора. То же самое и со Spacemacs. Существует документация, быстрый старт и переход с документов vim. Они довольно длинные, но это потому, что диапазон возможностей не меньше документов. Другой способ - получить помощь от какого-нибудь «инструктора», то есть постоянных участников Spacemacs. Я бы порекомендовал вам прийти в игровую комнату, которая довольно активна и, надеюсь, полезна.

person StreakyCobra    schedule 07.05.2016