如何让Emacs ess将查询字符串(在引号内)识别为代码?

时间:2011-02-17 20:52:58

标签: r emacs ess

背景

我有一个函数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中添加一些东西?

3 个答案:

答案 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);"))

也许有点笨重,但它在实践中有效。