X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/f3bbbd11451643c49997116d639612ae434dcaa0..efee6a6d9cec2af824b8355c93d8f47b72a685a8:/lisp/progmodes/make-mode.el diff --git a/lisp/progmodes/make-mode.el b/lisp/progmodes/make-mode.el index c7341a9f87..594462d512 100644 --- a/lisp/progmodes/make-mode.el +++ b/lisp/progmodes/make-mode.el @@ -1,7 +1,7 @@ ;;; make-mode.el --- makefile editing commands for Emacs -;; Copyright (C) 1992, 1994, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 -;; Free Software Foundation, Inc. +;; Copyright (C) 1992, 1994, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +;; 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. ;; Author: Thomas Neumann ;; Eric S. Raymond @@ -11,10 +11,10 @@ ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; 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. +;; the Free Software Foundation, either version 3 of the License, 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 @@ -22,9 +22,7 @@ ;; 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., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. +;; along with GNU Emacs. If not, see . ;;; Commentary: @@ -106,7 +104,7 @@ (t (:reverse-video t))) "Face to use for highlighting leading spaces in Font-Lock mode." :group 'makefile) -(put 'makefile-space-face 'face-alias 'makefile-space) +(define-obsolete-face-alias 'makefile-space-face 'makefile-space "22.1") (defface makefile-targets ;; This needs to go along both with foreground and background colors (i.e. shell) @@ -233,15 +231,15 @@ to MODIFY A FILE WITHOUT YOUR CONFIRMATION when \"it seems necessary\"." ;; Special targets for DMake, Sun's make ... ;; (defcustom makefile-special-targets-list - '(("DEFAULT") ("DONE") ("ERROR") ("EXPORT") - ("FAILED") ("GROUPEPILOG") ("GROUPPROLOG") ("IGNORE") - ("IMPORT") ("INCLUDE") ("INCLUDEDIRS") ("INIT") - ("KEEP_STATE") ("MAKEFILES") ("MAKE_VERSION") ("NO_PARALLEL") - ("PARALLEL") ("PHONY") ("PRECIOUS") ("REMOVE") - ("SCCS_GET") ("SILENT") ("SOURCE") ("SUFFIXES") - ("WAIT") ("c.o") ("C.o") ("m.o") - ("el.elc") ("y.c") ("s.o")) - "*List of special targets. + '("DEFAULT" "DONE" "ERROR" "EXPORT" + "FAILED" "GROUPEPILOG" "GROUPPROLOG" "IGNORE" + "IMPORT" "INCLUDE" "INCLUDEDIRS" "INIT" + "KEEP_STATE" "MAKEFILES" "MAKE_VERSION" "NO_PARALLEL" + "PARALLEL" "PHONY" "PRECIOUS" "REMOVE" + "SCCS_GET" "SILENT" "SOURCE" "SUFFIXES" + "WAIT" "c.o" "C.o" "m.o" + "el.elc" "y.c" "s.o") + "List of special targets. You will be offered to complete on one of those in the minibuffer whenever you enter a \".\" at the beginning of a line in `makefile-mode'." :type '(repeat (list string)) @@ -274,7 +272,7 @@ not be enclosed in { } or ( )." "Characters to skip to find a line that might be a dependency.") (defvar makefile-rule-action-regex - "^\t[ \t]*\\([-@]*\\)[ \t]*\\(\\(?:.*\\\\\n\\)*.*\\)" + "^\t[ \t]*\\(?:\\([-@]+\\)[ \t]*\\)\\(.*\\(?:\\\\\n.*\\)*\\)" "Regex used to highlight rule action lines in font lock mode.") (defconst makefile-makepp-rule-action-regex @@ -357,8 +355,9 @@ not be enclosed in { } or ( )." (3 'font-lock-string-face prepend t)) ;; Rule actions. + ;; FIXME: When this spans multiple lines we need font-lock-multiline. (makefile-match-action - (1 font-lock-type-face) + (1 font-lock-type-face nil t) (2 'makefile-shell prepend) ;; Only makepp has builtin commands. (3 font-lock-builtin-face prepend t)) @@ -582,7 +581,8 @@ The function must satisfy this calling convention: (define-abbrev-table 'makefile-mode-abbrev-table ())) (defvar makefile-mode-map - (let ((map (make-sparse-keymap))) + (let ((map (make-sparse-keymap)) + (opt-map (make-sparse-keymap))) ;; set up the keymap (define-key map "\C-c:" 'makefile-insert-target-ref) (if makefile-electric-keys @@ -612,17 +612,64 @@ The function must satisfy this calling convention: (define-key map [menu-bar makefile-mode] (cons "Makefile" (make-sparse-keymap "Makefile"))) + (define-key map [menu-bar makefile-mode makefile-type] + (cons "Switch Makefile Type" opt-map)) + (define-key opt-map [makefile-makepp-mode] + '(menu-item "Makepp" makefile-makepp-mode + :help "An adapted `makefile-mode' that knows about makepp" + :button (:radio . (eq major-mode 'makefile-makepp-mode)))) + (define-key opt-map [makefile-imake-mode] + '(menu-item "Imake" makefile-imake-mode + :help "An adapted `makefile-mode' that knows about imake" + :button (:radio . (eq major-mode 'makefile-imake-mode)))) + (define-key opt-map [makefile-mode] + '(menu-item "Classic" makefile-mode + :help "`makefile-mode' with no special functionality" + :button (:radio . (eq major-mode 'makefile-mode)))) + (define-key opt-map [makefile-bsdmake-mode] + '(menu-item "BSD" makefile-bsdmake-mode + :help "An adapted `makefile-mode' that knows about BSD make" + :button (:radio . (eq major-mode 'makefile-bsdmake-mode)))) + (define-key opt-map [makefile-automake-mode] + '(menu-item "Automake" makefile-automake-mode + :help "An adapted `makefile-mode' that knows about automake" + :button (:radio . (eq major-mode 'makefile-automake-mode)))) + (define-key opt-map [makefile-gmake-mode] + '(menu-item "GNU make" makefile-gmake-mode + :help "An adapted `makefile-mode' that knows about GNU make" + :button (:radio . (eq major-mode 'makefile-gmake-mode)))) (define-key map [menu-bar makefile-mode browse] - '("Pop up Makefile Browser" . makefile-switch-to-browser)) - (define-key map [menu-bar makefile-mode complete] - '("Complete Target or Macro" . makefile-complete)) + '(menu-item "Pop up Makefile Browser" makefile-switch-to-browser + ;; XXX: this needs a better string, the function is not documented... + :help "Pop up Makefile Browser")) + (define-key map [menu-bar makefile-mode overview] + '(menu-item "Up To Date Overview" makefile-create-up-to-date-overview + :help "Create a buffer containing an overview of the state of all known targets")) + ;; Target related + (define-key map [menu-bar makefile-mode separator1] '("----")) + (define-key map [menu-bar makefile-mode pickup-file] + '(menu-item "Pick File Name as Target" makefile-pickup-filenames-as-targets + :help "Scan the current directory for filenames to use as targets")) + (define-key map [menu-bar makefile-mode function] + '(menu-item "Insert GNU make function" makefile-insert-gmake-function + :help "Insert a GNU make function call")) (define-key map [menu-bar makefile-mode pickup] - '("Find Targets and Macros" . makefile-pickup-everything)) - + '(menu-item "Find Targets and Macros" makefile-pickup-everything + :help "Notice names of all macros and targets in Makefile")) + (define-key map [menu-bar makefile-mode complete] + '(menu-item "Complete Target or Macro" makefile-complete + :help "Perform completion on Makefile construct preceding point")) + (define-key map [menu-bar makefile-mode backslash] + '(menu-item "Backslash Region" makefile-backslash-region + :help "Insert, align, or delete end-of-line backslashes on the lines in the region")) + ;; Motion + (define-key map [menu-bar makefile-mode separator] '("----")) (define-key map [menu-bar makefile-mode prev] - '("Move to Previous Dependency" . makefile-previous-dependency)) + '(menu-item "Move to Previous Dependency" makefile-previous-dependency + :help "Move point to the beginning of the previous dependency line")) (define-key map [menu-bar makefile-mode next] - '("Move to Next Dependency" . makefile-next-dependency)) + '(menu-item "Move to Next Dependency" makefile-next-dependency + :help "Move point to the beginning of the next dependency line")) map) "The keymap that is used in Makefile mode.") @@ -1139,87 +1186,34 @@ The context determines which are considered." (skip-chars-backward "^$(){}:#= \t\n") (point))) (try (buffer-substring beg (point))) - (do-macros nil) - (paren nil)) - - (save-excursion - (goto-char beg) - (let ((pc (preceding-char))) - (cond - ;; Beginning of line means anything. - ((bolp) - ()) - - ;; Preceding "$" means macros only. - ((= pc ?$) - (setq do-macros t)) - - ;; Preceding "$(" or "${" means macros only. - ((and (or (= pc ?{) - (= pc ?\()) - (progn - (setq paren pc) - (backward-char) - (and (not (bolp)) - (= (preceding-char) ?$)))) - (setq do-macros t))))) - - ;; Try completion. - (let* ((table (append (if do-macros - '() - makefile-target-table) - makefile-macro-table)) - (completion (try-completion try table))) - (cond - ;; Exact match, so insert closing paren or colon. - ((eq completion t) - (insert (if do-macros - (if (eq paren ?{) - ?} - ?\)) - (if (save-excursion - (goto-char beg) - (bolp)) - ":" - " ")))) - - ;; No match. - ((null completion) - (message "Can't find completion for \"%s\"" try) - (ding)) - - ;; Partial completion. - ((not (string= try completion)) - ;; FIXME it would be nice to supply the closing paren if an - ;; exact, unambiguous match were found. That is not possible - ;; right now. Ditto closing ":" for targets. - (delete-region beg (point)) - - ;; DO-MACROS means doing macros only. If not that, then check - ;; to see if this completion is a macro. Special insertion - ;; must be done for macros. - (if (or do-macros - (assoc completion makefile-macro-table)) - (let ((makefile-use-curly-braces-for-macros-p - (or (eq paren ?{) - makefile-use-curly-braces-for-macros-p))) - (delete-backward-char 2) - (makefile-do-macro-insertion completion) - (delete-backward-char 1)) - - ;; Just insert targets. - (insert completion))) - - ;; Can't complete any more, so make completion list. FIXME - ;; this doesn't do the right thing when the completion is - ;; actually inserted. I don't think there is an easy way to do - ;; that. - (t - (message "Making completion list...") - (let ((list (all-completions try table))) - (with-output-to-temp-buffer "*Completions*" - (display-completion-list list try))) - (message "Making completion list...done")))))) + (paren nil) + (do-macros + (save-excursion + (goto-char beg) + (let ((pc (preceding-char))) + (cond + ;; Preceding "$" means macros only. + ((= pc ?$) + t) + + ;; Preceding "$(" or "${" means macros only. + ((and (memq pc '(?\{ ?\()) + (progn + (setq paren (if (eq paren ?\{) ?\} ?\))) + (backward-char) + (= (preceding-char) ?$))) + t))))) + + (table (apply-partially 'completion-table-with-terminator + (cond + (do-macros (or paren "")) + ((save-excursion (goto-char beg) (bolp)) ":") + (t " ")) + (append (if do-macros + '() + makefile-target-table) + makefile-macro-table)))) + (completion-in-region beg (point) table))) @@ -1304,7 +1298,7 @@ definition and conveniently use this command." (save-excursion (beginning-of-line) (cond - ((looking-at "^#+\\s-*") + ((looking-at "^[ \t]*#+\\s-*") ;; Found a comment. Return nil to let normal filling take place. nil) @@ -1440,9 +1434,10 @@ definition and conveniently use this command." (let ((this-line (count-lines (point-min) (point)))) (setq this-line (max 1 this-line)) (makefile-browser-toggle-state-for-line this-line) - (goto-line this-line) + (goto-char (point-min)) + (forward-line (1- this-line)) (let ((inhibit-read-only t)) - (beginning-of-line) + (beginning-of-line) ; redundant? (if (makefile-browser-on-macro-line-p) (let ((macro-name (makefile-browser-this-line-macro-name))) (delete-region (point) (progn (end-of-line) (point))) @@ -1482,7 +1477,7 @@ large dependencies from the browser to the client buffer. Insertion takes place at point." (interactive) (save-excursion - (goto-line 1) + (goto-char (point-min)) (let ((current-line 1)) (while (not (eobp)) (if (makefile-browser-get-state-for-line current-line) @@ -1642,7 +1637,7 @@ and generates the overview, one line per target name." ;;; ------------------------------------------------------------ (defun makefile-cleanup-continuations () - (if (eq major-mode 'makefile-mode) + (if (derived-mode-p 'makefile-mode) (if (and makefile-cleanup-continuations (not buffer-read-only)) (save-excursion @@ -1657,7 +1652,7 @@ and generates the overview, one line per target name." (defun makefile-warn-suspicious-lines () ;; Returning non-nil cancels the save operation - (if (eq major-mode 'makefile-mode) + (if (derived-mode-p 'makefile-mode) (save-excursion (goto-char (point-min)) (if (re-search-forward "^\\(\t+$\\| +\t\\)" nil t) @@ -1666,7 +1661,7 @@ and generates the overview, one line per target name." (count-lines (point-min) (point))))))))) (defun makefile-warn-continuations () - (if (eq major-mode 'makefile-mode) + (if (derived-mode-p 'makefile-mode) (save-excursion (goto-char (point-min)) (if (re-search-forward "\\\\[ \t]+$" nil t) @@ -1715,11 +1710,12 @@ Then prompts for all required parameters." "To be called as an anchored matcher by font-lock. The anchor must have matched the opening parens in the first group." (let ((s (match-string-no-properties 1))) - (setq s (cond ((string= s "(") "\\(.*?\\)[ \t]*)") - ((string= s "{") "\\(.*?\\)[ \t]*}") - ((string= s "((") "\\(.*?\\)[ \t]*))") - ((string= s "{{") "\\(.*?\\)[ \t]*}}"))) - (if s (looking-at s)))) + ;; FIXME forward-sexp or somesuch would be better? + (if (setq s (cond ((string= s "(") ")") + ((string= s "{") "}") + ((string= s "((") "))") + ((string= s "{{") "}}"))) + (re-search-forward (concat "\\(.*\\)[ \t]*" s) (line-end-position) t)))) (defun makefile-match-dependency (bound) "Search for `makefile-dependency-regex' up to BOUND.