;;; nxhtml-menu.el --- Defines menus for nXhtml ;; ;; Author: Lennart Borgman (lennart O borgman A gmail O com) ;; Created: Sat Apr 21 2007 ;; Moved version to autostart.el. ;; Last-Updated: 2010-01-04 Mon ;; URL: ;; Keywords: ;; Compatibility: ;; ;; Features that might be required by this library: ;; ;; None ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;; Commentary: ;; ;; Menus for nXhtml to be used in different major modes. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;; Change log: ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; This program 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. ;; ;; This program 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 this program; see the file COPYING. If not, write to ;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth ;; Floor, Boston, MA 02110-1301, USA. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;; Code: (eval-when-compile (require 'cl)) (eval-when-compile (require 'cus-edit)) (eval-when-compile (require 'dired)) (eval-when-compile (require 'gimpedit nil t)) (eval-when-compile (require 'html-site nil t)) (eval-when-compile (when (fboundp 'nxml-mode) (require 'nxhtml-mode nil t))) (eval-when-compile (require 'css-color nil t)) (eval-when-compile (require 'flymake)) ;;(eval-when-compile (require 'flymake-php)) (eval-when-compile (require 'flymake-js nil t)) (eval-when-compile (require 'mumamo nil t)) (eval-when-compile (require 'nxhtml-base)) (eval-when-compile (require 'udev-ecb nil t)) ;;(eval-when-compile (require 'udev-cedet)) (eval-when-compile (require 'udev-rinari nil t)) (defun nxhtml-nxhtml-in-buffer () (or (derived-mode-p 'nxhtml-mode) (when (and (boundp 'mumamo-multi-major-mode) mumamo-multi-major-mode) (let ((major-mode (mumamo-main-major-mode))) (derived-mode-p 'nxhtml-mode))))) (defun nxhtml-nxml-in-buffer () (or (derived-mode-p 'nxml-mode) (when (and (boundp 'mumamo-multi-major-mode) mumamo-multi-major-mode) (let ((major-mode (mumamo-main-major-mode))) (derived-mode-p 'nxml-mode))))) (defun nxhtml-html-in-buffer () (or (derived-mode-p 'html-mode) (when (and (boundp 'mumamo-multi-major-mode) mumamo-multi-major-mode) (let ((major-mode (mumamo-main-major-mode))) (derived-mode-p 'html-mode))) (nxhtml-nxhtml-in-buffer))) (defun nxhtml-nxml-html-in-buffer () (or (derived-mode-p 'html-mode) (when (and (boundp 'mumamo-multi-major-mode) mumamo-multi-major-mode) (let ((major-mode (mumamo-main-major-mode))) (derived-mode-p 'html-mode))) (nxhtml-nxml-in-buffer))) (defun buffer-or-dired-file-name () "Return buffer file name or file pointed to in dired." (if (derived-mode-p 'dired-mode) (dired-get-file-for-visit) buffer-file-name)) (defun nxhtml-this-file-can-have-toc (&optional file) (unless file (setq file (buffer-or-dired-file-name))) (and (nxhtml-buffer-possibly-local-viewable file) (html-site-current-merge-dir) (html-site-current-ensure-file-in-site file))) (defun nxhtml-buffer-possibly-local-viewable (&optional file) (unless file (setq file (buffer-or-dired-file-name))) (or (and file (member (file-name-extension file) '("html" "htm" "gif" "png"))))) (defun nxhtml-buffer-possibly-remote-viewable () ;; Fix-me (let* ((fmt "nxhtml-buffer-possibly-remote-viewable.dgffv: %s") (file (or buffer-file-name (and (derived-mode-p 'dired-mode) (condition-case err (dired-get-file-for-visit) (error (message fmt (error-message-string err)) nil)))))) (and (featurep 'html-upl) file (member (downcase (file-name-extension file)) '("html" "htm" "gif" "png" "pl" "php"))))) ;; (nxhtml-insert-menu-dynamically 'temp) (defun nxhtml-insert-menu-dynamically (real-binding) (or (and (symbolp real-binding) (boundp real-binding) (symbol-value real-binding)) (let ((map (make-sparse-keymap "Not loaded yet"))) (define-key map [dummy] (list 'menu-item "Not loaded yet" 'ignore)) map) ;; (easy-menu-filter-return ;; (easy-menu-create-menu ;; "Not ready" ;; '(["Not Loaded Yet" ignore t]))) )) (defun nxhtml-menu-image-file () (or (get-char-property (point) 'image-file) buffer-file-name)) (defun nxhtml-gimp-can-edit () (or (not (featurep 'gimp)) (gimpedit-can-edit (nxhtml-menu-image-file)))) ;;;###autoload (defun nxhtml-edit-with-gimp () "Edit with GIMP buffer or file at point." (interactive) (gimpedit-edit-file (nxhtml-menu-image-file))) ;;;###autoload (defun nxhtml-browse-file (file) "View file in web browser." (interactive (list (or (buffer-or-dired-file-name) (read-file-name "File: ")))) (let* ((buf (if (buffer-file-name) (current-buffer) (find-buffer-visiting file))) (use-temp (and (buffer-file-name) (or (and (boundp 'nxhtml-current-validation-header) nxhtml-current-validation-header) (buffer-modified-p) (not buffer-file-name) (not (file-exists-p buffer-file-name))))) (file-to-browse file)) (when use-temp (setq file-to-browse (nxhtml-save-browseable-temp-file nil nil use-temp))) ;; Fix-me: Workaround for Emacs bug on w32 ;; http://emacsbugs.donarmstrong.com/cgi-bin/bugreport.cgi?bug=4015 (if (eq system-type 'windows-nt) (w32-shell-execute nil (concat "file:///" file-to-browse) nil 1) (browse-url-of-file file-to-browse)) )) ;;;###autoload (defun nxhtml-browse-region () "View region in web browser." (interactive) (unless mark-active (error "The region is not active")) (browse-url (nxhtml-save-browseable-temp-file (region-beginning) (region-end)))) ;;(defvar nxhtml-browseable-buffer-name "*nXhtml Browsing Buffer*") (defvar nxhtml-browseable-buffer-file "~/.temp-nxhtml-browse.htm") ;; Fix-me: Handle base href here! (defun nxhtml-save-browseable-temp-file (start end &optional doit-anyway) "Return a temporary file for viewing in web browser." ;; When using this either region should be active or there should be ;; a validation header or both. (or doit-anyway (and start end) ;mark-active (and (boundp 'nxhtml-validation-header-mode) nxhtml-validation-header-mode nxhtml-current-validation-header) (error "Neither region nor validation header")) (save-excursion (let ((curbuf (current-buffer)) (view-buffer (find-file-noselect nxhtml-browseable-buffer-file)) header content) ;; Get header and content (save-restriction (widen) (setq header (if nxhtml-validation-header-mode (let* ((key nxhtml-current-validation-header) (rec (unless (listp key) (assoc key nxhtml-validation-headers))) (header (cdr rec))) header) (if (and doit-anyway (not start)) "" (goto-char (point-min)) (save-match-data (let ((body (re-search-forward "]*>"))) (if body (buffer-substring-no-properties (point-min) (match-end 0)) "")))))) (setq content (if start (buffer-substring-no-properties start end) (buffer-substring-no-properties (point-min) (point-max)))) ) ;; Switch to view buffer (set-buffer view-buffer) ;; (unless buffer-file-name ;; (set-visited-file-name nxhtml-browseable-buffer-file) ;; (rename-buffer nxhtml-valhead-view-buffer-name)) (erase-buffer) (insert header content) ;;(when (fboundp 'emacsw32-eol-set) (emacsw32-eol-set nil)) (nxhtml-mode) (save-buffer) ;;(current-buffer) (kill-buffer view-buffer) (expand-file-name nxhtml-browseable-buffer-file) ))) (defvar nxhtml-menu-mode-menu-map (let ((map (make-sparse-keymap "nxhtml-menu-mode-menu"))) (let ((help-map (make-sparse-keymap))) (define-key help-map [emacs-Q-nxhtml] (list 'menu-item "Start 'emacs -Q' and load nXhtml" 'emacs-Q-nxhtml)) (define-key help-map [nxhtmltest-run] (list 'menu-item "Run nXhtml Tests in Current Emacs" 'nxhtmltest-run)) (define-key help-map [nxhtmltest-run-Q] (list 'menu-item "Run nXhtml Tests in a Fresh Emacs" 'nxhtmltest-run-Q)) (define-key help-map [nxhtml-report-bug] (list 'menu-item "Report a Bug in nXhtml ..." 'nxhtml-report-bug)) (define-key help-map [nxhtml-help-separator2] (list 'menu-item "--")) (define-key help-map [nxhtml-byte-compile-nxhtml] (list 'menu-item "Byte Compile nXhtml" 'nxhtmlmaint-start-byte-compilation)) ;; Downloads (let ((download-map (make-sparse-keymap))) (define-key help-map [nxhtml-downloading] (list 'menu-item "Download nXhtml Updates" download-map)) (define-key download-map [nxhtml-web-download-log] (list 'menu-item "View Download Log" 'web-vcs-log-edit)) (define-key download-map [nxhtml-view-dl-log-separator] (list 'menu-item "--" nil)) (define-key download-map [nxhtml-web-auto-download] (list 'menu-item "Auto download from Devel Sources" 'nxhtml-autoload-web :button '(:toggle . (and (boundp 'nxhtml-autoload-web) nxhtml-autoload-web)))) (define-key download-map [nxhtml-web-download] (list 'menu-item "Update nXhtml (from devel sources)" 'nxhtml-update-existing-files)) ) (define-key help-map [nxhtml-features-check] (list 'menu-item "Check Optional Features" 'nxhtml-features-check)) (define-key help-map [nxhtml-list-multi-modes] (list 'menu-item "List Available Multi Major Modes" 'mumamo-list-defined-multi-major-modes)) (define-key help-map [nxhtml-customize] (list 'menu-item "Customize nXhtml ..." 'nxhtml-customize)) ;;; (define-key help-map [nxhtml-quick-customize] ;;; (list 'menu-item "Quick Customize nXhtml ..." 'nxhtml-quick-customize)) (define-key help-map [nxhtml-help-separator3] (list 'menu-item "--")) ;;; (define-key help-map [nxhtml-help] ;;; (list 'menu-item "nXhtml Help" 'nxhtml-help)) (define-key help-map [nxhtml-tutorials] (list 'menu-item "nXhtml Tutorials" 'nxhtml-tutorials)) (define-key help-map [nxhtml-overview] (list 'menu-item (concat "nXhtml Version " (if (boundp 'nxhtml-menu:version) nxhtml-menu:version "(unknown)") " Overview") 'nxhtml-overview)) (define-key help-map [nxhtml-welcome] (list 'menu-item "Welcome to nXhtml" 'nxhtml-welcome)) (define-key map [nxhtml-help-map] (list 'menu-item "nXhtml Help and Setup" help-map)) (define-key map [nxhtml-info-separator] (list 'menu-item "--")) ) (let ((tools-map (make-sparse-keymap))) (define-key map [nxhtml-tools-map] (list 'menu-item "Tools" tools-map)) (define-key tools-map [nxhtml-last-resort] (list 'menu-item "Last Resort" 'n-back-game)) (define-key tools-map [nxhtml-pause] (list 'menu-item "Life Reminder" 'pause-start-in-new-emacs)) (define-key tools-map [nxhtml-last-resort-separator] (list 'menu-item "--" nil)) (define-key tools-map [nxhtml-viper-tut] (list 'menu-item "Viper Try-Out Tutorial" 'viper-tutorial)) (define-key tools-map [nxhtml-viper-separator] (list 'menu-item "--" nil)) ;;(define-key tools-map [nxhtml-frame-win-separator] (list 'menu-item "--" nil)) (define-key tools-map [nxhtml-resize-windows] (list 'menu-item "Resize Windows" 'resize-windows)) (define-key tools-map [nxhtml-ecb-separator] (list 'menu-item "--" nil)) (let ((ecb-map (make-sparse-keymap))) (define-key tools-map [nxhtml-ecb-map] (list 'menu-item "ECB" ecb-map)) (define-key ecb-map [nxhtml-custom-important-ecb] (list 'menu-item "Customize important ECB things" (lambda () "Customize group `ecb-most-important'." (interactive) (customize-group-other-window 'ecb-most-important)) :enable '(featurep 'ecb))) (define-key ecb-map [nxhtml-ecb-mode] (list 'menu-item "ECB Minor Mode" 'ecb-minor-mode :button '(:toggle . (and (boundp 'ecb-minor-mode) ecb-minor-mode)) :enable '(boundp 'ecb-minor-mode))) (define-key ecb-map [nxhtml-ecb-show-help] (list 'menu-item "ECB Help" 'ecb-show-help :enable '(fboundp 'ecb-show-help))) (define-key ecb-map [nxhtml-ecb-custom-separator] (list 'menu-item "--" nil)) (define-key ecb-map [nxhtml-custom-ecb] (list 'menu-item "Customize ECB dev startup from nXhtml" 'udev-ecb-customize-startup)) (define-key ecb-map [nxhtml-update-ecb] (list 'menu-item "Fetch/update ECB dev sources" 'udev-ecb-update)) (define-key ecb-map [nxhtml-ecb-home-separator] (list 'menu-item "--" nil)) (define-key ecb-map [nxhtml-rinari-homepage] (list 'menu-item "ECB Home Page" (lambda () "Open ECB home page in your web browser." (interactive) (browse-url "http://ecb.sourceforge.net/")))) ) ;; (let ((cedet-map (make-sparse-keymap))) ;; (define-key tools-map [nxhtml-cedet-map] ;; (list 'menu-item "CEDET" cedet-map)) ;; (define-key cedet-map [nxhtml-custom-cedet] ;; (list 'menu-item "Customize CEDET dev startup from nXhtml" ;; 'udev-cedet-customize-startup)) ;; (define-key cedet-map [nxhtml-cedet-utest] ;; (list 'menu-item "Run CEDET unit tests" ;; 'udev-cedet-utest)) ;; (define-key cedet-map [nxhtml-update-cedet] ;; (list 'menu-item "Fetch/update and install CEDET dev sources" ;; 'udev-cedet-update)) ;; (define-key cedet-map [nxhtml-cedet-home-separator] ;; (list 'menu-item "--" nil)) ;; (define-key cedet-map [nxhtml-rinari-homepage] ;; (list 'menu-item "CEDET Home Page" ;; (lambda () ;; "Open CEDET home page in your web browser." ;; (interactive) ;; (browse-url "http://cedet.sourceforge.net/")))) ;; ) (let ((rinari-map (make-sparse-keymap))) (define-key tools-map [nxhtml-rinari-map] (list 'menu-item "Rinari" rinari-map)) (define-key rinari-map [nxhtml-custom-rinari] (list 'menu-item "Customize Rinari startup from nXhtml" (lambda () "Customize Rinari dev nXhtml startup options." (interactive) (customize-group-other-window 'udev-rinari)))) (define-key rinari-map [nxhtml-update-rinari] (list 'menu-item "Fetch/update Rinari dev sources" 'udev-rinari-update)) (define-key rinari-map [nxhtml-rinari-home-separator] (list 'menu-item "--" nil)) (define-key rinari-map [nxhtml-rinari-homepage] (list 'menu-item "Rinari Home Page" (lambda () "Open Rinari home page in your web browser." (interactive) (browse-url "http://rubyforge.org/projects/rinari/")))) ) (let ((mozrepl-map (make-sparse-keymap))) (define-key tools-map [nxhtml-mozrepl-map] (list 'menu-item "MozRepl - control Firefox" mozrepl-map)) (let ((mozrepl-low-map (make-sparse-keymap))) (define-key mozrepl-map [nxhtml-mozrepl-map] (list 'menu-item "MozRepl Basic Functions" mozrepl-low-map)) (define-key mozrepl-low-map [nxhtml-mozrepl-run-mozilla] (list 'menu-item "Display/Start MozRepl Process" 'run-mozilla :enable '(fboundp 'moz-minor-mode))) (define-key mozrepl-low-map [nxhtml-mozrepl-separator1] (list 'menu-item "--" nil)) (define-key mozrepl-low-map [nxhtml-mozrepl-save-and-send] (list 'menu-item "Save Buffer and Send it" 'moz-save-buffer-and-send :enable '(or (not (boundp 'mumamo-multi-major-mode)) (not mumamo-multi-major-mode)))) (define-key mozrepl-low-map [nxhtml-mozrepl-send-defun-and-go] (list 'menu-item "Send Current Function, Go to MozRepl" 'moz-send-defun-and-go :enable '(and (boundp 'moz-minor-mode) moz-minor-mode))) (define-key mozrepl-low-map [nxhtml-mozrepl-send-defun] (list 'menu-item "Send Current Function" 'moz-send-defun :enable '(and (boundp 'moz-minor-mode) moz-minor-mode))) (define-key mozrepl-low-map [nxhtml-mozrepl-send-region] (list 'menu-item "Send the Region" 'moz-send-region :enable '(and mark-active (boundp 'moz-minor-mode) moz-minor-mode)))) (define-key mozrepl-map [nxhtml-mozrepl-separator2] (list 'menu-item "--" nil)) (define-key mozrepl-map [nxhtml-mozrepl-refresh] (list 'menu-item "Refresh Firefox on Save" 'mozadd-refresh-edited-on-save-mode :button '(:toggle . (and (boundp 'mozadd-refresh-edited-on-save-mode) mozadd-refresh-edited-on-save-mode)))) (define-key mozrepl-map [nxhtml-mozrepl-mirror] (list 'menu-item "Mirror Buffer in Firefox" 'mozadd-mirror-mode :button '(:toggle . (and (boundp 'mozadd-mirror-mode) mozadd-mirror-mode)))) (define-key mozrepl-map [nxhtml-mozrepl-separator3] (list 'menu-item "--" nil)) (define-key mozrepl-map [nxhtml-mozrepl-home-page] (list 'menu-item "MozLab/MozRepl Home Page" (lambda () "Open MozLab/MozRepl home page in your web browser." (interactive) (browse-url "http://hyperstruct.net/projects/mozlab")))) ) (define-key tools-map [nxhtml-ediff-url] (list 'menu-item "Compare download file" 'ediff-url)) (define-key tools-map [nxhtml-investigate-elisp] (list 'menu-item "Investigate Elisp File" 'web-vcs-investigate-elisp-file)) (define-key tools-map [nxhtml-tidy-separator] (list 'menu-item "--" nil)) (define-key tools-map [nxhtml-flymake] (list 'menu-item "Flymake Mode" 'flymake-mode :button '(:toggle . (and (boundp 'flymake-mode) flymake-mode)) :enable '(and buffer-file-name (require 'flymake) (fboundp 'flymake-get-init-function) (flymake-get-init-function buffer-file-name) ))) (let ((flyspell-map (make-sparse-keymap))) (define-key tools-map [nxhtml-flyspell-map] (list 'menu-item "Flyspell" flyspell-map)) (define-key flyspell-map [nxhtml-flyspell-goto-next] (list 'menu-item "Flyspell Go To Next Error" 'flyspell-goto-next-error :enable 'flyspell-mode)) (define-key flyspell-map [nxhtml-flyspell-region] (list 'menu-item "Flyspell Region" 'flyspell-region :enable 'flyspell-mode)) (define-key flyspell-map [nxhtml-flyspell-div-1] (list 'menu-item "--")) (define-key flyspell-map [nxhtml-flyspell] (list 'menu-item "Flyspell Mode" 'flyspell-mode :button '(:toggle . (and (boundp 'flyspell-mode) flyspell-mode)))) ) (define-key tools-map [nxhtml-flyspell-separator] (list 'menu-item "--")) (let ((img-map (make-sparse-keymap))) (define-key tools-map [nxhtml-img-map] (list 'menu-item "Images" img-map)) (define-key img-map [nxhtml-chartg] (list 'menu-item "Make Chart" 'chartg-make-chart)) (define-key img-map [nxhtml-chartg-separator] (list 'menu-item "--")) (define-key img-map [nxhtml-gimp-edit] (list 'menu-item "Edit with GIMP" 'nxhtml-edit-with-gimp :enable '(nxhtml-gimp-can-edit))) (define-key img-map [nxhtml-gimp-separator] (list 'menu-item "--")) (define-key img-map [nxhtml-inlimg-toggle-display] (list 'menu-item "Toggle Display of Image" 'inlimg-toggle-display)) (define-key img-map [nxhtml-inlimg-toggle-slicing] (list 'menu-item "Toggle Slicing of Image" 'inlimg-toggle-slicing)) (define-key img-map [nxhtml-inlimg-mode] (list 'menu-item "Show Images" 'inlimg-mode :button '(:toggle . (and (boundp 'inlimg-mode) inlimg-mode))))) (define-key tools-map [nxhtml-img-separator] (list 'menu-item "--")) (let ((some-help-map (make-sparse-keymap))) (define-key tools-map [nxhtml-some-help-map] (list 'menu-item "Help for Item at Point" some-help-map)) (define-key some-help-map [nxhtml-css-help] (list 'menu-item "CSS Help" 'xhtml-help-show-css-ref)) (define-key some-help-map [nxhtml-tag-help] (list 'menu-item "XHTML Tag Help" 'nxhtml-short-tag-help))) (let ((cssclr-map (make-sparse-keymap))) (define-key tools-map [nxhtml-css-color] (list 'menu-item "Color Help" cssclr-map)) (define-key cssclr-map [nxhtml-css-color-mode] (list 'menu-item "Css Color Mode" 'css-color-mode :enable '(and font-lock-mode ;; (or (not (boundp 'mumamo-multi-major-mode)) ;; (not mumamo-multi-major-mode)) ;; (featurep 'css-color) ) :button '(:toggle . (and (boundp 'css-color-mode) css-color-mode)))) (define-key cssclr-map [nxhtml-css-color-test] (list 'menu-item "Color Test" 'css-color-test ;; :enable '(featurep 'css-color) ))) (define-key tools-map [nxhtml-help-separator] (list 'menu-item "--")) (let ((html-link-map (make-sparse-keymap))) (define-key tools-map [nxhtml-link-map] (list 'menu-item "HTML Links" html-link-map :enable '(nxhtml-html-in-buffer))) (define-key html-link-map [nxhtml-chklnk] (list 'menu-item "Check Links" 'html-chklnk-check-site-links :enable '(featurep 'html-chklnk))) (let ((move-map (make-sparse-keymap))) (define-key html-link-map [move-map] (list 'menu-item "Moving Files" move-map)) (define-key move-map [html-move-buffer-file] (list 'menu-item "Move Buffer File" 'html-move-buffer-file :help "Move buffer file and update links" :enable '(and buffer-file-name (featurep 'html-move)))) (define-key html-link-map [move-map-separator] (list 'menu-item "--")) ) (define-key html-link-map [nxhtml-paste-link] (list 'menu-item "Paste Saved Relative Link" 'nxhtml-paste-link :help "Paste link" :enable '(and (boundp 'nxhtml-saved-link-file) nxhtml-saved-link-file))) (define-key html-link-map [nxhtml-paste-link-as-a-tag] (list 'menu-item "Paste Saved Relative Link as " 'nxhtml-paste-link-as-a-tag :help "Paste link as tag" :enable '(and (boundp 'nxhtml-saved-link-file) nxhtml-saved-link-file (nxhtml-nxml-html-in-buffer)))) (define-key html-link-map [nxhtml-save-link-to-here] (list 'menu-item "Save Relative Link to Current File" 'nxhtml-save-link-to-here :help "Save link info for current file" :enable 'buffer-file-name)) ) (let ((quick-map (make-sparse-keymap))) (define-key tools-map [nxhtml-quick-map] (list 'menu-item "Quick Inserts etc" quick-map :visible '(or (derived-mode-p 'html-mode) (nxhtml-nxhtml-in-buffer)))) (let ((sometoc-map (make-sparse-keymap))) (let ((toc-map (make-sparse-keymap))) (define-key sometoc-map [nxhtml-toc-map] (list 'menu-item "For Site" toc-map :enable '(featurep 'html-toc))) (define-key toc-map [nxhtml-html-wtoc] (list 'menu-item "Merge Pages and TOC" 'html-wtoc-write-pages-with-toc :enable '(or (not (featurep 'html-site)) (html-site-current-page-list)))) (define-key toc-map [nxthml-html-toc] (list 'menu-item "With Frames" 'html-toc-menu-map :filter 'nxhtml-insert-menu-dynamically))) (define-key sometoc-map [nxhtml-html-pagetoc] (list 'menu-item "For Page" 'html-pagetoc-menu-map :enable (boundp 'html-pagetoc-menu-map) :filter 'nxhtml-insert-menu-dynamically )) (define-key quick-map [nxhtml-sometoc-map] (list 'menu-item "Table of Contents" sometoc-map :visible '(or (derived-mode-p 'html-mode) (nxhtml-nxhtml-in-buffer))))) (define-key quick-map [nxhtml-quick-sep-1] (list 'menu-item "--")) (define-key quick-map [nxhtml-spec-chars] (list 'menu-item "Insert special character" 'nxml-insert-named-char)) (define-key quick-map [nxhtml-css-rollover] (list 'menu-item "Insert CSS Rollover Images" 'nxhtml-rollover-insert-2v))) (define-key tools-map [nxhtml-html-write-mode] (list 'menu-item "HTML Write Mode" 'html-write-mode :enable '(nxhtml-html-in-buffer) :button '(:toggle . (and (boundp 'html-write-mode) html-write-mode)))) (define-key tools-map [nxhtml-tidy-map] (list 'menu-item "Tidy XHTML" 'tidy-menu-symbol ;; Seems like :visible is called before :filter so we ;; can compute things in :visible. :filter 'nxhtml-insert-menu-dynamically :visible '(or (and (or (derived-mode-p 'html-mode) (nxhtml-nxhtml-in-buffer)) (fboundp 'tidy-build-menu) (tidy-build-menu)) t) :enable '(and (or (derived-mode-p 'html-mode) (nxhtml-nxhtml-in-buffer)) (fboundp 'tidy-build-menu) (tidy-build-menu)) )) (define-key tools-map [zencoding] (list 'menu-item "Zen coding for HTML/CSS" 'zencoding-mode :button '(:toggle . (and (boundp 'zencoding-mode) zencoding-mode)) :enable '(nxhtml-html-in-buffer))) (let ((where-map (make-sparse-keymap))) (define-key tools-map [nxml-where] (list 'menu-item "XML Path" where-map :enable '(and (fboundp 'nxml-where-mode) (or (derived-mode-p 'nxml-mode) (nxhtml-nxhtml-in-buffer))))) (define-key where-map [nxhtml-nxml-where-cust] (list 'menu-item "Customize display of XML Path" (lambda () "Customize XML path, ie group `nxml-where'." (interactive) (customize-group-other-window 'nxml-where)))) (define-key where-map [where-separator-2] (list 'menu-item "--")) (define-key where-map [nxml-where-inner] (list 'menu-item "Show inly inner tag" 'nxml-where-only-inner-toggle :enable '(boundp 'nxml-where-only-inner) :button '(:toggle . (and (boundp 'nxml-where-only-inner) nxml-where-only-inner)))) (define-key where-map [nxml-where-id] (list 'menu-item "Show tag ids in path" 'nxml-where-tag+id-toggle :enable '(boundp 'nxml-where-tag+id) :button '(:toggle . (and (boundp 'nxml-where-tag+id) nxml-where-tag+id)))) (define-key where-map [nxml-where-header] (list 'menu-item "Show XML path in header" 'nxml-where-header-toggle :enable '(boundp 'nxml-where-header) :button '(:toggle . (and (boundp 'nxml-where-header) 'nxml-where-header)))) (define-key where-map [nxml-where-marks] (list 'menu-item "Show XML path marks" 'nxml-where-marks-toggle :enable '(boundp 'nxml-where-marks) :button '(:toggle . (and (boundp 'nxml-where-marks) nxml-where-marks)))) (define-key where-map [where-separator] (list 'menu-item "--")) (define-key where-map [nxml-where-global-toggle] (list 'menu-item "Show XML path" 'nxml-where-global-mode :button '(:toggle . (and (boundp 'nxml-where-global-mode) nxml-where-global-mode)))) (define-key where-map [nxml-where-toggle] (list 'menu-item "Show XML path in buffer" 'nxml-where-mode :button '(:toggle . (and (boundp 'nxml-where-mode) nxml-where-mode)))) ) (let ((cmpl-map (make-sparse-keymap))) (define-key tools-map [nxhtml-cmpl-map] (list 'menu-item "XHTML Completion and Validation" cmpl-map ;; :enable '(or (derived-mode-p 'nxml-mode) (nxhtml-nxhtml-in-buffer)) :visible `(not (derived-mode-p 'dired-mode)) :enable ' (or (derived-mode-p 'nxml-mode) (nxhtml-nxhtml-in-buffer)) )) (let ((val-map (make-sparse-keymap))) (define-key cmpl-map [nxhtml-cmpl-val-map] (list 'menu-item "Validation Helpers (for php etc)" val-map :enable '(nxhtml-nxhtml-in-buffer) :visible '(nxhtml-nxml-html-in-buffer))) ;;; (define-key val-map [nxhtml-strval-mode] ;;; (list 'menu-item "Allow attr=\"\" etc" ;;; 'nxhtml-strval-mode ;;; :button '(:toggle . nxhtml-strval-mode))) (define-key val-map [mumamo-alt-php-tags] (list 'menu-item "Use (?php" 'mumamo-alt-php-tags-mode :button '(:toggle . (and (boundp 'mumamo-alt-php-tags-mode) mumamo-alt-php-tags-mode)))) (define-key val-map [mumamo-alt-tags-separator] (list 'menu-item "--")) (define-key val-map [nxhtml-toggle-warnings] (list 'menu-item "Hide Validation Errors" 'nxhtml-toggle-visible-warnings :button '(:toggle . (not (nxhtml-warnings-are-visible))) )) (define-key val-map [nxhtml-error-separator] (list 'menu-item "--")) (define-key val-map [nxhtml-remove-saved-validation-header] (list 'menu-item "Remove File's Fictive XHTML Validation Header" 'nxhtml-remove-saved-validation-header ;; Fix-me: maybe a better enable here? :enable 'nxhtml-validation-header-mode)) (define-key val-map [nxhtml-save-validation-header] (list 'menu-item "Save File's Fictive XHTML Validation Header" 'nxhtml-save-validation-header :enable 'nxhtml-validation-header-mode)) (define-key val-map [nxhtml-set-validation-header] (list 'menu-item "Choose Fictive XHTML Validation Header for Buffer" 'nxhtml-set-validation-header)) (define-key val-map [nxhtml-update-validation-header] (list 'menu-item "Update Fictive XHTML Validation Header for Buffer" 'nxhtml-update-validation-header)) (define-key val-map [nxhtml-use-saved-val-separator] (list 'menu-item "--")) ;;; (let ((afic-map (make-sparse-keymap))) ;;; (define-key val-map [nxhtml-afic-map] ;;; (list 'menu-item "Automatic Fictive XHTML Validation Header" afic-map)) ;;; (define-key afic-map [nxhtml-validation-header-mumamo-set] ;;; (list 'menu-item "Customize Automatic XHTML Validation Turn On" ;;; (lambda () (interactive) (customize-option 'nxhtml-validation-header-mumamo-modes)))) ;;; (define-key afic-map [nxhtml-validation-header-mumamo] ;;; (list 'menu-item "Turn on Fictive XHTML Validation Header with MuMaMo" ;;; 'nxhtml-validation-header-if-mumamo-toggle ;;; :button '(:toggle . nxhtml-validation-header-if-mumamo)))) (define-key val-map [nxhtml-show-validation-header] (list 'menu-item "Display Fictive XHTML Validation Header" 'rngalt-display-validation-header-toggle :help-echo "Displays the Fictive XHTML validation header (if any) at top of buffer" :button '(:toggle . (and (boundp 'rngalt-display-validation-header) rngalt-display-validation-header)))) (define-key val-map [nxhtml-recheck-validation-header] (list 'menu-item "Recheck Fictive XHTML Validation Header in Buffer" 'nxhtml-recheck-validation-header :enable 'nxhtml-validation-header-mode)) (define-key val-map [nxhtml-validation-header-mode] (list 'menu-item "Use Fictive XHTML Validation Header in Buffer" 'nxhtml-validation-header-mode :button '(:toggle . (and (boundp 'nxhtml-validation-header-mode) nxhtml-validation-header-mode)))) ) (define-key cmpl-map [nxhtml-validation-separator] (list 'menu-item "--" nil :visible '(nxhtml-nxml-html-in-buffer))) (let ((style-map (make-sparse-keymap))) (define-key cmpl-map [nxhtml-cmpl-style-map] (list 'menu-item "Completion Style" style-map :visible '(nxhtml-nxml-html-in-buffer) :enable '(nxhtml-nxhtml-in-buffer))) (define-key style-map [popcmp-customize] (list 'menu-item "Customize Completion Style" (lambda () (interactive) (customize-group-other-window 'popcmp)))) (define-key style-map [popcmp-style-div2] (list 'menu-item "--")) ;;(defun nxhtml-nxml-html-in-buffer () (define-key style-map [popcmp-with-help] (list 'menu-item "Show Short Help Beside Alternatives" 'popcmp-short-help-beside-alts-toggle :button '(:toggle . (and (boundp 'popcmp-short-help-beside-alts) popcmp-short-help-beside-alts)))) (define-key style-map [nxhtml-tag-do-also] (list 'menu-item "Complete Tag Extras" 'nxhtml-tag-do-also-toggle :button '(:toggle . (and (boundp 'nxhtml-tag-do-also) nxhtml-tag-do-also)))) (define-key style-map [popcmp-group-alternatives] (list 'menu-item "Group Alternatives" 'popcmp-group-alternatives-toggle :button '(:toggle . (and (boundp 'popcmp-group-alternatives) popcmp-group-alternatives)))) (define-key style-map [popcmp-style-div1] (list 'menu-item "--")) (define-key style-map [popcmp-anything-completion] (list 'menu-item "Anything Style Completion" (lambda () (interactive) (customize-set-variable 'popcmp-completion-style 'anything)) :enable `(fboundp 'anything) :button `(:radio . (eq popcmp-completion-style 'anything)))) (define-key style-map [popcmp-company-completion] (list 'menu-item "Company Mode Style Completion" (lambda () (interactive) (customize-set-variable 'popcmp-completion-style 'company-mode)) :enable `(fboundp 'company-mode) :button `(:radio . (eq popcmp-completion-style 'company-mode)))) (define-key style-map [popcmp-emacs-completion] (list 'menu-item "Emacs Default Style Completion" (lambda () (interactive) (customize-set-variable 'popcmp-completion-style 'emacs-default)) :button `(:radio . (eq popcmp-completion-style 'emacs-default)))) (define-key style-map [popcmp-popup-completion] (list 'menu-item "Popup Style Completion" (lambda () (interactive) (customize-set-variable 'popcmp-completion-style 'popcmp-popup)) :button `(:radio . (eq popcmp-completion-style 'popcmp-popup)))) ) (define-key cmpl-map [nxhtml-cmpl-separator] (list 'menu-item "--" nil :visible '(nxhtml-nxml-html-in-buffer))) (define-key cmpl-map [nxhtml-untag-element] (list 'menu-item "Untag Element" 'nxml-untag-element :enable '(nxhtml-nxhtml-in-buffer) :visible '(nxhtml-nxml-html-in-buffer))) (define-key cmpl-map [rngalt-finish-element] (list 'menu-item "Insert End Tag" 'rngalt-finish-element :enable '(nxhtml-nxhtml-in-buffer) :visible '(nxhtml-nxml-html-in-buffer))) (define-key cmpl-map [nxhtml-complete] (list 'menu-item "Complete tag, attribute etc" 'nxml-complete :enable '(nxhtml-nxml-in-buffer) :visible '(nxhtml-nxml-html-in-buffer))) ) ) (let ((options-map (make-sparse-keymap))) (define-key map [nxhtml-options-map] (list 'menu-item "Options" options-map)) (define-key options-map [nxhtml-save-opt] (list 'menu-item "Save All Changed Options" 'customize-save-customized)) (define-key options-map [nxhtml-save-sep] (list 'menu-item "--")) (define-key options-map [nxhtml-load-flymake] (list 'menu-item "Use nXhtml CSS/JS Flymake" 'nxhtml-flymake-setup :button '(:toggle . (and (boundp 'nxhtml-flymake-setup) nxhtml-flymake-setup)))) (define-key options-map [nxhtml-save-sep] (list 'menu-item "--")) (define-key options-map [nxhtml-winsav-mode] (list 'menu-item "Save/restore Frames and Windows" 'winsav-save-mode :button '(:toggle . (and (boundp 'winsav-save-mode) winsav-save-mode)))) (define-key options-map [nxhtml-win-sep] (list 'menu-item "--")) (define-key options-map [nxhtml-images-global] (list 'menu-item "Display Images Inline" 'inlimg-global-mode :button '(:toggle . (and (boundp 'inlimg-global-mode) inlimg-global-mode)))) (define-key options-map [nxhtml-opt-sep] (list 'menu-item "--")) (define-key options-map [nxhtml-hl-needed-mode] (list 'menu-item "Tell Me Where I Am" 'hl-needed-mode :button '(:toggle . (and (boundp 'hl-needed-mode) hl-needed-mode)))) (define-key options-map [nxhtml-mark-nonascii] (list 'menu-item "Mark Special Chars (default non-IDN)" 'markchars-global-mode :button '(:toggle . (and (boundp 'markchars-global-mode) markchars-global-mode)))) (define-key options-map [nxhtml-sml-modeline-mode] (list 'menu-item "Mode Line Scroll Indicator" 'sml-modeline-mode :button '(:toggle . (and (boundp 'sml-modeline-mode) sml-modeline-mode)))) (define-key options-map [rebind-keys] (list 'menu-item "Rebind My Choosen Keys" 'rebind-keys-mode :button '(:toggle . (and (boundp 'rebind-keys-mode) rebind-keys-mode)))) (define-key options-map [nxhtml-appmenu] (list 'menu-item "Context Sensitive AppMenu" 'appmenu-mode :button '(:toggle . (and (boundp 'appmenu-mode) appmenu-mode)))) (define-key options-map [nxhtml-menu-to-m-x] (list 'menu-item "Add Menu Commands to M-x history" 'ourcomments-M-x-menu-mode :button '(:toggle . (and (boundp 'ourcomments-M-x-menu-mode) ourcomments-M-x-menu-mode)))) (define-key options-map [nxhtml-patch-converting] (list 'menu-item "Paste with Convert" 'ourcomments-paste-with-convert-mode :button '(:toggle . (and (boundp 'ourcomments-paste-with-convert-mode) ourcomments-paste-with-convert-mode)))) (define-key options-map [nxhtml-tab-separator] (list 'menu-item "--" nil)) (define-key options-map [nxhtml-ctrl-tab] (list 'menu-item "Ctrl-TAB Buffer Switching" 'ourcomments-ido-ctrl-tab :button '(:toggle . (and (boundp 'ourcomments-ido-ctrl-tab) ourcomments-ido-ctrl-tab)))) (define-key options-map [nxhtml-tab-complete] (list 'menu-item "Indent and then Complete (TabKey2 mode)" 'tabkey2-mode :button '(:toggle . (and (boundp 'tabkey2-mode) tabkey2-mode)))) (define-key options-map [nxhtml-majpri-separator] (list 'menu-item "--" nil)) (define-key options-map [nxhtml-as-external] (list 'menu-item "External Editor Setup" 'as-external-mode :button '(:toggle . (and (boundp 'as-external-mode) as-external-mode)))) (define-key options-map [nxhtml-sex-mode] (list 'menu-item "Open Files in External Apps" 'sex-mode :button '(:toggle . (and (boundp 'sex-mode) sex-mode)))) (let ((majpri-map (make-sparse-keymap))) (define-key options-map [nxhtml-majpri-map] (list 'menu-item "Major Modes Priorities" majpri-map)) (define-key majpri-map [nxhtml-majpri-act] (list 'menu-item "Apply Major Modes Priorities" 'majmodpri-apply-priorities)) (define-key majpri-map [nxhtml-majpri-cust] (list 'menu-item "Customize Major Mode Priorities" (lambda () "Customize group Major Mode priorities." (interactive) (customize-group-other-window 'majmodpri)))) ) ) (let ((edit-map (make-sparse-keymap))) (define-key map [nxhtml-edit-map] (list 'menu-item "Edit" edit-map)) (let ((folding-map (make-sparse-keymap))) (define-key edit-map [nxhtml-folding-map] (list 'menu-item "Folding" folding-map)) (define-key folding-map [nxhtml-fold-unhide-all] (list 'menu-item "Unhide Everything" 'fold-dwim-unhide-hs-and-outline)) (define-key folding-map [nxhtml-fold-dwim] (list 'menu-item "Maybe DWIM Folding" 'fold-dwim-toggle)) (define-key folding-map [nxhtml-separator2] (list 'menu-item "--" nil)) (define-key folding-map [nxhtml-hs] (list 'menu-item "Turn On Hide/Show and Hide" 'fold-dwim-turn-on-hs-and-hide)) (define-key folding-map [nxhtml-outline] (list 'menu-item "Turn On Outline and Hide All" 'fold-dwim-turn-on-outline-and-hide-all)) (define-key folding-map [nxhtml-separator1] (list 'menu-item "--" nil)) (define-key folding-map [nxhtml-foldit-mode] (list 'menu-item "Folding Markers in Buffer" 'foldit-mode :button '(:toggle . (and (boundp 'foldit-mode) foldit-mode)))) (define-key folding-map [nxhtml-foldit-global-mode] (list 'menu-item "Folding Markers Everywhere" 'foldit-global-mode :button '(:toggle . (and (boundp 'foldit-global-mode) foldit-global-mode)))) ) (define-key edit-map [nxhtml-folding-sep] (list 'menu-item "--")) (define-key edit-map [nxhtml-wrap-to-fill-column-mode] (list 'menu-item "Wrap To Fill Column Mode" 'wrap-to-fill-column-mode :button '(:toggle . (and (boundp 'wrap-to-fill-column-mode) wrap-to-fill-column-mode)))) (define-key edit-map [nxhtml-fill-dwim] (list 'menu-item "Fill DWIM" 'fill-dwim)) (define-key edit-map [nxhtml-fill-sep] (list 'menu-item "--")) (let ((link-map (make-sparse-keymap))) (define-key edit-map [nxhtml-link-map] (list 'menu-item "Links" link-map :enable '(not (derived-mode-p 'dired-mode)) )) (define-key link-map [mlinks-goto-link-other-frame] (list 'menu-item "Follow MLink Link in New Frame" 'mlinks-goto-other-frame :enable '(and (boundp 'mlinks-mode) mlinks-mode) :help "Follow MLinks Link in New Frame")) (define-key link-map [mlinks-goto-link-other-window] (list 'menu-item "Follow MLink Link in Other Window" 'mlinks-goto-other-window :enable '(and (boundp 'mlinks-mode) mlinks-mode) :help "Follow MLinks Link in Other Window")) (define-key link-map [mlinks-goto-link] (list 'menu-item "Follow MLink Link" 'mlinks-goto :enable '(and (boundp 'mlinks-mode) mlinks-mode) :help "Follow MLinks Link")) (define-key link-map [nxhtml-separator-follow-mlink] (list 'menu-item "--")) (define-key link-map [mlinks-next-link] (list 'menu-item "Next MLink Link" 'mlinks-forward-link :enable '(and (boundp 'mlinks-mode) mlinks-mode) :help "Go to next MLinks link")) (define-key link-map [mlinks-prev-link] (list 'menu-item "Previous MLink Link" 'mlinks-backward-link :enable '(and (boundp 'mlinks-mode) mlinks-mode) :help "Go to previous MLinks link")) ) (define-key edit-map [nxhtml-edit-sep1] (list 'menu-item "--")) (define-key edit-map [nxhtml-grep-replace] (list 'menu-item "Replace in Grepped Files" 'grep-query-replace)) (define-key edit-map [nxhtml-rdir-replace] (list 'menu-item "Replace in Files in Tree" 'rdir-query-replace)) (define-key edit-map [nxhtml-ldir-replace] (list 'menu-item "Replace in Files in Directory" 'ldir-query-replace)) (define-key edit-map [nxhtml-edit-sep2] (list 'menu-item "--")) (define-key edit-map [nxhtml-multi-occur] (list 'menu-item "Occur in File Buffers" 'multi-occur-in-matching-buffers)) (define-key edit-map [nxhtml-occur] (list 'menu-item "Occur" 'occur)) (define-key edit-map [nxhtml-edit-sep3] (list 'menu-item "--")) (define-key edit-map [nxhtml-re-builder] (list 'menu-item "Re-Builder" 're-builder)) (define-key edit-map [nxhtml-edit-sep4] (list 'menu-item "--")) (let ((copy+paste-map (make-sparse-keymap "copy+paste"))) (define-key edit-map [nxhtml-copy+paste-map] (list 'menu-item "Copy+Paste" copy+paste-map)) (define-key copy+paste-map [nxhtml-copy+paste-do] (list 'menu-item "Do Copy+Paste" 'ourcomments-copy+paste :enable '(and (boundp 'ourcomments-copy+paste-mode) ourcomments-copy+paste-mode))) (define-key copy+paste-map [nxhtml-copy+paste-set] (list 'menu-item "Start Copy+Paste" 'ourcomments-copy+paste-set-point :button '(:toggle . (and (boundp 'ourcomments-copy+paste-mode) ourcomments-copy+paste-mode)))) ) (define-key edit-map [nxhtml-anchored-transpose] (list 'menu-item "Transpose Regions" 'anchored-transpose :button '(:toggle . (and mouse-secondary-overlay (overlay-buffer mouse-secondary-overlay))))) ) (define-key map [nxhtml-help-tools-separator] ;; Notice that removing nil below gives an error that is quite ;; hard to catch: ;; ;; Wrong type argument: arrayp, not (list 'menu-item "--" nil :visible `(not (derived-mode-p 'dired-mode)) )) (let ((upl-map (make-sparse-keymap "html-upl"))) (define-key map [nxhtml-upl-map] (list 'menu-item "File Transfer" upl-map ;;:enable '(featurep 'html-upl))) :enable '(fboundp 'html-upl-upload-file))) (define-key upl-map [nxhtml-upl-remote-dired] (list 'menu-item "Remote Dired" 'html-upl-remote-dired)) (define-key upl-map [nxhtml-upl-dired-sep] (list 'menu-item "--")) (define-key upl-map [nxhtml-upl-edit-remote-wtoc] (list 'menu-item "Edit Remote File With TOC" 'html-upl-edit-remote-file-with-toc :visible '(or (not (featurep 'html-site)) (nxhtml-this-file-can-have-toc)))) (define-key upl-map [nxhtml-upl-edit-remote] (list 'menu-item "Edit Remote File" 'html-upl-edit-remote-file)) (define-key upl-map [nxhtml-upl-ediff-file] (list 'menu-item "Ediff Remote/Local Files" 'html-upl-ediff-file)) (define-key upl-map [nxhtml-upl-sep] (list 'menu-item "--")) (define-key upl-map [nxhtml-upl-upload-site-with-toc] (list 'menu-item "Upload Site with TOC" 'html-upl-upload-site-with-toc :visible '(or (not (featurep 'html-site)) (and (html-site-current-merge-dir) (html-site-current-ensure-file-in-site file))))) (define-key upl-map [nxhtml-upl-upload-site] (list 'menu-item "Upload Site" 'html-upl-upload-site)) (define-key upl-map [nxhtml-upl-upload-file] (list 'menu-item "Upload Single File" 'html-upl-upload-file)) ) (let ((browse-map (make-sparse-keymap))) (define-key map [nxhtml-browse-map] (list 'menu-item "Browse" browse-map '(or buffer-file-name (eq major-mode 'nxhtml-mode)) :enable '(nxhtml-buffer-possibly-local-viewable))) (define-key browse-map [nxhtml-browse-region] (list 'menu-item "Browse the Region Only" 'nxhtml-browse-region :enable 'mark-active)) (define-key browse-map [nxhtml-upl-sep3] (list 'menu-item "--")) (define-key browse-map [nxhtml-upl-browse-remote-wtoc] (list 'menu-item "Browse Uploaded File With TOC" 'html-upl-browse-remote-with-toc :visible '(and (nxhtml-buffer-possibly-local-viewable) (featurep 'html-wtoc) (html-site-current-merge-dir) (html-site-current-ensure-file-in-site file) (nxhtml-buffer-possibly-remote-viewable) ))) (define-key browse-map [nxhtml-upl-browse-remote-frame-file] (list 'menu-item "Browse Uploaded Frames File" 'html-upl-browse-remote-frames :enable '(nxhtml-buffer-possibly-remote-viewable))) (define-key browse-map [nxhtml-upl-browse-remote] (list 'menu-item "Browse Uploaded File" 'html-upl-browse-remote :enable '(nxhtml-buffer-possibly-remote-viewable))) (define-key browse-map [nxhtml-upl-sep2] (list 'menu-item "--")) (define-key browse-map [nxhtml-browse-merged-file] (list 'menu-item "Browse File With TOC" 'html-wtoc-browse-page-with-toc :visible '(and (nxhtml-buffer-possibly-local-viewable) (featurep 'html-wtoc) (html-site-current-merge-dir) (html-site-current-ensure-file-in-site file) ))) (define-key browse-map [nxhtml-browse-frame-file] (list 'menu-item "Browse Frames File" 'html-toc-browse-frames-file :enable '(and (featurep 'html-toc) (nxhtml-buffer-possibly-local-viewable)))) (define-key browse-map [nxhtml-browse-file] (list 'menu-item "Browse File" 'nxhtml-browse-file :enable '(nxhtml-buffer-possibly-local-viewable))) ) (let ((site-map (make-sparse-keymap))) (define-key map [nxhtml-site-map] (list 'menu-item "Site" site-map)) (define-key site-map [html-site-global-mode] (list 'menu-item "HTML Site Global Mode" 'html-site-global-mode :button '(:toggle . (and (boundp 'html-site-global-mode) html-site-global-mode)))) (define-key site-map [nxhtml-site-separator] (list 'menu-item "--")) (define-key site-map [nxhtml-customize-site-list] (list 'menu-item "Edit Sites" (lambda () "Customize option `html-size-list'." (interactive) (customize-option-other-window 'html-site-list)))) (define-key site-map [nxhtml-set-site] (list 'menu-item "Set Current Site" 'html-site-set-site)) (define-key site-map [nxhtml-site-separator-1] (list 'menu-item "--")) (define-key site-map [nxhtml-dired-site-top] (list 'menu-item "Dired Site" 'html-site-dired-current)) (define-key site-map [nxhtml-find-site-file] (list 'menu-item "Find File in Site" 'html-site-find-file)) (define-key site-map [nxhtml-site-search-separator] (list 'menu-item "--" nil)) (define-key site-map [nxhtml-replace-in-site] (list 'menu-item "Replace in Site Files" 'html-site-query-replace)) (define-key site-map [nxhtml-rgrep-in-site] (list 'menu-item "Search Site Files" 'html-site-rgrep)) ) (define-key map [nxhtml-insert-separator] (list 'menu-item "--" nil :visible `(not (derived-mode-p 'dired-mode)) )) (let ((chunk-map (make-sparse-keymap))) (define-key map [nxhtml-chunk-map] (list 'menu-item "Multi Major Modes" chunk-map :visible `(not (derived-mode-p 'dired-mode)) )) (define-key chunk-map [nxhtml-customize-mumamo] (list 'menu-item "Customize MuMaMo" (lambda () (interactive) (customize-group-other-window 'mumamo)))) (define-key chunk-map [nxhtml-list-mumamo] (list 'menu-item "List defined Multi Major Modes" 'mumamo-list-defined-multi-major-modes)) (define-key chunk-map [nxhtml-chunks-separator2] (list 'menu-item "--" nil)) (define-key chunk-map [nxhtml-chunk-no-colors] (list 'menu-item "Remove Chunk Colors Temporarily" 'mumamo-no-chunk-coloring :button '(:toggle . (and (boundp 'mumamo-no-chunk-coloring) mumamo-no-chunk-coloring)))) (define-key chunk-map [nxhtml-chunk-margin-info] (list 'menu-item "Display Chunk Info in Margin" 'mumamo-margin-info-global-mode :button '(:toggle . (and (boundp 'mumamo-margin-info-global-mode) mumamo-margin-info-global-mode)))) (define-key chunk-map [nxhtml-chunks-separator1] (list 'menu-item "--" nil)) (let ((region-map (make-sparse-keymap))) (define-key chunk-map [nxhtml-region-map] (list 'menu-item "Temprary Region Chunks" region-map)) (define-key region-map [mumamo-clear-all-regions] (list 'menu-item "Clear Region Chunks" 'mumamo-clear-all-regions :enable '(and (boundp 'mumamo-multi-major-mode) mumamo-multi-major-mode (fboundp 'mumamo-clear-all-regions)))) (define-key region-map [mumamo-clear-region] (list 'menu-item "Clear Region Chunk at Point" 'mumamo-clear-region :enable '(fboundp 'mumamo-clear-region))) (define-key region-map [nxhtml-region-separator2] (list 'menu-item "--" nil)) (define-key region-map [mumamo-region-major] (list 'menu-item "Set Region Chunk Major Mode" 'mumamo-region-set-major :enable '(fboundp 'mumamo-region-set-major))) (define-key region-map [mumamo-add-region-from-string] (list 'menu-item "Add Region Chunk from String" 'mumamo-add-region-from-string)) (define-key region-map [mumamo-add-region] (list 'menu-item "Add Region Chunk from Selection" 'mumamo-add-region))) (define-key chunk-map [nxhtml-region-separator] (list 'menu-item "--" nil)) (define-key chunk-map [mumamo-mark-chunk] (list 'menu-item "Mark Chunk" 'mumamo-mark-chunk :enable '(and (boundp 'mumamo-multi-major-mode) mumamo-multi-major-mode))) (define-key chunk-map [nxhtml-separator-mark-chunk] (list 'menu-item "--")) (define-key chunk-map [mumamo-backward-chunk] (list 'menu-item "Backward Chunk" 'mumamo-backward-chunk :enable '(and (boundp 'mumamo-multi-major-mode) mumamo-multi-major-mode))) (define-key chunk-map [mumamo-forward-chunk] (list 'menu-item "Forward Chunk" 'mumamo-forward-chunk :enable '(and (boundp 'mumamo-multi-major-mode) mumamo-multi-major-mode)))) (let ((tag-map (make-sparse-keymap))) (define-key map [nxhtml-tag-map] (list 'menu-item "Move by Tag" tag-map :visible '(or (derived-mode-p 'nxml-mode) (derived-mode-p 'sgml-mode)) :enable '(or (derived-mode-p 'nxml-mode) (nxhtml-nxhtml-in-buffer)))) (define-key tag-map [nxml-forward-par] (list 'menu-item "Forward Paragraph" 'nxml-forward-paragraph)) (define-key tag-map [nxml-backward-par] (list 'menu-item "Backward Paragraph" 'nxml-backward-paragraph)) (define-key tag-map [nxml-insert-separator-move2] (list 'menu-item "--")) (define-key tag-map [nxml-down] (list 'menu-item "Forward Into Tag" 'nxml-down-element)) (define-key tag-map [nxml-backward-up] (list 'menu-item "Backward Out of Tag" 'nxml-backward-up-element)) (define-key tag-map [nxml-insert-separator-move] (list 'menu-item "--")) (define-key tag-map [nxml-forward] (list 'menu-item "Forward Balanced Tag" 'nxml-forward-element)) (define-key tag-map [nxml-backward] (list 'menu-item "Backward Balanced Tag" 'nxml-backward-element)) ) map)) (defvar nxhtml-menu-mode-map (let ((map (make-sparse-keymap))) (define-key map [(control ?c) ?? ?x] 'nxhtml-short-tag-help) (define-key map [(control ?c) ?? ?c] 'xhtml-help-show-css-ref) (define-key map [(control ?c) ?_] 'nxhtml-toggle-visible-warnings) (define-key map [menu-bar nxhtml-menu-mode] (list 'menu-item "nXhtml" nxhtml-menu-mode-menu-map)) map)) ;;;###autoload (define-minor-mode nxhtml-menu-mode "Minor mode to turn on some key and menu bindings. See `nxhtml-mode' for more information. This minor mode adds the entry 'nXhtml' to the menu bar. This submenu gives easy access to most of the important features of nXhtml. To see an \(incomplete) overview in html format do \\[nxhtml-overview]. * Note: Please observe that when loading nXhtml some file associations are done, see `nxhtml-setup-file-assoc'. Here are some important features: - multiple major modes, see `define-mumamo-multi-major-mode' - easy uploading and viewing of files, see for example `html-upl-upload-file' - validation in XHTML part for php etc, see `nxhtml-validation-header-mode' (you probably also want to know about `nxhtml-toggle-visible-warnings' for this!) - converting of html to xhtml, see `tidy-buffer' Some smaller, useful, but easy-to-miss features: * Following links. The href and src attribute names are underlined and a special keymap is bound to them:\\ \\[mlinks-backward-link], \\[mlinks-forward-link] Move between underlined href/src attributes \\[mlinks-goto], Mouse-1 Follow link inside Emacs (if possible) It is even a little bit quicker when the links are in an active state (marked with the face `isearch'):\\ \\[mlinks-backward-link], \\[mlinks-forward-link] Move between underlined href/src attributes \\[mlinks-goto], Mouse-1 Follow link inside Emacs (if possible) If the link is not into a file that you can edit (a mailto link for example) you will be prompted for an alternative action. * Creating links. To make it easier to create links to id/name attribute in different files there are two special functions:\\ \\[nxhtml-save-link-to-here] copy link to id/name (you must be in the tag to get the link) \\[nxhtml-paste-link-as-a-tag] paste this as an a-tag. This minor mode also adds some bindings: \\{nxhtml-menu-mode-map} --------- * Note: Some of the features supported are optional and available only if other Emacs modules are found. Use \\[nxhtml-features-check] to get a list of these optional features and modules needed. You should however have no problem with this if you have followed the installation instructions for nXhtml." :keymap nxhtml-menu-mode-map :group 'nxhtml :global t ) (defalias 'nxhtml-minor-mode 'nxhtml-menu-mode) (defalias 'nxhtml-global-minor-mode 'nxhtml-menu-mode) ;; (defcustom nxhtml-menu-mode-modes ;; '( ;; nxhtml-mode ;; nxml-mode ;; html-mode ;; sgml-mode ;; xml-mode ;; php-mode ;; css-mode ;; javascript-mode ;; java-mode ;; jsp ;; groovy-mode ;; gsp ;; image-mode ;; ;; ;; dired-mode ;; ) ;; "List for turning on `nxhtml-menu-mode'. ;; If the buffer's major modes is any of those in this list then ;; `nxhtml-global-minor-mode' will turn on `nxhtml-menu-mode' in ;; the buffer." ;; :type '(repeat (symbol :tag "Major mode")) ;; :group 'nxhtml) ;; (defun nxhtml-maybe-turn-on-minor-mode () ;; "Maybe turn on `nxhtml-menu-mode'. ;; See `nxhtml-menu-mode-modes'." ;; (nxhtml-menu-mode 1)) ;; (unless (or (minibufferp (current-buffer)) ;; (string= " " (substring (buffer-name) 0 1)) ;; (string= "*" (substring (buffer-name) 0 1)) ;; ) ;; (let ((on (and (boundp 'mumamo-multi-major-mode) ;; mumamo-multi-major-mode))) ;; (dolist (major nxhtml-menu-mode-modes) ;; (when (derived-mode-p major) ;; (setq on t))) ;; (when on ;; (nxhtml-menu-mode 1))))) ;; (define-globalized-minor-mode nxhtml-global-minor-mode ;; nxhtml-menu-mode ;; nxhtml-maybe-turn-on-minor-mode ;; ;;:require 'nxhtml-menu ;; :group 'nxhtml) ;;(message "nxhtml-menu:here A") ;;(custom-reevaluate-setting 'nxhtml-global-minor-mode) ;;(message "nxhtml-menu:here B") ;;(when nxhtml-global-minor-mode (nxhtml-global-minor-mode 1)) ;;(message "nxhtml-menu:here C") ;; (file-exists-p (nxhtml-docfile)) ;; (find-file (nxhtml-docfile)) (defun nxhtml-docfile () (expand-file-name "nxhtml/doc/nxhtml.html" nxhtml-install-dir)) (defun nxhtml-docfile-url () (let ((local-docfile (concat "file://" (nxhtml-docfile)))) (if (and nxhtml-autoload-web (not (file-exists-p local-docfile))) "http://ourcomments.org/Emacs/nXhtml/doc/nxhtml.html" local-docfile))) ;;;###autoload (defun nxhtml-overview () "Show a HTML page with an overview of nXhtml." (interactive) (browse-url (nxhtml-docfile-url))) (defun nxhtml-tutorials () "Show a HTML page with a list of tutorials for nXhtml'." (interactive) (browse-url "http://ourcomments.org/Emacs/nXhtml/tut/tutorials.html")) (defun nxhtml-custom-valfaced (value &optional bgcolor) (let ((v (if (sequencep value) (copy-seq value) value)) (bgcolor (if bgcolor bgcolor "RGB:FF/FF/AA"))) (put-text-property 0 (length v) 'face (list 'bold (cons 'background-color bgcolor) ) v) v)) (defun nxhtml-custom-insert-nxhtml-row (symbol nxhtml-value description) (let ((desc (if description (format "%s (%s)" description symbol) (format "%s" (custom-unlispify-tag-name symbol))))) (widget-insert " " description " (") (nxhtml-custom-describe-defun symbol) (widget-insert "): " (nxhtml-custom-valfaced (format "%s" (symbol-value symbol)) (if (eq (symbol-value symbol) nxhtml-value) "GreenYellow" "gainsboro")) "\n"))) (defun nxhtml-custom-h1(title &optional divider top-newline) (let ((s title)) (put-text-property 0 (length s) 'face '(:weight bold :height 1.4 :foreground "DarkGreen" ;;:underline t ) s) (when top-newline (widget-insert "\n")) ;;(when divider (widget-insert (nxhtml-custom-divider (length s)))) (widget-insert s) )) (defun widget-button-notify (widget &rest ignore) (apply (widget-get widget 'function) (widget-get widget 'data))) (defun widget-insert-link (txt function data) (widget-insert-button txt function data :button-face 'link :mouse-face 'highlight :button-prefix "" :button-suffix "")) (defun widget-insert-button (txt function data &rest keywords) (let ((btn (apply 'widget-create (append '(push-button :notify widget-button-notify) keywords (list txt))))) (widget-put btn 'data data) (widget-put btn 'function function))) (defun nxhtml-custom-url-link (txt url) (let ((plain-url (substring-no-properties url))) (unless (equal txt url) (put-text-property 0 (length txt) 'help-echo plain-url txt)) (put-text-property 0 (length txt) 'mouse-face 'highlight txt) (widget-insert-link txt 'browse-url (list url)))) (defun nxhtml-custom-describe-defun (sym &optional help) (let ((txt (symbol-name sym))) (when help (put-text-property 0 (length txt) 'help-echo help txt)) (put-text-property 0 (length txt) 'mouse-face 'highlight txt) (widget-insert-link txt 'describe-function (list sym)))) ;; (defun nxhtml-quick-customize (&optional same-window) ;; "Show page for Quick Customize of nXhtml." ;; (interactive) ;; (require 'nxhtml) ;; (require 'custom) ;; (require 'cus-edit) ;; (if same-window ;; (switch-to-buffer "*Quick Customize nXhtml*") ;; (switch-to-buffer-other-window "*Quick Customize nXhtml*")) ;; (kill-all-local-variables) ;; (custom-mode) ;; (let ((inhibit-read-only t)) ;; (erase-buffer)) ;; (let ((sFound "found") ;; (sError "error")) ;; (put-text-property 0 (length sFound) ;; 'face '(bold ;; (foreground-color . "green")) sFound) ;; (put-text-property 0 (length sError) ;; 'face '(bold ;; (foreground-color . "red")) sError) ;; (let* ( ;; (default-used "(not set yet - default used)") ;; ) ;; (nxhtml-custom-h1 "Quick Customize for nXhtml" t) ;; (widget-insert " ;; This page is for a quick and easy setup of some ") ;; (nxhtml-custom-url-link "nXhtml" (nxhtml-docfile-url)) ;; (widget-insert " features ;; that I did not want to turn on by default since they alter what ;; happens when you open a file. I suggest however that you turn ;; them on since they are quite useful if you just understands what ;; is happening. ;; The values you set here are saved so that they will be used next ;; time you start Emacs too.") ;; ;;(widget-insert-link "customize nXhtml" 'customize-group (list 'nxhtml)) ;; (widget-insert "\n\n") ;; (nxhtml-custom-insert-nxhtml-row 'nxhtml-global-minor-mode t "Show the nXhtml menu in all relevant buffers\n\t") ;; ;;(nxhtml-custom-insert-nxhtml-row 'mumamo-global-mode t "Turn on Multiple Major Mode in all relevant buffers\n\t") ;; ;;(nxhtml-custom-insert-nxhtml-row 'mlinks-global-mode t "Make link of lins, for example href=\"...\"\n\t") ;; ;;(nxhtml-custom-insert-nxhtml-row 'indent-region-mode t "Use TAB to indent region when it is selected\n\t") ;; (widget-insert "\n") ;; (widget-insert-button " Turn them all on " ;; (lambda () ;; (nxhtml-quick-all t) ;; (nxhtml-quick-customize t)) ;; nil) ;; (widget-insert " ") ;; (widget-insert-button " Turn them all off " ;; (lambda () ;; (nxhtml-quick-all nil) ;; (nxhtml-quick-customize t)) ;; nil) ;; (beginning-of-line) ;; ))) ;; (defun nxhtml-quick-all (on) ;; (custom-set-and-prepare-save 'nxhtml-global-minor-mode on) ;; ;;(custom-set-and-prepare-save 'mumamo-global-mode on) ;; (custom-set-and-prepare-save 'indent-region-mode on) ;; (when custom-file ;; (custom-save-all))) (defun custom-set-and-prepare-save (symbol value) "Set SYMBOL to VALUE and add to customize. Both the current value and the value to save is set, but `custom-save-all' must be called to save customization." (customize-set-variable symbol value) (customize-set-value symbol value) (customize-mark-to-save symbol)) ;;(nxhtml-quick-customize) (defun nxhtml-welcome () "Show welcome information." (interactive) (require 'cus-edit) (let* ((bufnam "*nXhtml Welcome*") (oldbuf (get-buffer bufnam)) (curwin (selected-window))) (switch-to-buffer-other-window bufnam) (unless oldbuf (let ((inhibit-read-only t) (here (point))) (Custom-mode) (nxhtml-menu-mode 1) (setq cursor-in-non-selected-windows nil) (nxhtml-custom-h1 "Welcome to nXhtml - a package for web editing" t) (insert "\n\n") (setq here (point)) (insert "If you have not done it already it might " "be a good time to read at least The Quick Guide in the ") (nxhtml-custom-url-link "nXhtml overview" (nxhtml-docfile-url)) (insert " now.\n\n") (fill-region here (point)) (setq here (point)) (insert "And oh, wait! If you are new to Emacs too you might want " "to take a quick ") (nxhtml-custom-url-link "Emacs tour" "http://www.gnu.org/software/emacs/tour/") (insert ". And then perhaps the Emacs tutorial " "(which is in the Help menu above).\n\n") (fill-region here (point)) (setq here (point)) (unless (nxhtml-skip-welcome) (insert "Click to ") (widget-insert-link "remove this message" (lambda () "Customize `nxhtml-skip-welcome'." (customize-option 'nxhtml-skip-welcome)) nil) (insert " at startup. (This page is still " "available in the nXhtml menu, at the bottom.)")) (fill-region here (point)) (setq here (point)) (goto-char (point-min)))) (select-window curwin))) (defcustom nxhtml-skip-welcome nil "Turn this on to always skip the nXhtml welcome message." :type 'boolean :group 'nxhtml) (defun nxhtml-skip-welcome () "Return t if nXhtml welcome message should be skipped. If nil then the message will be shown when you open the first file using nxhtml-mode." (or nxhtml-skip-welcome (and nxhtml-menu-mode ;;mumamo-global-mode ;;indent-region-mode ))) (defun nxhtml-say-welcome-unless-skip () (condition-case err (unless (nxhtml-skip-welcome) (save-match-data (nxhtml-welcome))) (error (message "ERROR nxhtml-say-welcome-unless-skip: %s" err)))) ;; Show welcome screen once after loading nxhtml: ;;(unless (boundp 'bytecomp-filename) (eval-when '(load) (eval-after-load 'nxhtml ;; Use a short delay if something like desktop is used: '(run-with-idle-timer 0.5 nil 'nxhtml-say-welcome-unless-skip))) (provide 'nxhtml-menu) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; nxhtml-menu.el ends here