2009-06-17 2 views
1

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

Я настроил горячие клавиши для трех методов 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 набором, начальным -каталог на заданном пути (сгенерированный путем просмотра того, что такое имя-буфер-файл). Но я пока еще не увенчался успехом!

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

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

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

ответ

1

Отказ от ответственности: я не установил 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-interactively, вы получите запрос.

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

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

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

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

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

Кроме того, это вообще хорошая идея, чтобы связать нажатия клавиш с названиями команд, а не обнажать лямбды, по двум причинам: во-первых, если вы когда-нибудь сделать C-h k (M-x describe-key), вы получите имя значимого команды, и второй, если/когда вы изменяете функцию, вы можете сделать это, не забирая также привязку.

+0

Сладкий, ваш совет полностью помог мне. Я добавил, что просто добавил (call-interactiveively 'blah) к моей первоначальной попытке, и это сработало. То, что я действительно хотел сделать, было чем-то действительно интересным, например, иметь функцию-оболочку, которая возвращала оператор лямбда, который устанавливал каталог, а затем вызывал данную функцию.Но я предполагаю, что это невозможно из-за того, как emacs-lisp выполняет обзор (аргумент, предоставляемый оболочке, выходит из области действия в возвращаемом заявлении лямбда). Может быть, есть другой способ подумать об этой проблеме на земле emacs-lisp? – jdizzle

+0

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

Смежные вопросы