Emacs не удается выполнить выравнивание в режиме plsql - PullRequest
1 голос
/ 23 ноября 2011

Я использовал PL / SQL режим , доступный на EmacsWiki , и я был весьма доволен этим.

Но когда я пытаюсь align или align-current, я просто получаю сообщение об ошибке:

align: Wrong type argument: sequencep, plsql-align-rules-list

Пример кода, который я пытаюсь выровнять:

declare
  foo number;
  x number;
  y number;
begin
  foo :=     5;
  x := 123;
  y:=123;
end;

Ожидаемый результат:

declare
  foo number;
  x number;
  y number;
begin
  foo := 5;
  x   := 123;
  y   := 123;
end;

Вот соответствующая (я надеюсь) часть кода режима plsql:

;;;_  + Align

;; Should I make so that anything that is highlighted will line up?
;; Should we make a block anything inside ()?

(eval-and-compile

  (defcustom plsql-align-rules-list '()  ""
    :group 'plsql
    :type  'align-rules-list-type)

  ;; Should I make so that anything that is highlighted will line up?
  ;; Should we make a block anything inside ()?

  (when (condition-case nil
            (require 'align)
          (error nil))

    ;; these are way too slow to use with indent before aligning
    (unless (and  plsql-align-rules-list plsql-debug)
      (setq plsql-align-rules-list
            '(
              (plsql-assignment
               (regexp . "\\(\\s-*\\):=\\(\\s-*\\)")
               (group  . (1 2))
               (modes  . '(plsql-mode))
               (repeat t)
               (tab-stop  .  nil))

              (plsql-arrorw
               (regexp . "\\(\\s-*\\)=>\\(\\s-*\\)")
               (group  . (1 2))
               (modes  . '(plsql-mode))
               (repeat t)
               (tab-stop  .  nil))

              (plsql-equals ;; exclude the previous two cases
               (regexp . "\\(\\s-*[^:]\\)=\\([^>]\\s-*\\)")
               (group  . (1 2))
               (repeat t)
               (tab-stop . nil)
               (modes    . '(plsql-mode)))

              (plsql-operator ;; watch out for comments
               (regexp . "\\(\\s-*\\)[-+/]{1}\\(\\s-*\\)")
               (group  . (1 2))
               (repeat t)
               (tab-stop . nil)
               (modes    . '(plsql-mode)))

              (plsql-keywords
               (regexp . "\\(\\s-+\\)\\(in\\|default\\|number\\|varchar2\\|blob\\|raw\\)\\b")
               (group 1)
               (repeat t)
               (case-fold t)
               (tab-stop . nil)
               (modes    . '(plsql-mode)))
              )
            ))

    (put 'plsql-align-rules-list 'risky-local-variable t)
    (add-to-list 'align-c++-modes 'plsql-mode) ;; eg expression functions ...
    (add-to-list 'align-sq-string-modes 'plsql-mode)
    (add-to-list 'align-open-comment-modes 'plsql-mode)

    ;; Should we re-bind new-line-and-indent to align the current
    ;; region? That sounds expensive.
    ))

и позже в defun plsql-mode ():

(set (make-local-variable 'align-mode-rules-list) 'plsql-align-rules-list)

Как изменить режим plsql, чтобы align заработал? Мой лучший обходной путь - использовать align-regexp (вдохновленный этим ответом ):

(defun my-align ()
  ""
  (interactive)
  (align-regexp
   (region-beginning) (region-end)
   "\\(\\s-*\\):=" 1 1 nil))

Это хорошо, за исключением того, что оно не изменяет правую часть.

Автор больше не использует режим. Я использую emacs 23.2.1.

1 Ответ

0 голосов
/ 18 августа 2014

Насколько я понимаю, функция plsql-mode должна содержать:

(set (make-local-variable 'indent-line-function) 'plsql-indent)
(set (make-local-variable 'indent-region-function) 'plsql-indent-region)
(set (make-local-variable 'align-mode-rules-list) plsql-align-rules-list)

Поскольку первые две локальные переменные буфера действительно являются ссылками на функции, их аргумент должен быть символом в кавычках.Так как третий должен использовать значение, содержащееся в переменной plsql-align-rules-list, эта переменная НЕ должна заключаться в кавычки.

HTH) jack (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...