Emacs: изменение отступа python.el в производном режиме

Я пытаюсь получить новый режим emacs из python.el (текущий официальный gnu) для Boo, и у меня возникают проблемы с изменением отступа. У кого-нибудь есть предложения о том, как лучше всего справиться с этим? Мне не нужно ничего кардинально менять, просто добавьте несколько новых блочных форм и прочее.

Например, поскольку это для Boo, в синтаксисе try / Кроме этого используется "гарантировать" вместо "наконец". Я могу изменить это достаточно легко в python.el, изменив def-block для python-rx-составляющих. Тем не менее, я не могу переопределить это в производном режиме, потому что python-rx-составляющие затем используются макросом python-rx, и я думаю, как только эти две вещи будут определены при загрузке python.el (как он должен, так как я унаследовал от него), я больше не могу переопределить его после загрузки или в ловушку? Потому что я определенно изменил это в памяти и в ловушке после загрузки python.el и в выражении после загрузки, и ни один из них не работает. Хотя напрямую изменяя python.el работает отлично.

Вот этот код из python.el:

(eval-when-compile
  (defconst python-rx-constituents
    `((block-start          . ,(rx symbol-start
                                   (or "def" "class" "if" "elif" "else" "try"
                                       "except" "finally" "for" "while" "with"
                                       )
                                   symbol-end))
      (decorator            . ,(rx line-start (* space) ?@ (any letter ?_)
                                   (* (any word ?_))))
      (defun                . ,(rx symbol-start (or "def" "class") symbol-end))
      (if-name-main         . ,(rx line-start "if" (+ space) "__name__"
                                   (+ space) "==" (+ space)
                                   (any ?' ?\") "__main__" (any ?' ?\")
                                   (* space) ?:))
      (symbol-name          . ,(rx (any letter ?_) (* (any word ?_))))
      (open-paren           . ,(rx (or "{" "[" "(")))
      (close-paren          . ,(rx (or "}" "]" ")")))
      (simple-operator      . ,(rx (any ?+ ?- ?/ ?& ?^ ?~ ?| ?* ?< ?> ?= ?%)))
      ;; FIXME: rx should support (not simple-operator).
      (not-simple-operator  . ,(rx
                                (not
                                 (any ?+ ?- ?/ ?& ?^ ?~ ?| ?* ?< ?> ?= ?%))))
      ;; FIXME: Use regexp-opt.
      (operator             . ,(rx (or "+" "-" "/" "&" "^" "~" "|" "*" "<" ">"
                                       "=" "%" "**" "//" "<<" ">>" "<=" "!="
                                       "==" ">=" "is" "not")))
      ;; FIXME: Use regexp-opt.
      (assignment-operator  . ,(rx (or "=" "+=" "-=" "*=" "/=" "//=" "%=" "**="
                                       ">>=" "<<=" "&=" "^=" "|=")))
      (string-delimiter . ,(rx (and
                                ;; Match even number of backslashes.
                                (or (not (any ?\\ ?\' ?\")) point
                                    ;; Quotes might be preceded by a escaped quote.
                                    (and (or (not (any ?\\)) point) ?\\
                                         (* ?\\ ?\\) (any ?\' ?\")))
                                (* ?\\ ?\\)
                                ;; Match single or triple quotes of any kind.
                                (group (or  "\"" "\"\"\"" "'" "'''"))))))
    "Additional Python specific sexps for `python-rx'")

  (defmacro python-rx (&rest regexps)
    "Python mode specialized rx macro.
This variant of `rx' supports common python named REGEXPS."
    (let ((rx-constituents (append python-rx-constituents rx-constituents)))
      (cond ((null regexps)
             (error "No regexp"))
            ((cdr regexps)
             (rx-to-string `(and ,@regexps) t))
            (t
             (rx-to-string (car regexps) t))))))

Я хотел бы изменить компоненты python-rx так, чтобы блок-старт включал "обеспечить" вместо "наконец".

2 ответа

Как уже отмечалось, использование производного режима здесь не подходит: вы не можете изменить макрос назад. Также переопределять его не рекомендуется: порядок загрузки / оценки, который будет определять, какой из них действует, - в большем масштабе, что означает столкновение с беспорядком.

Скопируйте файл, сохраните как boo.el, замените префикс на "boo-", перезагрузите и отредактируйте материал, который нужно изменить.

Ваша обеспокоенность выражается в том, что IMO неоправданна, поскольку разрешение копирования, изменения и повторного выпуска измененного кода является ядром GPL.

Копирование файла - плохая идея, потому что отследить эволюцию python.el больно. Деривация тоже не такая уж хорошая идея, поскольку Boo не является расширением или вариацией Python, поэтому вы, вероятно, захотите повторно использовать некоторые из его механизмов отступов и некоторый код, чтобы понять существенные отступы, но не намного чем это.

Возможно, вы захотите связаться с автором python.el (с Cc по emacs-devel), чтобы узнать, можно ли настроить python.el, чтобы сделать вашу жизнь проще. Например, возможно извлечь общий код во вспомогательный файл, который может быть разделен между ними. В идеале этот файл может быть использован для режима cofferscript и, возможно, для режима Haskell.

Другие вопросы по тегам