Я использовал 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.