我有一个函数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)
}
因此我可以发送:
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);"
但是,变量querystring
必须包含在引号内。这使得Emacs ESS不会像在SQL模式下那样很好地缩进我的查询 - 或者甚至像没有引号但只是在ESS-R模式下那样。
是否有可能让ESS这样做?也许通过编写函数使它接受没有引号的查询(并在函数中添加引号),或者可能在.emacs或ess.el中添加一些东西?
答案 0 :(得分:9)
我认为你想要的是MMM Mode。顾名思义:MultiMajorMode Mode允许在同一个缓冲区的不同区域拥有多个模式。
我建议您查看http://www.emacswiki.org/emacs/HtmlModeDeluxe中的示例,因为它们可能会让您知道如何在您的情况下执行此操作(您可能希望在代码中添加一些注释,以便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))
然而,这可能是过度的,除非你在R代码中有很多复杂的SQL查询。
答案 1 :(得分:0)
我不知道有什么方法可以做到这一点。看起来你似乎在问,“我可以让Emacs同时处于两种模式吗?(即ESS和SQL)”我认为答案是“不”但我希望有人出现并向我们展示一个能够证明我的切肉刀黑客错误!
答案 2 :(得分:0)
一种简单的替代方法是使用粘贴,每行都有一个单独的字符串:
dbquery(querystring = paste("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);"))
也许有点笨重,但它在实践中有效。