Оборачивание цитируемой функции в emacs-lisp

StackOverflow https://stackoverflow.com/questions/1007568

  •  06-07-2019
  •  | 
  •  

Вопрос

Я использую расширение cscope emacs (и нахожу его весьма полезным). К сожалению, это поведение по умолчанию поиска только в текущем каталоге и ниже, для меня недостаточно, поэтому я использую cscope-set-initial-directory в каталог по своему выбору. К сожалению, этого также стало недостаточно для меня, потому что у меня есть несколько разных проектов, каждый из которых имеет собственный " начальный " каталог.

Я установил горячие клавиши для трех методов cscope, которые я чаще всего использую в emacs

(global-set-key [f9] 'cscope-find-this-text-string)
(global-set-key [f8] 'cscope-find-global-definition)
(global-set-key [f7] 'cscope-find-this-symbol)

Я подумал, что было бы довольно легко каким-то образом обернуть эти вызовы функцией для запуска cscope-set-initial-directory по заданному пути (сгенерированному, посмотрев, что такое имя-буфера-файла). Но я пока что потерпел неудачу!

(global-set-key [f9] (lambda () (interactive) (cscope-set-initial-directory "blah") 'cscope-find-this-text-string))

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

Может кто-нибудь помочь? :)

Это было полезно?

Решение

Отказ от ответственности: я не установил cscope, поэтому не могу проверить это.

(global-set-key (kbd "<f9>") 'my-cscope-find-this-text-string)
(defun my-cscope-find-this-text-string (dir)
  (interactive "DRoot area to start search:")
  (let ((default-directory dir))
    (call-interactively 'cscope-find-this-text-string)))

Основная идея заключается в том, что вы хотите предложить начать каталог: это призыв к интерактиву. Затем вы устанавливаете каталог: оператор let сделает это за вас. Затем вы вызываете оригинальную подпрограмму, которую хотите, и, вызывая ее с помощью 'call-интерактивно , получаете запрос.

Вы бы обернули другие две процедуры аналогично.

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

Что касается вашего первоначального решения, это была хорошая попытка. Большинство из них не осознают, что 'interactive превращает функцию в команду. Причина, по которой цитируемое имя не работает для вас, состоит в том, что цитата просто говорит интерпретатору трактовать символ как символ и ничего не делать с ним. Чтобы вызвать процедуру, вы обычно делаете:

(lambda ()
    (c-scope-find-this-text-string "some-string"))

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

Кроме того, обычно лучше связывать нажатия клавиш с именами команд, а не с простыми лямбдами, по двум причинам: во-первых, если вы когда-либо выполняете Ch k ( Mx description- клавиша ), вы получите значимое имя команды, и, во-вторых, если / когда вы измените функцию, вы можете сделать это без необходимости связываться с привязкой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top