Как обернуть align-regexp для конкретного регулярного выражения в emacs - PullRequest
4 голосов
/ 14 февраля 2012

Я часто использую align-regexp с регулярным выражением "[^] + _" для региона.Поэтому я решил определить для него функцию, чтобы связать ее с ключом:

(defun align-members ()
  (interactive)
  (align-regexp " [^ ]+_"))

Но emacs жалуется, что align-regexp принимает три параметра.Глядя на документы, я вижу, что это требует BEG и END.Я не уверен, как работает (interactive) в emacs, но прочитав документацию, которую я собираю, я должен был сделать следующее:

(defun align-members (BEG END)
  (interactive "r")
  (align-regexp BEG END " [^ ]+_"))

Но тогда emacs жалуется где-то глубоко в стеке вызовов align-regexp, что оножидается integer-or-marker-p и вместо этого получил ноль.Что я делаю не так?

Ответы [ 4 ]

4 голосов
/ 14 февраля 2012

Вы должны написать следующее

(defun align-members (BEG END)
  (interactive "r")
  (align-regexp BEG END (concat "\\(\\s-*\\)" " [^ ]+_") 1 1))

или немного проще

(defun align-members (BEG END)
  (interactive "r")
  (align-regexp BEG END "\\(\\s-*\\) [^ ]+_" 1 1))

Чтобы понять это, взгляните на align-regexp источник, здесь есть его часть.

(interactive
 (append
  (list (region-beginning) (region-end))
  (if current-prefix-arg
      (list (read-string "Complex align using regexp: "
                         "\\(\\s-*\\)")
            (string-to-number
             (read-string
              "Parenthesis group to modify (justify if negative): " "1"))
            (string-to-number
             (read-string "Amount of spacing (or column if negative): "
                          (number-to-string align-default-spacing)))
            (y-or-n-p "Repeat throughout line? "))
    (list (concat "\\(\\s-*\\)"
                  (read-string "Align regexp: "))
          1 align-default-spacing nil))))

Как видите:

  • добавляет строку "\\(\\s-*\\)" к вашему регулярному выражению
  • устанавливает 1 и align-default-spacing в необязательные параметры
2 голосов
/ 28 мая 2012

Ответ Олега в порядке.

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

Это общая тема для команд Emacs.

Теперь, когда вы вызываете align-regexp программно,нет необходимости предлагать вам кратчайший путь, поскольку, по-видимому, программист хочет получить полный контроль по умолчанию.

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

В этом случае вы должны увидеть что-то вроде:

(align-regexp 185 320 "\\(\\s-*\\)" [^ ]+_" 1 1 nil)
0 голосов
/ 15 февраля 2015

С моей точки зрения, я не могу найти никаких group в вашем регулярном выражении.Отсутствие тестового шаблона у вас, я просто привожу свой пример.

Попробуйте выровнять код:

bit [4:0] a;
bit [16:0] b;

Кому:

bit [  4:0] a;
bit [ 16:0] b;

У меня есть такая рабочая функция, какэто с group:

(defun try-align ()
  (interactive)
  (let ((BEG (region-beginning))
        (END (region-end)))
    (align-regexp BEG END "\\[\\(.*:\\)" -1 1 0)))

Если вы удалите group, как показано ниже, он не будет работать:

(defun try-align ()
  (interactive)
  (let ((BEG (region-beginning))
        (END (region-end)))
    (align-regexp BEG END "\\[.*:" -1 1 0)))
0 голосов
/ 14 февраля 2012

В документации для align-regexp написано

Если был указан префикс arg, полное регулярное выражение с круглыми скобками пробел должен быть предоставлен

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

(defun align-members (beg end)
  (interactive "r")
  (align-regexp beg end "\\( \\)[^ ]+_"))
...