我有一个函数dbquery,简化了从R内部查询MySQL数据库的过程.
dbquery <- function(querystring) {
dvr <- dbDriver("MySQL")
con <- dbConnect(dvr, group = "databasename")
q <- dbSendQuery(con, querystring)
data <- fetch(q, n = -1)
return(data)
}
Run Code Online (Sandbox Code Playgroud)
因此我可以发送:
dbquery(querystring = "select field_1, field_2, field_3
from table_a join table_b on this = that
join table_c on that = something
where field_4 in (1,2,3);"
Run Code Online (Sandbox Code Playgroud)
但是,变量querystring必须包含在引号内.这使得Emacs ESS不会像在SQL模式下那样很好地缩进我的查询 - 或者甚至像没有引号但只是在ESS-R模式下那样.
是否有可能让ESS这样做?也许通过编写函数使它接受没有引号的查询(并在函数中添加引号),或者可能在.emacs或ess.el中添加一些东西?
我认为你想要的MMM模式.顾名思义:MultiMajorMode Mode允许在同一缓冲区的不同区域拥有多个模式.
我建议您查看http://www.emacswiki.org/emacs/HtmlModeDeluxe中的示例,因为它们可能会让您知道如何在您的情况下执行此操作(您可能希望在代码中添加一些注释在sql周围这样MMM就可以找到sql代码了.
你必须做这样的事情我猜(未经测试):
(require 'mmm-mode)
(mmm-add-group
'sql-in-ess
'(
(sql-query
:submode sql-mode
:face WHATEVERYOUWANT
:front "#SQL_QUERY>"
:back "#<SQL_QUERY"))
(add-to-list 'mmm-mode-ext-classes-alist '(ess-mode nil sql-in-ess))
Run Code Online (Sandbox Code Playgroud)
但是,这可能是过度的,除非你在R代码中有很多复杂的SQL查询.