emacs ess:如何自动完成库函数

Raf*_*ori 3 emacs r ess

我正在尝试从 RStudio 迁移到 emacs ess,现在我正在尝试在 emacs ess 中找到类似于 Rstudio 的自动完成功能

对于我的问题,我将使用一个简单的 RStudio 示例,如果您能告诉我如何在 emacs ess 中执行相同的操作,我将不胜感激(目的当然是概括):

RStudio

当我输入文本libr然后按 TAB 时我得到library()

括号内

当我像这样输入“tidyv”时:library(tidyv) 然后按 TAB 键我得到library(tidyverse)

您能否以简单的逐步方式描述我如何在 emacs ess 中执行相同的操作?

谢谢

拉斐尔

pic*_*ick 5

在最近添加后端后,这应该适用于默认的公司后端。您只需要从 melpa 更新您的 ESS。如果company-R-library不是company-backendsESS 缓冲区的一部分,只需将其添加到 ESS 模式挂钩中。请注意,您应该已经设置了ess-use-company.

作为对评论的回应,ess-use-company是您应该在配置中设置的变量t,而不是使用M-x. 我假设您有一个初始化文件,如果没有,您可以轻松找到有关该文件的信息。无论您将 ess 的配置保存在 init 文件中的何处,您都可以添加(尽管这是默认设置,所以除非您设置ess-use-auto-complete,否则这可能已经设置)

(setq ess-use-company t)
Run Code Online (Sandbox Code Playgroud)

每个模式都有一个钩子,它是在缓冲区中设置后运行的函数,允许用户自定义模式。您可以使用 添加这样的挂钩(add-hook 'ess-mode-hook 'my-ess-mode-hook),其中my-ess-mode-hook是您使用自定义编写的函数,例如。(company-mode)除非你在全球范围内打开了它(最有可能)。

company-backends也是一个变量,您可以从 ESS 缓冲区中输入M-:company-backends来计算 Lisp 代码以查看该变量的值。确保从 melpa 重新安装最新版本的 ESS。

编辑:完整的初始化测试——company-R-library可能尚未添加到默认后端

(setq-default package-archives 
              '(("melpa"        . "http://melpa.milkbox.net/packages/")
                ("gnu"          . "http://elpa.gnu.org/packages/")))
(setq package-enable-at-startup nil)
(package-initialize)

;;; company
(require 'company)
(setq tab-always-indent 'complete)

(setq company-idle-delay 0.5
      company-show-numbers t
      company-minimum-prefix-length 2
      company-tooltip-flip-when-above t)

(global-set-key (kbd "C-M-/") #'company-complete)
(global-company-mode)

;;; ESS
(defun my-ess-hook ()
  ;; ensure company-R-library is in ESS backends
  (make-local-variable 'company-backends)
  (cl-delete-if (lambda (x) (and (eq (car-safe x) 'company-R-args))) company-backends)
  (push (list 'company-R-args 'company-R-objects 'company-R-library :separate)
        company-backends))

(add-hook 'ess-mode-hook 'my-ess-hook)

(with-eval-after-load 'ess
  (setq ess-use-company t))
Run Code Online (Sandbox Code Playgroud)

启动 emacs

emacs -Q -l /path/to/this/init.el
Run Code Online (Sandbox Code Playgroud)

打开一个 R 文件,启动下级 R 进程,然后键入library(ti M-C-/,您应该会得到包完成结果。