Как определить команды для запуска при запуске sql-mode?
Я использую Sql-режим для подключения к базе данных Oracle. Настройки по умолчанию для размеров линий и страниц и colsep не идеальны, поэтому я бы хотел, чтобы Emacs автоматически запускал следующие команды при подключении к моим базам данных:
SET COLSEP "|"
SET LINESIZE 9999
SET PAGESIZE 9999
Как я могу сделать это?
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_\\)*=[#>] ")))
Для запуска команд всегда их можно включить в файл login.sql. http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch2.htm. Однако это будет запускать команды независимо от того, запускается ли SQL*Plus из Emacs или без него.
Ваш LOGIN.SQL
повлияет на многие сессии Oracle, в том числе вне Emacs.
"sql-login-hook"
был добавлен специально для настройки инструмента команд SQL в Emacs. Как указали "филсы", используя comint-send-string'
является предпочтительным способом отправки команд. Если вы ищете ответ и хотите разобрать ответ, используйте "sql-redirect-value"
,
Я поставил LINESIZE 32767 PAGESIZE 50000
(их максимальные значения) и используйте C-prior и C-next для прокрутки вправо и влево.