Сворачивание / идентификация текущего блока `ifdef в verilog-коде с использованием emacs - PullRequest
1 голос
/ 03 января 2012

Моя работа включает просмотр длинных кодов verilog, который включает блоки ifdef. Мой основной редактор - Emacs. Ниже приведен типичный пример:

module Foo(
...
...
);

// Inputs, Outputs
...

`ifdef CONDITION_1
...
...    
`else // CONDITION_1
...
...    
`ifdef CONDITION_2
...
...
`endif //CONDITION_2
...
...
     foo <= 1'b1;
...
...
`endif // CONDITION_1

Как видите, foo <= 1'b1; находится в блоке else ifdef CONDITION_1 Если предположить, что моя точка находится на линии foo <= 1'b1;, есть ли способ, которым я мог перейти к строке ifdef CONDITION_1 или свернуть код, чтобы я мог видеть CONDITION1 ? Я попытался использовать обратный инкрементальный поиск, но в этом случае я получаю ifdef CONDITION_2 Я попытался использовать режим скрытия-ifdef, но он идентифицирует #ifdef вместо `ifdef. Эти блоки не используют круглые скобки. И поэтому использование C-M-u не помогает

Ответы [ 2 ]

2 голосов
/ 03 января 2012

Это будет сделано, хотя для вашего примера выше он остановится на операторе

`else // CONDITION_1

, поскольку это то, что включает в себя присваивание foo:

(defun my-verilog-up-ifdef ()
  "Go up `ifdef/`ifndef/`else/`endif macros until an enclosing one is found."
  (interactive)
  (let ((pos (point)) (depth 0) done)
    (while (and (not done)
           (re-search-backward "^\\s-*`\\(ifdef\\|ifndef\\|else\\|endif\\)" nil t))
      (if (looking-at "\\s-*`endif")
          (setq depth (1+ depth))
        (if (= depth 0)
            (setq done t)
          (when (looking-at "\\s-*`if")
            (setq depth (1- depth))))))
    (unless done
      (goto-char pos)
      (error "Not inside an `ifdef construct"))))
2 голосов
/ 03 января 2012

Константа elisp hif-cpp-prefix управляет основным синтаксисом, который используется hide-ifdef-modeдогадываюсь , что вы можете определить это следующим образом.(Внимание, это не проверено, поскольку я сам не использую verilog.)

(setq hif-cpp-prefix "\\(^\\|\r\\)[ \t]*\\(#\\|`\\)[ \t]*")

Обратите внимание, что это определяется с использованием defconst вместо defvar, поэтому скомпилированная версия hide-ifdef-mode можетвсе еще используйте оригинальное значение.Загрузка некомпилированного файла в Emacs, вероятно, решит эту проблему.

...