Как вызвать команду elisp для редактирования текущего буфера из пользовательской команды - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь создать собственную команду emacs для удаления пустых строк из региона. Я нашел интерактивный способ сделать это на masteremacs , используя эту команду:

M-x flush-lines RET ^\s-*$ RET

Поскольку мне приходится делать это часто, я хотел бы создать для него собственную команду, например итак:

(defun flush-empty-lines (start end)                                                                                                
  (interactive "*r")                                                                                                                
  (flush-lines "^\s-*$" start end))

Однако, когда я выбираю регион и делаю M-x flush-empty-lines RET, ничего не происходит. Я пытался настроить вызов flush-lines различными способами, например, передать границы региона и установить (INTERACTIVE t), но ничего не помогло.

В общем, требуется какой-то особый синтаксис для передачи управление от одной интерактивной функции к другой?

РЕДАКТИРОВАТЬ: Я изменил свой код в соответствии с комментарием @ Дрю (спасибо), но он все еще не работает.

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Должен заплатить налог обратно sh (это ошибка синтаксиса регулярного выражения, а не ошибка интерактивности):

(defun flush-empty-lines (start end)                                                                                                
  (interactive "*r")                                                                                                                
  (flush-lines "^\\s-*$" start end))
1 голос
/ 15 апреля 2020
Ответ

@ jpkotta, конечно, верен, но стоит указать repeat-complex-command, удобную функцию Emacs для повторения команд, которые читают хотя бы один из своих аргументов через минибуфер, поскольку он покажет вам точно как обрабатывались эти интерактивные аргументы.

  • Mx flush-lines RET ^\s-*$ RET
  • C -x M -: или C -x ES C ES C

, который затем выдает подсказку с кодом elisp:

Redo: (flush-lines "^\\s-*$" nil nil t)

Ваша проблема была только из-за синтаксиса, но эта функция становится еще более полезной, когда интерактивный ввод минибуфера отличается от эквивалентного аргумента elisp. Например:

Mx align-regexp RET foo RET

Redo: (align-regexp 655 848 "\\(\\s-*\\)foo" 1 1 nil)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...