From: Michael Mauger Date: Wed, 24 Jul 2013 00:25:53 +0000 (-0400) Subject: * progmodes/sql.el Version 3.3 X-Git-Tag: emacs-24.3.90~173^2^2~42^2~45^2~387^2~1714 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=3d012865be24995904525eb1b12f51f4d95afcfc;p=emacs.git * progmodes/sql.el Version 3.3 (sql-product-alist): Improve oracle :prompt-cont-regexp. (sql-starts-with-prompt-re, sql-ends-with-prompt-re): New functions. (sql-interactive-remove-continuation-prompt): Rewrite, use functions above. Fix continuation prompt and complete output line handling. (sql-redirect-one, sql-execute): Use `read-only-mode' on redirected output buffer. (sql-mode): Restore deleted code (Bug#13591). --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 424b175f6f8..60880a23f9a 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,15 @@ +2013-07-23 Michael R. Mauger + + * progmodes/sql.el Version 3.3 + (sql-product-alist): Improve oracle :prompt-cont-regexp. + (sql-starts-with-prompt-re, sql-ends-with-prompt-re): New functions. + (sql-interactive-remove-continuation-prompt): Rewrite, use + functions above. Fix continuation prompt and complete output line + handling. + (sql-redirect-one, sql-execute): Use `read-only-mode' on + redirected output buffer. + (sql-mode): Restore deleted code (Bug#13591). + 2013-07-23 Juanma Barranquero * desktop.el (desktop-clear, desktop-list*): Fix previous change. diff --git a/lisp/progmodes/sql.el b/lisp/progmodes/sql.el index 940afc3d5f4..56a6f155f31 100644 --- a/lisp/progmodes/sql.el +++ b/lisp/progmodes/sql.el @@ -4,7 +4,7 @@ ;; Author: Alex Schroeder ;; Maintainer: Michael Mauger -;; Version: 3.2 +;; Version: 3.3 ;; Keywords: comm languages processes ;; URL: http://savannah.gnu.org/projects/emacs/ @@ -233,6 +233,7 @@ (require 'regexp-opt)) (require 'custom) (require 'thingatpt) +(require 'view) (defvar font-lock-keyword-face) (defvar font-lock-set-defaults) @@ -246,7 +247,7 @@ :group 'languages :group 'processes) -;; These four variables will be used as defaults, if set. +;; These five variables will be used as defaults, if set. (defcustom sql-user "" "Default username." @@ -437,7 +438,7 @@ file. Since that is a plaintext file, this could be dangerous." :completion-object sql-oracle-completion-object :prompt-regexp "^SQL> " :prompt-length 5 - :prompt-cont-regexp "^\\s-*[[:digit:]]+ " + :prompt-cont-regexp "^\\(?:[ ][ ][1-9]\\|[ ][1-9][0-9]\\|[1-9][0-9]\\{2\\}\\)[ ]\\{2\\}" :statement sql-oracle-statement-starters :syntax-alist ((?$ . "_") (?# . "_")) :terminator ("\\(^/\\|;\\)$" . "/") @@ -3276,6 +3277,17 @@ Allows the suppression of continuation prompts.") (defvar sql-preoutput-hold nil) +(defun sql-starts-with-prompt-re () + "Anchor the prompt expression at the beginning of the output line. +Remove the start of line regexp." + (replace-regexp-in-string "\\^" "\\\\`" comint-prompt-regexp)) + +(defun sql-ends-with-prompt-re () + "Anchor the prompt expression at the end of the output line. +Remove the start of line regexp from the prompt expression since +it may not follow newline characters in the output line." + (concat (replace-regexp-in-string "\\^" "" sql-prompt-regexp) "\\'")) + (defun sql-interactive-remove-continuation-prompt (oline) "Strip out continuation prompts out of the OLINE. @@ -3293,38 +3305,52 @@ to the next chunk to properly match the broken-up prompt. If the filter gets confused, it should reset and stop filtering to avoid deleting non-prompt output." - (let (did-filter) - (setq oline (concat (or sql-preoutput-hold "") oline) - sql-preoutput-hold nil) - - (if (and comint-prompt-regexp - (integerp sql-output-newline-count) - (>= sql-output-newline-count 1)) - (progn - (while (and (not (string= oline "")) - (> sql-output-newline-count 0) - (string-match comint-prompt-regexp oline) - (= (match-beginning 0) 0)) + (when comint-prompt-regexp + (save-match-data + (let (prompt-found last-nl) - (setq oline (replace-match "" nil nil oline) - sql-output-newline-count (1- sql-output-newline-count) - did-filter t)) + ;; Add this text to what's left from the last pass + (setq oline (concat sql-preoutput-hold oline) + sql-preoutput-hold "") + ;; If we are looking for multiple prompts + (when (and (integerp sql-output-newline-count) + (>= sql-output-newline-count 1)) + ;; Loop thru each starting prompt and remove it + (let ((start-re (sql-starts-with-prompt-re))) + (while (and (not (string= oline "")) + (> sql-output-newline-count 0) + (string-match start-re oline)) + (setq oline (replace-match "" nil nil oline) + sql-output-newline-count (1- sql-output-newline-count) + prompt-found t))) + + ;; If we've found all the expected prompts, stop looking (if (= sql-output-newline-count 0) (setq sql-output-newline-count nil oline (concat "\n" oline)) + ;; Still more possible prompts, leave them for the next pass (setq sql-preoutput-hold oline - oline "")) - - (unless did-filter - (setq oline (or sql-preoutput-hold "") - sql-preoutput-hold nil - sql-output-newline-count nil))) - - (setq sql-output-newline-count nil)) - - oline)) + oline ""))) + + ;; If no prompts were found, stop looking + (unless prompt-found + (setq sql-output-newline-count nil + oline (concat oline sql-preoutput-hold) + sql-preoutput-hold "")) + + ;; Break up output by physical lines if we haven't hit the final prompt + (unless (and (not (string= oline "")) + (string-match (sql-ends-with-prompt-re) oline) + (>= (match-end 0) (length oline))) + (setq last-nl 0) + (while (string-match "\n" oline last-nl) + (setq last-nl (match-end 0))) + (setq sql-preoutput-hold (concat (substring oline last-nl) + sql-preoutput-hold) + oline (substring oline 0 last-nl)))))) + oline) ;;; Sending the region to the SQLi buffer. @@ -3462,7 +3488,8 @@ list of SQLi command strings." :prompt-regexp)) (start nil)) (with-current-buffer buf - (setq view-read-only nil) + (setq-local view-no-disable-on-exit t) + (read-only-mode -1) (unless save-prior (erase-buffer)) (goto-char (point-max)) @@ -3571,8 +3598,8 @@ buffer is popped into a view window." (get-lru-window)))) (with-current-buffer outbuf (set-buffer-modified-p nil) - (setq view-read-only t)) - (view-buffer-other-window outbuf) + (read-only-mode +1)) + (pop-to-buffer outbuf) (when one-win (shrink-window-if-larger-than-buffer))))) @@ -3747,7 +3774,9 @@ must tell Emacs. Here's how to do that in your init file: (setq-local abbrev-all-caps 1) ;; Contains the name of database objects (set (make-local-variable 'sql-contains-names) t) + ;; Set syntax and font-face highlighting ;; Catch changes to sql-product and highlight accordingly + (sql-set-product (or sql-product 'ansi)) ; Fixes bug#13591 (add-hook 'hack-local-variables-hook 'sql-highlight-product t t))