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

Dav*_*uer 5 emacs r 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)
}    
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中添加一些东西?

Mor*_*mer 9

我认为你想要的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查询.