【问题标题】:how set comment-start and comment-end in a emacs minor mode?如何在 emacs 次要模式下设置注释开始和注释结束?
【发布时间】:2013-01-07 17:00:50
【问题描述】:

我正在尝试为Twig 创建一个次要模式,语法与 django 非常相似,我想更改评论样式的值以使用 {# 和 #}

如果我这样做了

(setq comment-start "{#")
(setq comment-end "#}") 

运行正常,但是当更改为 lisp 模式时,注释端仍然是“#}”而不是“”

代码是here

谢谢

【问题讨论】:

  • 听起来你应该创建一个派生的主要模式。
  • @tripleee 会有什么帮助?
  • 因为这样你就有了一种机制,只适用于该模式处于活动状态的缓冲区。听起来像可用的 Django 模式之一将是一个很好的起点; code.djangoproject.com/wiki/Emacs

标签: emacs lisp elisp


【解决方案1】:

您需要通过添加以下内容使它们成为buffer-local

(set (make-local-variable 'comment-start) "{#")
(set (make-local-variable 'comment-end) "#}")

define-minor-mode 正文。

【讨论】:

    【解决方案2】:

    您可以按照how to change the cursor based on a minor mode 上的答案进行操作:

    (defvar twig-mode-previous-comments nil
      "Storage for comment start/end that was before twig mode was enabled")
    (define-minor-mode twig-mode "twig" :lighter ""
      (unless twig-mode-previous-comments
        (set (make-local-variable 'twig-mode-previous-comments) (cons comment-start comment-end)))
      (if twig-mode
          (progn
            (set (make-local-variable 'comment-start) "{#")
            (set (make-local-variable 'comment-end) "#}"))
        (setq comment-start (car twig-mode-previous-comments))
        (setq comment-end (cdr twig-mode-previous-comments))))
    

    【讨论】:

    • 您可以简单地使用defvar-local,而不是使用defvar + make-local-variable
    • @Daimrod defvar-local 不是 Emacs 内置的,以及实现类似功能的包(例如 ediff-defvar-local 只需使用 defvarmake-variable-buffer-local 即可)
    • 它不是内置的,但它在subr.el 中定义,它是 GNU Emacs 的一部分,对我来说足够接近™。不管怎样,你的版本也可以。
    • @Daimrod 嗯...有趣,我在我的 24.2 副本(刚刚下载)中没有看到它,但它在存储库中(从 5 月开始)。
    • @Trey Jackson:defvar-local(以及其他类似的命令,如setq-local)是尚未发布的 Emacs 24.3 中的新功能。
    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    相关资源
    最近更新 更多