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

时间:2018-03-12 10:00:51

标签: r emacs ess

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

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

RStudio

中的

  

当我输入文字libr,然后按TAB我得到library()

在parentesis内部

  当我输入" tidyv"那样:library(tidyv)   然后TAB我得到library(tidyverse)

请您按照简单的步骤描述我如何在emacs ess中做同样的事情?

由于

圣拉斐尔

2 个答案:

答案 0 :(得分:3)

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

在回复评论时,ess-use-company是您应在配置中设置为t的变量,而不是使用 M-x 调用的函数。我假设您有一个init文件,如果没有,您可以轻松找到相关信息。无论你在init文件中保存ess的配置,你都可以添加(虽然这是默认值,所以除非你设置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 - / ,你应该得到包完成。

答案 1 :(得分:1)

好的,所以我让它为我工作,很好地完成了以下设置和步骤:

  • Windows 10 x64
  • R 3.4.3 x64
  • 正常安装Emacs 25 x64
  • init.el
  • 中启用了MELPA repo
  • package-install [RET] company
  • package-install [RET] ess
  • 在某个目录中打开一个新的R文件
  • M-x company-mode在当前缓冲区中启用company-mode
  • `C-c C-z'开始一个劣质的R过程(没有这个就行不通)

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

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

enter image description here

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

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

通过以下方式全局启用公司模式:

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