我使用Sql模式連接到Oracle數據庫。爲LINESIZE和頁面大小,和COLSEP的默認設置是不理想的,所以我想有Emacs的在連接到我的數據庫自動運行以下命令:如何定義啓動sql-mode時運行的命令?
SET COLSEP "|"
SET LINESIZE 9999
SET PAGESIZE 9999
我怎樣才能做到這一點?
我使用Sql模式連接到Oracle數據庫。爲LINESIZE和頁面大小,和COLSEP的默認設置是不理想的,所以我想有Emacs的在連接到我的數據庫自動運行以下命令:如何定義啓動sql-mode時運行的命令?
SET COLSEP "|"
SET LINESIZE 9999
SET PAGESIZE 9999
我怎樣才能做到這一點?
改編自Tobias之前的回答,它正確指出使用sql-login-hook
通過comint函數發送SQL。
隨着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#i1133106。但是,這將運行SQL * Plus從內部運行或不運行Emacs的命令。
你LOGIN.SQL
將影響許多Oracle會話包括Emacs之外的會話。
"sql-login-hook"
是專門爲配置Emacs中的SQL命令工具而添加的。正如「phils」指出的那樣,使用comint-send-string'
是發送命令的首選方式。如果您正在查找回復並需要解析回覆,請使用"sql-redirect-value"
。
我設置了LINESIZE 32767 PAGESIZE 50000
(它們的最大值)並使用C-prior和C-next來左右滾動。
要運行上述命令,始終可以將它們包含在login.sql文件中。 http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch2.htm#i1133106。但是,這將運行SQL * Plus從內部運行或不運行Emacs的命令。 – 2014-11-05 18:58:06