Как устранить неполадки в Emacs?

21

В ситуации, когда Emacs ведет себя не так, как я хочу, что я могу сделать, чтобы устранить проблему? Какие шаги я могу предпринять, чтобы найти и устранить проблему самостоятельно?

Или, в противном случае, как я могу собрать полезную информацию, чтобы люди, находящиеся здесь (или в списке рассылки или на других форумах), могли помочь мне с моей проблемой?

Мой Emacs включает в себя множество пакетов, коллекцию фрагментов, копируемых и вставляемых (или убиваемых и выдергиваемых) со всего интернета, и мой собственный elisp, некоторые из которых я не помню, писал или больше не понимаю. Есть ли способ разобраться во всех этих осложнениях?

Тайлер
источник
Не уверен, что это лучшее место для этого, но есть много вопросов, которые получают ответы / комментарии, запрашивающие emacs -Qв качестве первого шага. Я написал это как нечто, связывающее эти вопросы с общей справкой для новых пользователей.
Тайлер
Да, это лучшее место для этого. Собственно, такой вопрос был предложен (почти) 2 года назад: meta.emacs.stackexchange.com/q/198/184 Спасибо!
Т. Веррон

Ответы:

28

Шаг 1: бег emacs -Q

Первое, что вам нужно сделать, это запустить emacs без каких-либо настроек. Если вы можете воспроизвести проблему в ванильном Emacs, это может быть ошибка в самом Emacs. Это редко, но мы исключаем это как первый шаг.

Если вы запустите Emacs из командной строки с -Qфлагом, т. Е. emacs -QВы получите чистый или «ванильный» emacs без загруженных локальных настроек. Ваша проблема все еще возникает? Если это так, перейдите к «Предоставление рецепта ошибки».

Шаг 1б: что если проблема с пакетом?

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

(require 'package)
(setq package-load-list
      '((package1 t)))
(package-initialize)

Замените package1на имя пакета, который вы хотите загрузить. Если вам нужно загрузить несколько пакетов, измените скрипт соответствующим образом:

(require 'package)
(setq package-load-list
      '((package1 t)
        (package2 t)
        (package3 t)))
(package-initialize)

Чтобы загрузить этот код, вы можете вставить его в *scratch*буфер и вызвать M-x eval-buffer. (или любой буфер, если в нем нет другого кода!).

На данный момент вы загрузили пакет (ы) и только те пакеты, которые вы тестируете. Если вы можете воспроизвести проблему сейчас, перейдите к разделу «Предоставление рецепта ошибки».

Шаг 2: Нахождение ошибки в вашем .emacs

Теперь вы подтвердили, что проблема связана с чем-то в вашей конфигурации («звонок поступает из дома!»). Ваша конфигурация может быть длиной в несколько тысяч строк и может загружать много разных файлов. Чтобы найти проблему, вы выполните бинарный поиск, закомментируя половину кода за раз, чтобы сузить круг. 1

  1. Откройте свой обычный emacs emacs, без -Qопции.
  2. Откройте файл конфигурации (обычно ~/.emacsили .emacs.d/init.el, если вы не можете найти его, попробуйте C-h v user-init-file)
  3. Выберите первую половину файла: C-spaceчтобы установить метку, прокрутите вниз наполовину, чтобы расширить область
  4. Закомментируйте выбранный регион: M-;и сохраните файл
  5. Откройте новый emacs (ваш тестовый emacs ), оставив первый запущенный emacs. Тест Emacs будет читать сокращенную версию вашего конфига.
  6. Попробуйте воспроизвести проблему в тесте Emacs
  7. Если вы не можете воспроизвести его, закройте тестовый emacs , а в исходном emacs undoоставьте комментарий C-/и закомментируйте половину оставшегося кода. Откройте новый тестовый emacs и попробуйте снова.
  8. Если вы можете воспроизвести проблему, закомментируйте половину оставшегося кода и посмотрите, сохраняется ли проблема.
  9. Повторяйте этот процесс, пока не найдете наименьший бит вашей конфигурации, необходимый для воспроизведения проблемы.

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

Если ваш конфигурационный файл загружает другие файлы, вы можете расширить поиск и на эти файлы.

В этот момент вы, возможно, обнаружили, что проблема связана с одной или двумя строками кода. Вы можете даже быть в состоянии исправить это самостоятельно. Если так, поздравляю, вы чему-то научились! В противном случае перейдите к третьему шагу.

Шаг 3: Предоставление рецепта ошибки

На данный момент, вы должны быть в состоянии предоставить подробный рецепт ошибки, чтобы опубликовать здесь. Он должен включать в себя:

  • Ваша версия Emacs (вы можете получить это из Emacs с M-x emacs-version
  • Ваша операционная система (Windows #, Mac, дистрибутив Linux)
  • Версия пакета, с которым вы боретесь, если применимо
  • Конкретные шаги, необходимые для демонстрации проблемы, в том числе то, что вы ожидаете , и что на самом деле происходит .

Например, я мог бы опубликовать такой вопрос:

У меня проблема с супер-режимом. Когда я использую M-x sm-compile-code, он снимает деньги со своего счета PayPal.

Действия по воспроизведению:

Загрузить супер-режим:

(require 'package)
(setq package-load-list
      '((super-mode t)))
(package-initialize)
  • открыть новый файл с C-x C-f my-code
  • введите строку кода:
10 goto 10
  • вызов M-x sm-compile-code

Я ожидаю, что это вызовет суперкомпилятор и скомпилирует мою программу. Вместо этого я вижу в минибуфере сообщение «100 долларов переведено с PayPal на автора суперрежима»

GNU Emacs 25.1.50.3
Debian Linux
Super-mode версия 3.1415


1 Пакет Bug Hunter может помочь вам (полу) автоматически разделить ваш файл инициализации.

Тайлер
источник
Может быть, вы могли бы упомянуть Охотник за насекомыми .
Омар