【问题标题】:Emacs ESS indentation and auto-completionEmacs ESS 缩进和自动补全
【发布时间】:2014-07-29 03:45:13
【问题描述】:

在使用 ESS 模式时,有许多有用的变量可以控制 Emacs (R) 代码块中的 TAB 键缩进和完成。

ess-tab-complete-in-script 首先缩进行,如果没有要缩进的内容,则自动完成单词。

“能力越大,责任越大”,因此,在快速缩进代码时,您可能会在没有注意到灾难性结果的情况下完成代码。因此,您可以使用变量细化事物 ess-first-tab-never-complete。例如:如果'unless-eolTAB 仅在光标位于行尾时完成;如果'symbol,它也在一行的中间完成,但如果你在一个单词的中间,则不是;等(阅读文档了解更多 F1vess-first-tab-never-complete)。

问题是,至少对我来说,TAB 绑定到ess-noweb-indent-line,但控制缩进或完成行为的命令是:ess-indent-or-complete。所以我使用 fix 标签绑定:

(add-hook 'ess-mode-hook
 '(lambda()
    (local-set-key (kbd "<tab>") 'ess-indent-or-complete)
    ))

这行得通,但我想知道这是否是正确的方法。在手册中,我没有看到任何提示挂接到 ESS 模式并重置选项卡绑定。

您知道执行此操作的规范方法是什么吗?

【问题讨论】:

    标签: r emacs ess


    【解决方案1】:

    有几种合理的方法可以为特定模式设置 tab 键(或任何键)。您在回答中提到的第一个是通过模式挂钩在本地设置密钥。但请注意,通常最好使用命名函数而不是 lambda,这样您可以稍后删除钩子:

    (defun ess-keys-hook ()
      "Put a bunch of keybindings in here."
      (local-set-key [tab] 'ess-indent-or-complete))
    
    (add-hook 'ess-mode-hook 'ess-keys-hook)
    

    另一个选项是在相关模式映射中定义键,您可以这样做:

    (define-key ess-mode-map [tab] 'ess-indent-or-complete)
    

    这两种方式都非常常用,尽管我个人更喜欢后者,因为它让我觉得它更干净、更高效。

    【讨论】:

    • 当您提到移除挂钩时,您的意思是设置(add-hook 'ess-mode-hook nil),同时保留ess-keys-hook 以备将来可能需要吗?因为否则我总是可以删除/替换 lambda 函数。
    • 您将删除带有(remove-hook 'ess-mode-hook 'ess-keys-hook) 的钩子。
    猜你喜欢
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 2012-10-23
    • 1970-01-01
    相关资源
    最近更新 更多