Как вы можете заставить макрос emacs ждать результатов запроса cscope? - PullRequest
1 голос
/ 01 июня 2010

Я пытаюсь написать макрос, который вызывает cscope-find-functions-calling-this-function для каждого тега в файле, отображаемом в буфере *Tags List* (создан командой list-tags). Это должно создать буфер, который содержит список всех функций, вызывающих набор функций, определенных в определенном файле.

Я просто помещаю точку в начале первого тега в буфере Tags List , а затем запускаю следующий макрос клавиатуры, чтобы сделать это. Это последовательность нажатий клавиш в макросе клавиатуры:

1.  <f11>              ;; cscope-find-functions-calling-this-function                                                                                                           
2.  RET                ;; newline      [shows results of cscope in a split window]
3.  C-x C-p            ;; mark-page
4.  C-x C-x            ;; icicle-exchange-point-and-mark
5.  <up>               ;; previous-line
6.  <end>              ;; end-of-line             [region to copy has been marked]
7.  <f7>               ;; append-results-to-buffer
8.  C-x ESC O          ;;                 [move back to split window on the right]
9.  C-x b              ;; icicle-buffer        [Switch back to *Tags List* buffer]
10. *Tags              ;; self-insert-command * 5
11. SPC                ;; self-insert-command
12. List*              ;; self-insert-command * 5
13. RET                ;; newline
14 . <down>            ;; next-line       [Position point on next tag in the list]

Проблема: Я не получил результатов в буфере, и я обнаружил, что это потому, что шаги 3-7 выполняются еще до cscope печатает результаты запроса, выполненного на шагах 1-2.

Я могу вставить паузу в макрос, используя C-x q, но я бы предпочел, чтобы макрос ждал после шага 2, пока cscope не вернулся с результатами, а затем продолжил автоматически. Я подозреваю, что это невозможно с помощью макроса, может быть, функции LISP ... Я сам не эксперт по LISP. Может кто-нибудь, пожалуйста, помогите? Спасибо!


подробности:

  • У меня Сосульки установлено так, по умолчанию я получаю слово в текущем буфере в качестве ввода в минибуфере.
  • F11 связан с cscope-find-functions-calling-this-function
  • windmove установлен, и C-x (C-x ESC o - как показано ниже) приведет вас к правое окно.
  • F7 связан с append-results-to-buffer что определяется как:
(defun append-results-to-buffer ()
  (interactive)
  (append-to-buffer (get-buffer-create "c1") (point) (mark)))

Эта функция просто добавляет текущую отмеченную область в буфер с именем "c1".

1 Ответ

2 голосов
/ 01 июня 2010

CEDET Suite имеет поддержку cscope в cedet-cscope.el, которая синхронно вызывает cscope. Вероятно, вы можете позаимствовать что-нибудь из макроса клавиатуры.

В качестве альтернативы, вы можете использовать инструмент CEDET symref (semantic-symref-symbol), чтобы выполнять тяжелую работу над CScope. Он также может использовать GNU Global или IDUtils.

...