【问题标题】:Fix undesirable EMACS tabbing behavior in ESS/Stata修复 ESS/Stata 中不受欢迎的 EMACS 选项卡行为
【发布时间】:2011-12-25 13:01:38
【问题描述】:

emacs 中的 ESS/Stata 模式错误地缩进以运算符结尾的行之后的行。它似乎错误地将这些行解释为多行命令。

例如:

gen foo = 1

/* generate another variable */
  gen bar = 1

“gen bar = 1”行不应缩进。看起来 EMACS 将注释中的斜杠解释为运算符,并认为这行代码跨越两行。

实际上,stata 中的多行命令有 3 个尾部斜杠,而没有 3 个尾部斜杠的换行符表示语句的结束。例如以下缩进是正确的:

gen bar = 1
gen ///
  foo = 1

我可以在我的 .emacs 中添加一些东西来纠正这种行为吗?我不想完全放弃自动制表符——它适用于除 /* 看起来像这样 */ 的 cmets 之外的所有内容。

谢谢,

Pnj

【问题讨论】:

    标签: emacs indentation ess


    【解决方案1】:

    你是对的,ESS 将尾随的 / 解释为行继续的指示。这被硬编码到函数ess-continued-statement-p 中,因此要修改行为,您必须重写代码。以下代码(在您的 .emacs 中)适用于您的示例。

    (eval-after-load 'ess-mode
      '(defun ess-continued-statement-p ()
       "this is modified code"
         (let ((eol (point)))
           (save-excursion
             (cond ((memq (preceding-char) '(nil ?\, ?\; ?\} ?\{ ?\]))
                    nil)
                   ;; ((bolp))
                   ((= (preceding-char) ?\))
                    (forward-sexp -2)
                    (looking-at "if\\b[ \t]*(\\|function\\b[ \t]*(\\|for\\b[ \t]*(\\|while\\b[ \t]*("))
                   ((progn (forward-sexp -1)
                           (and (looking-at "else\\b\\|repeat\\b")
                                (not (looking-at "else\\s_\\|repeat\\s_"))))
                    (skip-chars-backward " \t")
                    (or (bolp)
                        (= (preceding-char) ?\;)))
                   (t
                    (progn (goto-char eol)
                           (skip-chars-backward " \t")
                           (or (and (> (current-column) 1)
                                    (save-excursion (backward-char 1)
    
            ;;;; Modified code starts here: ;;;;
                                                    (or (looking-at "[-:+*><=]")
                                                        (and (looking-at "/")
                                                             (save-excursion (backward-char 1)
                                                                             (not (looking-at "*")))))))
            ;;;; End of modified code ;;;;
    
                               (and (> (current-column) 3)
                                    (progn (backward-char 3)
                                           (looking-at "%[^ \t]%")))))))))))
    

    【讨论】:

    • defadvice 在这里可能是更干净的选择。
    • Tyler,我将您的代码复制到了我的 .emacs 中,但行为没有改变。我的 Messages 缓冲区中没有错误或任何明显的东西。我可以做些什么来帮助诊断?
    • 如果您将文档字符串添加到重新定义的函数中,您可以检查它是否已加载C-h f ess-continued-statement-p。如果您没有看到 doc-string,则不会对修改后的代码进行评估。这表明eval-after-load 命令运行了一些东西,例如引用了错误的模式。我将在上面添加一个文档字符串。
    • describe-function ess-continued-statement-p 返回 ess-continued-statement-p is a compiled Lisp function in ess-mode. not documented
    • 仅供参考,我注意到当我以这种模式加载文件时,我收到一条错误消息 File mode specification error: (void-function run-mode-hooks)。即使没有将上述代码插入到我的 .emacs 中,也会发生这种情况。我将其解释为版本问题,但这可以解释为什么不调用覆盖的函数吗?
    猜你喜欢
    • 1970-01-01
    • 2019-09-25
    • 2021-02-20
    • 2010-10-21
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    相关资源
    最近更新 更多