5

背景

我有一个函数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 添加一些内容?

4

3 回答 3

9

我认为您在MMM 模式中想要什么。正如他的名字所暗示的:MultiMajorMode 模式允许在同一个缓冲区的不同区域拥有多种模式。

我建议您查看 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))

但是,这可能有点矫枉过正,除非您经常在 R 代码中使用复杂的 sql 查询。

于 2011-02-17T22:48:14.120 回答
0

我不知道有什么方法可以做到这一点。似乎您在问,“我可以让 Emacs 同时处于两种模式吗?(即 ESS 和 SQL)”我认为答案是“不”,但我希望有人过来向我们展示一个可以证明我的 cleaver hack错误的!

于 2011-02-17T22:15:04.673 回答
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);"))

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

于 2012-04-23T22:07:45.223 回答