Как я могу заставить Emacs ess распознавать строку запроса (в кавычках) как код? - PullRequest
5 голосов
/ 17 февраля 2011

Фон

У меня есть функция dbquery, которая упрощает процесс запроса базы данных MySQL изнутри R.

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 ]

9 голосов
/ 18 февраля 2011

Я думаю, что вы хотите в МММ режиме .Как следует из его названия: 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))

Тем не менее, это может быть излишним, если часто не происходит сложных SQL-запросов в коде R.

0 голосов
/ 24 апреля 2012

Простым альтернативным подходом было бы использование пасты с каждой строкой отдельной строкой:

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

Возможно, немного неуклюже, но на практике это работает.

0 голосов
/ 18 февраля 2011

Я не знаю, как это сделать. Похоже, вы спрашиваете: «Могу ли я заставить Emacs работать в двух режимах одновременно? неправильно!

...