я могу отключить сообщение "(Введите e, чтобы повторить макрос)" в emacs? - PullRequest
0 голосов
/ 25 мая 2010

Итак, я наконец-то сделал решительный шаг и дошел до состояния, когда я очень рад, что переключился с vi и vim на emacs ... Я положил материал в свой файл .emacs, изучая как оценивать вещи (не говоря уже о знакомстве с командами движения) и т. д. и т. д.

И теперь у меня есть проблема со строкой require в моем файле .emacs (инструкция require *), которая взрывается при запуске emacs (и обычно не работает).

Итак, это привело меня к следующей ситуации:

В процессе отладки описанной выше ситуации одним из шагов, которые я сделал, было открытие файла, который я пытался потребовать, и оценка его по крупицам, используя C-M-f и C-x C-e (а позже просто M-x eval-buffer), что все работало нормально. Но по пути за разделом я устал набирать все это, и поэтому я записал макрос клавиатуры ... C-x ( C-M-f C-x C-e C-x ), а затем C-x e ..., который дал мне сообщение в минибуфере ( Я думаю, что я использую правильное имя), говоря (Type e to repeat macro). Это означало, что я больше не мог видеть результирующее значение оценки каждого раздела кода ... что, хотя и не критично в этом случае, мне нравилось иметь.

Что приводит меня к актуальному вопросу:

Есть ли способ отключить это сообщение и / или заставить минибуфер показывать несколько строк одновременно?

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

Спасибо!

  • Lindes

* - проблема, которая на самом деле не является моим вопросом, заключается в том, что (require 'ruby-mode/ruby-mode) завершается неудачей, даже если emacs определенно и успешно (для отслеживания системных вызовов) открывает и читает файл ruby-mode.el. Я предполагаю, что это потому, что строка provide говорит просто 'ruby-mode. Я нашел решение для этого, но если кто-то может указать мне на какие-либо "лучшие практики", я был бы признателен.

Ответы [ 5 ]

3 голосов
/ 25 мая 2010

(Позвольте мне сначала сказать: это самый ясный вопрос, который я читал здесь в течение долгого времени!

Вы можете нажать F4, чтобы запустить макрос. Это примерно то же самое, что и C-x e, за исключением того, что оно не включает это сообщение!

1 голос
/ 28 мая 2010

Чтобы уточнить ответ Линде , я бы реализовал его следующим образом:

(require 'cl) ; for flet
(add-to-list 'minor-mode-alist '(kmacro-repeat-mode " MACRO-REPEAT!"))
(defadvice kmacro-call-macro (around kmacro-call-macro-without-message activate)
  "run kmacro-call-macro without any messages"
  (flet ((message (&rest args)))
    (let ((kmacro-repeat-mode t))
      ad-do-it)))

Я вытащил модификацию minor-mode-alist, потому что нет причин делать это несколько раз. Остальные используют let и flet для выполнения временного связывания, которое является более чистым и безопасным при наличии нелокальных выходов .

Лично я бы не стал использовать этот совет, потому что он отключает функцию message на время макроса, что означает, что все макросы, которые на самом деле используют message, больше не будут работать так же , Я бы, наверное, просто пошел с отредактированной версией kmacro-call-macro . Конечно, вы могли бы обернуть вызов к сообщению переменной, которая могла бы выборочно сообщать вместо этого.

1 голос
/ 25 мая 2010

Чтобы полностью отключить эту функцию, вы можете добавить это к вашему .emacs:

(setq kmacro-call-repeat-key nil)

Невозможно (в настоящее время) сохранить включенную функциональность, но без сообщения.

1 голос
/ 25 мая 2010

Я не знаю о вашем вопросе "скрыть сообщения".

Что касается функций и функций require / Обеспечить, то обычной практикой, хотя я бы не стал так называть его «лучшим», было бы называть файл .el тем же, что и «предоставляемым» им.

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

(require 'feature-name  "name-of-el-file-that-provides-feature.el")

Файл .el должен находиться на вашем пути загрузки.

0 голосов
/ 27 мая 2010

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

У меня была мысль, что было бы неплохо, чтобы что-то отображалось в строке режима вместо сообщения, так что ...

Я прочитал (некоторую доступную в Интернете версию) исходный код для kmacro-call-macro , elisp Minor Mode Conventions и другие веб-страницы. Я попробовал некоторые вещи. Я сделал некоторую отладку. И, наконец, я придумал этот (несовершенный - подробнее об этом ниже) фрагмент elisp:

;;;;; change kmacro-call-macro (C-x e) to not generate any messages,
;;;;; and instead add a minor mode to the modeline
(defadvice kmacro-call-macro (around kmacro-call-macro-without-message activate)
  "run kmacro-call-macro without any messages"
  (fset 'saved-message (symbol-function 'message))
  (unless (assq 'kmacro-repeat-mode minor-mode-alist)
    (setq minor-mode-alist
          (cons '(kmacro-repeat-mode " MACRO-REPEAT!") minor-mode-alist)))
  (setq kmacro-repeat-mode t)
  (defun message (format-string &rest args))
  ad-do-it
  (fset 'message (symbol-function 'saved-message))
  (setq kmacro-repeat-mode nil))

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

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

Я полагаю, что другое решение - переписать kmacro-call-macro, чтобы в основном включить эту функцию, возможно, с другой переменной настройки для управления ею. Я полагаю, что при этом также будет отображаться дополнительная информация (клавиша для повтора; информация о количестве повторов), которая содержится в сообщении. Возможно, это даже возможно с помощью defadvice? Может быть, влияет на значение ad-return-value через переопределенную функцию сообщения или что-то в этом роде?

Во всяком случае, приведенный выше код был добавлен в мой файл .emacs, и, надеюсь, когда-нибудь будет доработан, когда я немного лучше разбираюсь в elisp и его лучших практиках.

Я надеюсь, что кто-то еще найдет это полезным.

Опять же, улучшения этого приветствуются.

редактирование:

У меня изначально было:

  (defun message (s &optional rest stuff))

, который действительно должен был быть (а теперь и выше):

  (defun message (format-string &rest args))

Вот надеемся, что это решит проблемы! Это достаточно прерывисто, и я считаю, что слишком рано говорить ...

...