2014-11-05 3 views
2

Я использую Sql-режим для подключения к базе данных Oracle. Настройки по умолчанию для linesize и размер_страницы и colsep не являются идеальными, так что я хотел бы, чтобы Emacs автоматически выполнить следующие команды при подключении к моим базам данных:Как определить команды для запуска при запуске sql-mode?

SET COLSEP "|" 
SET LINESIZE 9999 
SET PAGESIZE 9999 

Как я могу это сделать?

+0

Чтобы выполнить указанные выше команды, они всегда могут быть включены в файл login.sql. http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch2.htm#i1133106. Однако это приведет к выполнению команд, запускаемых SQL * Plus из Emacs или без него. –

ответ

3

Адаптировано из более раннего ответа Тобиаса, в котором правильно указано использование sql-login-hook для отправки SQL через функции comint.

С помощью Postgres мне нужно было отправить каждую команду отдельно, поэтому здесь я использовал comint-send-string (и разработчик sql.el Майкл указал, что это действительно предпочтительный метод).

Обратите внимание, что при использовании одинаковых sql-login-hook со всеми продуктами базы данных рекомендуется проверить sql-product перед отправкой команд, специфичных для продукта. Я включил проверку для Oracle в этом случае.

(add-hook 'sql-login-hook 'my-sql-login-hook) 

(defun my-sql-login-hook() 
    "Custom SQL log-in behaviours. See `sql-login-hook'." 
    (when (eq sql-product 'oracle) 
    (let ((proc (get-buffer-process (current-buffer)))) 
     (comint-send-string proc "SET COLSEP \"|\";\n") 
     (comint-send-string proc "SET LINESIZE 9999;\n") 
     (comint-send-string proc "SET PAGESIZE 9999;\n")))) 

Обратите внимание, что вы должны включать в себя символ новой строки в конце команды, чтобы повторить печатая RET при подаче команды в интерактивном режиме. (Если вы этого не сделаете, команды будут по-прежнему «введены», но не вступят в силу до тех пор, пока вы вручную не наберете RET в командной строке).

Если это все еще не работает, обратите внимание, что sql-login-hook работает только от sql-product-interactive, если он распознает интерактивную подсказку SQL в буфере. Это приглашение сопоставляется с использованием регулярного выражения sql-prompt-regexp (которое устанавливается с использованием значений по умолчанию для продукта в sql-product-alist). Если шаблон по умолчанию не соответствует вашим запросам, вы можете изменить его в sql-interactive-mode-hook.

Например, следующее позволяет Postgres предложит включить символ-составляющая символы (например, подчеркивания _) в имени базы данных, а также в состав слова символами:

(add-hook 'sql-interactive-mode-hook 'my-sql-interactive-mode-hook) 

(defun my-sql-interactive-mode-hook() 
    "Custom interactive SQL mode behaviours. See `sql-interactive-mode-hook'." 
    (when (eq sql-product 'postgres) 
    ;; Allow symbol chars in database names in the prompt. 
    ;; Default postgres pattern was: "^\\w*=[#>] " (see `sql-product-alist'). 
    (setq sql-prompt-regexp "^\\(?:\\sw\\|\\s_\\)*=[#>] "))) 
+0

Похоже, у вас была возможность проверить его. Поэтому я удаляю свой ответ и даю ваш ответ, чтобы он появился первым в списке. Я также изменяю ответ Тобиаса на «предыдущий ответ Тобиаса». Надеюсь, с тобой все в порядке. – Tobias

+0

Без проблем, Тобиас.Я отредактировал еще раз, чтобы немного уточнить некоторые аспекты, но ваши изменения были также прекрасными. – phils

+1

Я не уверен, что вы это заметили, но для этого решения для меня нужно добавить «\ n» в конец каждой строки. – Babu

1

Ваш LOGIN.SQL будет влиять на многие Oracle, в том числе вне Emacs.

"sql-login-hook" был добавлен специально для настройки инструмента командной строки SQL в Emacs. Как отметил «phils», использование comint-send-string' является предпочтительным способом отправки команд. Если вы ищете ответ и вам нужно проанализировать ответ, используйте "sql-redirect-value".

Я установил LINESIZE 32767 PAGESIZE 50000 (их максимальные значения) и используйте C-pre и C-рядом с прокруткой вправо и влево.