【问题标题】:Adding a new functionality to TAB for Clojure mode为 Clojure 模式向 TAB 添加新功能
【发布时间】:2013-01-31 18:46:49
【问题描述】:

我知道 TAB 想在 Emacs 中变得聪明。然而,它对我的​​口味还不够聪明。而且因为它“智能”,所以扩展起来似乎很复杂。

我希望 Clojure 模式下的 TAB 完全按照它的行为行事,例外当我在位于第 0 列的 defn, defmacro 等的第一个括号中时。

当它在那里时,我希望它改为从 hs-minor-mode 调用 hs-toggle-hiding

但是我越来越疯狂地试图让它工作。

我首先尝试修改分配给 TAB 的快捷方式,以便仅在 Clojure 模式下时,它会首先调用我的函数,然后调用 indent-for-tab-command 但更改 TAB快捷方式似乎非常复杂。而且由于 Emacs 已经计划好模式可以在 lisp-indent-function 中注册其 TAB 函数的情况,我希望修改 clojure-indent-function,它说:

(defun clojure-indent-function (indent-point state)
  "This function is the normal value of the variable `lisp-indent-function'.

然而,这个函数显然只有在光标位于函数内部时才被调用。不是当光标位于第一个 '(' 上时,比如 "(defn ...")。

在 Clojure 模式下并在括号中指向第 0 列时,如何让 TAB 调用 hs-toggle-hiding

我不希望这影响 org-mode 或任何其他模式。只是 Clojure 模式。

【问题讨论】:

  • TABM-x describe-mode 中绑定到什么?

标签: emacs clojure tabs


【解决方案1】:

一般的答案是:

(eval-after-load 'clojure-mode
  '(define-key clojure-mode-map [tab] 'my-tab-command))

正如你所描述的,定义:

(defun my-tab-command (&optional arg)
  (interactive "P")
  (if (and (zerop (current-column)) (eq (char-after) ?\())
      (hs-toggle-hiding)
    (indent-for-tab-command arg)))

【讨论】:

    【解决方案2】:

    clojure-indent-functionlisp-indent-function 的实现,它不是应该缩进,而是计算缩进。任何对可能的缩进感兴趣的代码都可以随时调用它,所以我们当然不想将我们想要的 TAB 行为挂钩到这个地方。

    考虑到 TAB 的智能性,这可能不是您想要的有趣点,最好重新绑定 TAB 以将我们的逻辑放在 all 可能的聪明:

    (defun clojure-hs-tab (arg)
      (interactive "P")
      (if (and (<= (current-column) 1)
               (save-excursion
                 (beginning-of-line)
                 (looking-at "\(")))
          (hs-toggle-hiding)
        (indent-for-tab-command arg)))
    
    (define-key clojure-mode-map (kbd "TAB") 'clojure-hs-tab)    
    

    我冒昧地修改了您的要求并允许第 1 列, 因为那是 hs-toggle-hiding 隐藏后放置点的地方。您不想通过第二次 TAB 按键来取消隐藏吗?

    “标签智能”的下一个级别是indent-line-function 多变的。这就是 完成或缩进选项卡时调用的内容 决定缩进而不是完成。有一个强大的 不在这里使用它的原因:indent-line-function 可能会被调用 多次缩进区域。即使我们决定我们想要 仅覆盖缩进和完成的 indent 行为 TAB,建议indent-for-tab-command (在全球范围内提供建议并检查major-mode 只做我们想做的事 在那种模式下)。

    【讨论】:

    • 哦,非常感谢。这对我来说是全新的,令人惊奇的是:在 Emacs 中做事似乎有无穷无尽的方法,所以当你开始时,并不总是很容易找到从哪里开始 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2011-04-20
    • 2010-09-07
    相关资源
    最近更新 更多