2019-11-19 update:
我已经把ESS相关的配置独立了出来:+ESS.el
相较原来的正文,新增的特性包括且不限于:
- 提示符(
comint
)设为只读; - Rscript中用Tab补全,
打开Rscript文件且inferior未运行时,自动加载一个进程,与之配合。的功能与org-mode冲突,默认已经删除; - 使用
RStudio-
缩进风格; - 使用
formatR
(可绑定函数)优化R代码格式; - 高亮部分关键字。
---- 我是正文分割线 ----
这两天正苦于RStudio的快捷键不好用。本想去跟个楼催一下官方填坑,挖出来一个、一看是2015年的老坟,算了……
昨晚正好看见关于Spacemacs中如何使用ESS的帖子,跟网友oracleyue讨论后,决定深入 学(zhe)习(teng) 一下,做一记录:
1. 首先是Emacs的安装
不多说,Vim党可以自行退散了……
2. ESS的安装
我使用了melpa的安装方式,具体可参考melpa,在包列表里添加ess
。想同时使用polymode
的话,须同时添加poly-markdown poly-R
。
Doom和Spacemacs的安装方式同时有效:
Doom
为例,在init.el
中去掉ess行的注释,
或在packages.el
文件中
(package! ess)
即可。
Spacemacs
的配置,在dotspacemacs-configuration-layers
里加上:
(ess :variables
ess-assign-key "M--")
就能用ESS的layer了。
PS: ESS全家桶在https://github.com/emacs-ess/ESS
3. 配置
这就可以开始使用了,我也是偶然发现<C-return>
可以像RStudio一样运行当前行,在ESS中script与console也是可以交互的(之前鄙了,严重低估了ESS,仅当作高亮插件用);如果没启动inferior-ess-r
,可以在选择询问的默认路径后自动启动。
列几个常用的快捷键:
按键 | 命令 |
---|---|
C-c C-b | 执行当前buffer |
C-c C-c | 执行当前区域或函数 |
C-c C-j (<C-return>) | 执行当前行 |
C-c C-r | 执行当前区域 |
C-c C-q | 退出 |
设置参数:
(use-package ess-site
:ensure ess
:init
(setq comint-prompt-read-only t #提示符设为只读
ess-startup-directory "~/R" #设置默认启动路径
ess-ask-for-ess-directory nil #不询问路径启动R
ess-history-file "~/R/.history" #历史记录保存位置
;; ess-indent-level 2 #默认缩进
ess-set-style 'RStudio- #使用RStudio-风格缩进
ess-tab-complete-in-script t) #在script中按tab补全
;; (autoload 'ess-r-mode "ess-site.el" nil t)
:commands R
:bind
(("C-S-f" . #'Hesperus-ess-indent-region-with-formatR) #使用formatR调整代码格式,函数在+ESS.el
("C-S-r" . 'run-ess-r)
("C-c m r" . 'R-mode)
:map comint-mode-map
("C-c e" . 'ess-rdired) #显示当前观测值
:hook
((ess-mode . company-mode))
:config
;; company with tabnine & R #同时使用company和tabnine补全
(setq ess-r-company-backends
'((company-tabnine company-R-library company-R-args company-R-objects :separate))))
但是此时(在Doom中)按M--
是出不了<-
符号的,可以绑定宏或安装ess-smart-underscore
包并绑定函数,不过这个包有点老我没有仔细折腾;我安装了ess-smart-equals
。
这是作者推荐的配置:
(use-package ess-smart-equals
:init (setq ess-smart-equals-extra-ops '(brace paren percent))
:after (:any ess-r-mode inferior-ess-r-mode ess-r-transcript-mode)
:config (ess-smart-equals-activate))
但是似乎按啥都出不了管道命令,我查了源码发现有这个符号,原来需要按不同次数才能输出不同的运算符,我试了几个:
按键 | 次数 | 得到运算符 |
---|---|---|
= | 1 | <- |
= | 2 | <<- |
= | 3 | = |
= | 4 | == |
= | 5 | -> |
= | 6 | ->> |
= | 7 | %<>% |
% | 1 | %*% |
% | 2 | %% |
% | 3 | %/% |
% | 4 | %in% |
% | 5 | %>% |
% | 6 | %<>% |
% | 7 | %o% |
% | 8 | %x% |
按完一轮,从头开始循环。想像RStudio一样用C-S-m
输入%>%
的话,可以自行开发用法,我只能用这样的笨办法,一个宏达到连输5次的效果:
后来发现在 :config 里
defcustom ess-smart-equals-contexts
,也是可以实现的,具体的配置同样在本文最上方的链接,正文不再赘述了。
(fset 'Hesperus-insert-smart-pipe
(lambda (&optional arg) "Keyboard macro."
(interactive "p")
(kmacro-exec-ring-item (quote ("%%%%%" 0 "%d")) arg)))
(def-package! ess
:bind
(("C-S-m" . #'Hesperus-insert-smart-pipe)))
啥?M--
还是不出<-
?按一下=
试试?这不比组合键方便,还要啥自行车?
实在想要就自己绑定函数(宏)吧。
4. Environment
在Global Environment里显示 obs. 和 variables. 的数目应该是ESS替代不了RStudio的功能了,不过感谢shuguang79提示可以用ess-rdired
勉强应付,能同时显示4列信息,分别是name、class、length、size,只是不能实时刷新。默认的快捷键是C-c C-. o
。
网友评论