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

emacs ess : how to auto complete library function

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

对于我的问题,我将使用一个简单的 RStudio 示例 如果你能告诉我如何做同样的事情,我将不胜感激 emacs ess(目的当然是泛化):

RStudio

when i type the text libr and then press TAB I get library()

括号内

when i type "tidyv" like that: library(tidyv) and then TAB i get library(tidyverse)

你能用简单的步骤描述一下我如何在 emacs ess 中做同样的事情吗?

谢谢

拉斐尔

好的,所以我让它为我工作,通过以下设置和步骤非常好:

  • Windows 10 x64
  • R 3.4.3 x64
  • Emacs 25 x64 安装正常
  • MELPA 存储库已在 init.el
  • 中启用
  • package-install [RET] company
  • package-install [RET] ess
  • 在某个目录中打开一个新的 R 文件
  • M-x company-mode 在当前缓冲区中启用 company-mode
  • `C-c C-z' 启动劣质 R 进程(没有这个将无法工作)

此时,autocomplete会自动弹出R对象的补全建议。必须为括号内触发自动完成。假设我的光标位于 shiny:runApp() 的函数括号内。要获得函数参数的补全建议,我需要 运行 命令 company-complete.

您使用 M-x company-completeM-x company-complete-common 执行此操作,您应该会看到以下内容:

我决定在 init.el 中使用以下行将其绑定到 Shift-Tab:

(global-set-key (kbd "<backtab>") 'company-complete-common)

并在全球启用公司模式:

(add-hook 'after-init-hook 'global-company-mode)

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

针对评论,ess-use-company 是您应该在配置中设置为 t 的变量,而不是使用 M-x[=44 调用的函数=].我假设您有一个 init 文件,如果没有,您可以轻松找到相关信息。无论你将 ess 的配置保存在你的 init 文件中的什么地方,你都可以添加(尽管这是默认设置,所以除非你设置 ess-use-auto-complete,否则这可能已经设置)

(setq ess-use-company t)

每个模式都有一个钩子,它是在缓冲区中设置后运行的函数,允许用户自定义模式。您可以使用 (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))

使用

启动 emacs
emacs -Q -l /path/to/this/init.el

打开一个 R 文件,启动劣质 R 进程,然后输入 library(ti M-C-/ 你应该得到包完成。