【问题标题】:emacs ess : how to auto complete library functionemacs ess:如何自动完成库功能
【发布时间】:2018-08-20 07:25:23
【问题描述】:

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

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

RStudio

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

在父代内

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

您能否以简单的逐步方式描述我如何在 emacs ess 中做同样的事情?

谢谢

拉斐尔

【问题讨论】:

  • 这是一个微弱的帮助,因为一旦我的 emacs 执行了我想要的操作,我就会立即忘记我是如何让它工作的 :)。我已经添加:(需要'自动完成配置)(需要'自动完成)(ac-config-default)(setq ess-tab-complete-in-script t)到我的'.emacs'当然你需要在它工作之前先安装这些。
  • 我认为有一个针对此功能的拉取请求:github.com/emacs-ess/ESS/pull/502 用于一般自动完成,请参见此处:stackoverflow.com/questions/16075012/…
  • 谢谢 trosendal。将这些语句添加到我的 .emacs 文件确实为函数名称和参数提供了自动完成功能。但是,在库函数的情况下,没有为包名称提供自动完成。有什么想法吗?
  • 根据最近的文档,ess 更喜欢公司模式。但是,我根本无法让它工作。如果您弄清楚,将非常感谢任何信息。我正在运行 Windows 10 64 位、R 3.4.3 64 位

标签: r emacs ess


【解决方案1】:

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

作为对评论的回应,ess-use-company 是您应该在配置中设置为 t 的变量,而不是使用 M-x 调用的函数。我假设您有一个 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-/,你应该会得到包完成。

【讨论】:

  • 嗨。感谢您花时间回答。我从 melpa 安装了最新的 ess 和 company 软件包。当我输入 ALT-X ess-use-c 时,我在自动完成中找不到 uss-use-company 。 company-R-library 也是如此。由于我是一个非常新的 emacs 用户,因此我很可能不理解您的答案中处理将其添加到我的 ess 挂钩的部分。如果您能逐步提供如何操作,我将不胜感激。谢谢
  • 嗨@jenesaisquoi。我已将 (setq ess-use-company t) 添加到我的 emacs 并重新启动 emacs。并通过按 M-x company-mode 添加公司模式,当我输入 library( library(package= 然后 TAB 时,没有提供库的自动完成。我的 ess 版本是 17.11 有什么想法吗?
  • 您是否启动了一个低劣的 R 进程?完成来自正在运行的 R 进程
  • 嗨@jenesaisquoi。是的。打开一个名为 test.r 的缓冲区后,我按下工具栏上的 R 图标,然后发送 ls() 命令并得到响应。然后当我输入缓冲区库(或库(package= 然后 TAB 并且没有提供库的自动完成)时,您在原始回复中提到的 company-R-library 是什么,我如何验证它的存在?
  • 我已经写过如何在您的 ess 缓冲区中评估公司后端的价值。它不会在那里完成,但在“ti”之后它应该为 tidyr 等完成。它可能值得返回并修改后端以完成所有不带前缀的包,但对我来说似乎有点矫枉过正
【解决方案2】:

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

  • Windows 10 x64
  • R 3.4.3 x64
  • Emacs 25 x64 安装正常
  • init.el 中启用了 MELPA 存储库
  • 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 执行此操作,您应该会看到以下内容:

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

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

并通过以下方式在全球范围内启用公司模式:

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

【讨论】:

  • 嗨文斯。使用该配置可以自动完成以下内容吗? library(tidy + TAB 。预期的结果应该是 library(tidyverse)。由于某种原因,我找不到像这样自动完成包名称和 data.frames 字段名称的方法: iris %>% select(Spe + TAB 应该产生iris %>% select(Species)。在 RStudio 中它可以正常工作。谢谢
  • 不,这不起作用 :-(。我刚刚尝试过。它会自动完成库函数的函数参数选项,它会自动完成包名称空间中的函数和对象,但确实如此不自动完成包的名称。你可能想在 ESS github repo 中打开一个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多