Mercurial > emacs
view lisp/electric.el @ 52242:f5ada28bb9f0
Patch by Michael Mauger <mmaug@yahoo.com>
Version 1.8.0 of sql-mode.
Simplify selection of SQL products to define highlighting and
interactive mode. Includes detailed instructions on adding
support for new products.
* sql.el (sql-product): New variable. Identifies SQL product for
use in highlighting and interactive mode.
(sql-interactive-product): New variable. SQL product for
sql-interactive-mode.
(sql-product-support): New variable. Specifies product-specific
parameters to drive highlighting and interactive mode.
(sql-imenu-generic-expression): Add more object types.
(sql-sqlite-options): Correct comment.
(sql-ms-program): Use "osql" rather than "isql".
(sql-prompt-regexp, sql-prompt-length): Update comment.
(sql-mode-menu): Add "Start SQLi session" entry. Replace
Highlighting submenu with Product menu. Fix Send Region entry.
(sql-mode-abbrev-table): Add abbreviations. Support of
SYSTEM-FLAG on define-abbrev. Support was removed with last
check-in; it now handles older Emacsen without the SYSTEM-FLAG.
(sql-mode-font-lock-object-name): Add font-lock pattern for object
names.
(sql-mode-ansi-font-lock-keywords): Set as default value.
(sql-mode-oracle-font-lock-keywords): Set as default value.
Support Oracle 9i keywords.
(sql-mode-postgres-font-lock-keywords): Set as default value.
(sql-mode-linter-font-lock-keywords): Set as default value.
(sql-mode-ms-font-lock-keywords): New variable. Support Microsoft
SQLServer 2000.
(sql-mode-sybase-font-lock-keywords)
(sql-mode-interbase-font-lock-keywords)
(sql-mode-sqlite-font-lock-keywords)
(sql-mode-strong-font-lock-keywords)
(sql-mode-mysql-font-lock-keywords)
(sql-mode-db2-font-lock-keywords): New variables. Default to ANSI
keywords.
(sql-mode-font-lock-defaults): Update comment.
(sql-product-feature): New function. Returns feature associated
with a product from `sql-product-support' alist.
(sql-product-font-lock): New function. Set font-lock support
based on `sql-product'.
(sql-add-product-keywords): New function. Add font-lock rules to
product-specific keyword variables.
(sql-set-product): New function. Set `sql-product' and apply
appropriate font-lock highlighting.
(sql-highlight-product): New function. Set font-lock support
based on a product. Also set mode name to include product name.
(sql-highlight-ansi-keywords, sql-highlight-oracle-keywords)
(sql-highlight-postgres-keywords, sql-highlight-linter-keywords):
Use `sql-set-product'.
(sql-highlight-ms-keywords)
(sql-highlight-sybase-keywords)
(sql-highlight-interbase-keywords)
(sql-highlight-strong-keywords)
(sql-highlight-mysql-keywords)
(sql-highlight-sqlite-keywords)
(sql-highlight-db2-keywords): New functions. Use
`sql-set-product'.
(sql-get-login): Prompt in the same order as the tokens.
(sql-mode): Uses `sql-product-highlight' and
`sql-product-font-lock'.
(sql-product-interactive): New function. Common portions of
product-specific interactive mode wrappers.
(sql-interactive-mode): Rewritten to use product features.
(sql-oracle, sql-sybase, sql-informix, sql-sqlite, sql-mysql)
(sql-solid, sql-ingres, sql-ms, sql-postgres, sql-interbase)
(sql-db2, sql-linter): Use `sql-product-interactive'.
(sql-connect-oracle, sql-connect-sybase, sql-connect-informix)
(sql-connect-sqlite, sql-connect-mysql, sql-connect-solid)
(sql-connect-ingres, sql-connect-postgres)
(sql-connect-interbase, sql-connect-db2, sql-connect-linter): New
functions. Format command line parameters and invoke comint on
the appropriate interpreter. Code was in the corresponding
`sql-xyz' function before.
(sql-connect-ms): New function. Support -E argument to use
operating system credentials for authentication.
author | Alex Schroeder <alex@gnu.org> |
---|---|
date | Mon, 18 Aug 2003 17:29:23 +0000 |
parents | 37645a051842 |
children | 695cf19ef79e d7ddb3e565de |
line wrap: on
line source
;;; electric.el --- window maker and Command loop for `electric' modes ;; Copyright (C) 1985, 1986, 1995 Free Software Foundation, Inc. ;; Author: K. Shane Hartman ;; Maintainer: FSF ;; Keywords: extensions ;; This file is part of GNU Emacs. ;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Commentary: ; zaaaaaaap ;;; Code: ;; This loop is the guts for non-standard modes which retain control ;; until some event occurs. It is a `do-forever', the only way out is ;; to throw. It assumes that you have set up the keymap, window, and ;; everything else: all it does is read commands and execute them - ;; providing error messages should one occur (if there is no loop ;; function - which see). The required argument is a tag which should ;; expect a value of nil if the user decides to punt. The second ;; argument is the prompt to be used: if nil, use "->", if 'noprompt, ;; don't use a prompt, if a string, use that string as prompt, and if ;; a function of no variable, it will be evaluated in every iteration ;; of the loop and its return value, which can be nil, 'noprompt or a ;; string, will be used as prompt. Given third argument non-nil, it ;; INHIBITS quitting unless the user types C-g at toplevel. This is ;; so user can do things like C-u C-g and not get thrown out. Fourth ;; argument, if non-nil, should be a function of two arguments which ;; is called after every command is executed. The fifth argument, if ;; provided, is the state variable for the function. If the ;; loop-function gets an error, the loop will abort WITHOUT throwing ;; (moral: use unwind-protect around call to this function for any ;; critical stuff). The second argument for the loop function is the ;; conditions for any error that occurred or nil if none. (defun Electric-command-loop (return-tag &optional prompt inhibit-quit loop-function loop-state) (let (cmd (err nil) (prompt-string prompt)) (while t (if (not (or (stringp prompt) (eq prompt nil) (eq prompt 'noprompt))) (setq prompt-string (funcall prompt))) (if (not (stringp prompt-string)) (if (eq prompt-string 'noprompt) (setq prompt-string nil) (setq prompt-string "->"))) (setq cmd (read-key-sequence prompt-string)) (setq last-command-char (aref cmd (1- (length cmd))) this-command (key-binding cmd t) cmd this-command) ;; This makes universal-argument-other-key work. (setq universal-argument-num-events 0) (if (or (prog1 quit-flag (setq quit-flag nil)) (eq last-input-char ?\C-g)) (progn (setq unread-command-events nil prefix-arg nil) ;; If it wasn't cancelling a prefix character, then quit. (if (or (= (length (this-command-keys)) 1) (not inhibit-quit)) ; safety (progn (ding) (message "Quit") (throw return-tag nil)) (setq cmd nil)))) (setq current-prefix-arg prefix-arg) (if cmd (condition-case conditions (progn (command-execute cmd) (setq last-command this-command) (if (or (prog1 quit-flag (setq quit-flag nil)) (eq last-input-char ?\C-g)) (progn (setq unread-command-events nil) (if (not inhibit-quit) (progn (ding) (message "Quit") (throw return-tag nil)) (ding))))) (buffer-read-only (if loop-function (setq err conditions) (ding) (message "Buffer is read-only") (sit-for 2))) (beginning-of-buffer (if loop-function (setq err conditions) (ding) (message "Beginning of Buffer") (sit-for 2))) (end-of-buffer (if loop-function (setq err conditions) (ding) (message "End of Buffer") (sit-for 2))) (error (if loop-function (setq err conditions) (ding) (message "Error: %s" (if (eq (car conditions) 'error) (car (cdr conditions)) (prin1-to-string conditions))) (sit-for 2)))) (ding)) (if loop-function (funcall loop-function loop-state err)))) (ding) (throw return-tag nil)) ;; This function is like pop-to-buffer, sort of. ;; The algorithm is ;; If there is a window displaying buffer ;; Select it ;; Else if there is only one window ;; Split it, selecting the window on the bottom with height being ;; the lesser of max-height (if non-nil) and the number of lines in ;; the buffer to be displayed subject to window-min-height constraint. ;; Else ;; Switch to buffer in the current window. ;; ;; Then if max-height is nil, and not all of the lines in the buffer ;; are displayed, grab the whole frame. ;; ;; Returns selected window on buffer positioned at point-min. (defun Electric-pop-up-window (buffer &optional max-height) (let* ((win (or (get-buffer-window buffer) (selected-window))) (buf (get-buffer buffer)) (one-window (one-window-p t)) (pop-up-windows t) (target-height) (lines)) (if (not buf) (error "Buffer %s does not exist" buffer) (save-excursion (set-buffer buf) (setq lines (count-lines (point-min) (point-max))) (setq target-height (min (max (if max-height (min max-height (1+ lines)) (1+ lines)) window-min-height) (save-window-excursion (delete-other-windows) (1- (window-height (selected-window))))))) (cond ((and (eq (window-buffer win) buf)) (select-window win)) (one-window (goto-char (window-start win)) (pop-to-buffer buffer) (setq win (selected-window)) (enlarge-window (- target-height (window-height win)))) (t (switch-to-buffer buf))) (if (and (not max-height) (> target-height (window-height (selected-window)))) (progn (goto-char (window-start win)) (enlarge-window (- target-height (window-height win))))) (goto-char (point-min)) win))) (provide 'electric) ;;; electric.el ends here