;;; desktop-entry-mode.el --- freedesktop.org desktop entry editing ;; Copyright (C) 2003-2004, 2006-2007 Ville Skyttä, ;; Author: Ville Skyttä, ;; Keywords: unix, desktop entry ;; This file is part of XEmacs. ;; XEmacs 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. ;; XEmacs 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 XEmacs; see the file COPYING. If not, write to the Free ;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, ;; MA 02110-1301 USA. ;;; Commentary: ;; This mode provides basic functionality, eg. syntax highlighting and ;; validation for freedesktop.org desktop entry files. ;; ;; To install it: ;; ;; In XEmacs: ;; Just install the XEmacs `text-modes' package, this mode is included. ;; See . ;; ;; In GNU Emacs: ;; Place this file in your load path somewhere (eg. site-lisp), and add ;; the following to your .emacs: ;; ;; (autoload 'desktop-entry-mode "desktop-entry-mode" "Desktop Entry mode" t) ;; (add-to-list 'auto-mode-alist ;; '("\\.desktop\\(\\.in\\)?$" . desktop-entry-mode)) ;; (add-hook 'desktop-entry-mode-hook 'turn-on-font-lock) ;; ;; For more information about desktop entry files, see ;; ;; ;; This version is up to date with version 1.0 of the specification. ;;; Code: (eval-when-compile (require 'regexp-opt)) (defconst desktop-entry-mode-version "1.0 (spec 1.0)" "Version of `desktop-entry-mode'.") (defgroup desktop-entry nil "Support for editing freedesktop.org desktop entry files." :group 'languages) (defcustom desktop-entry-validate-command "desktop-file-validate" "*Command for validating desktop entry files." :type 'string :group 'desktop-entry) (defgroup desktop-entry-faces nil "Font lock faces for `desktop-entry-mode'." :prefix "desktop-entry-" :group 'desktop-entry :group 'faces) (defface desktop-entry-group-header-face '((((class color) (background light)) (:foreground "mediumblue" :bold t)) (((class color) (background dark)) (:foreground "lightblue" :bold t)) (t (:bold t))) "*Face for highlighting desktop entry group headers." :group 'desktop-entry-faces) (defface desktop-entry-deprecated-keyword-face '((((class color)) (:background "yellow" :foreground "black" :strikethru t)) ) "*Face for highlighting deprecated desktop entry keys." :group 'desktop-entry-faces) (defface desktop-entry-unknown-keyword-face '((((class color)) (:foreground "red3" :underline t)) (t (:underline t)) ) "*Face for highlighting unknown desktop entry keys." :group 'desktop-entry-faces) (defface desktop-entry-value-face '((((class color) (background light)) (:foreground "darkgreen")) (((class color) (background dark)) (:foreground "lightgreen")) ) "*Face for highlighting desktop entry values." :group 'desktop-entry-faces) (defface desktop-entry-locale-face '((((class color) (background light)) (:foreground "dimgray")) (((class color) (background dark)) (:foreground "lightgray")) ) "*Face for highlighting desktop entry locales." :group 'desktop-entry-faces) (defconst desktop-entry-keywords (eval-when-compile (concat "\\(?:" (regexp-opt '( "Type" "Version" "Name" "GenericName" "NoDisplay" "Comment" "Icon" "Hidden" "OnlyShowIn" "NotShowIn" "TryExec" "Exec" "Path" "Terminal" "MimeType" "Categories" "StartupNotify" "StartupWMClass" "URL" ;; Reserved for use with KDE "ServiceTypes" "DocPath" "KeyWords" "InitialPreference" ;; Used by KDE for entries of the FSDevice type "Dev" "FSType" "MountPoint" "ReadOnly" "UnmountIcon" ) 'words) "\\|X-[A-Za-z0-9-]+\\)")) "Expression for matching desktop entry keys.") (defconst desktop-entry-deprecated-keywords (eval-when-compile (concat "\\(\\\\|" (regexp-opt '( "Patterns" "DefaultApp" "Encoding" "MiniIcon" "TerminalOptions" "Protocols" "Extensions" "BinaryPattern" "MapNotify" "SwallowTitle" "SwallowExec" "SortOrder" "FilePattern" ) 'words) "\\)")) "Expression for matching deprecated desktop entry keys.") (defconst desktop-entry-group-header-re "^\\[\\(X-[^\][]+\\|\\(?:Desktop \\(?:Entry\\|Action [a-zA-Z-]+\\)\\)\\)\\]" "Regular expression for matching desktop entry group headers.") (defconst desktop-entry-font-lock-keywords (list (cons "^\\s-*#.*$" '(0 'font-lock-comment-face)) (cons (concat "^" desktop-entry-deprecated-keywords) '(0 'desktop-entry-deprecated-keyword-face)) (cons (concat "^" desktop-entry-keywords) '(0 'font-lock-keyword-face)) (cons "^[A-Za-z0-9-]+" '(0 'desktop-entry-unknown-keyword-face)) (cons desktop-entry-group-header-re '(1 'desktop-entry-group-header-face)) (cons "^[A-Za-z0-9-]+?\\s-*=\\s-*\\(.*\\)" '(1 'desktop-entry-value-face)) (cons "^[A-Za-z0-9-]+?\\[\\([^\]]+\\)\\]\\s-*=\\s-*\\(.*\\)" '((1 'desktop-entry-locale-face) (2 'desktop-entry-value-face))) ) "Highlighting rules for `desktop-entry-mode' buffers.") (defvar desktop-entry-imenu-generic-expression `((nil ,desktop-entry-group-header-re 1)) "Imenu generic expression for `desktop-entry-mode'. See `imenu-generic-expression'.") ;;;###autoload (defun desktop-entry-mode () "Major mode for editing freedesktop.org desktop entry files. See for more information. See `desktop-entry-mode-version' for information about which version of the specification this mode is up to date with. Turning on desktop entry mode calls the value of the variable `desktop-entry-mode-hook' with no args, if that value is non-nil." (interactive) (set (make-local-variable 'imenu-generic-expression) '((nil "^\\s-*\\(.*\\)\\s-*=" 1))) (set (make-local-variable 'compile-command) (concat desktop-entry-validate-command " " buffer-file-name)) (set (make-local-variable 'compilation-buffer-name-function) (lambda (x) (concat "*desktop-file-validate " (file-name-nondirectory buffer-file-name) "*"))) (set (make-local-variable 'comment-start) "# ") (set (make-local-variable 'comment-end) "") (set (make-local-variable 'comment-start-skip) "#+ *") (setq major-mode 'desktop-entry-mode mode-name "Desktop Entry") (set (make-local-variable 'imenu-generic-expression) desktop-entry-imenu-generic-expression) (unless (featurep 'xemacs) ;; font-lock support for GNU Emacs (set (make-local-variable 'font-lock-defaults) '(desktop-entry-font-lock-keywords))) (run-hooks 'desktop-entry-mode-hook)) (defun desktop-entry-validate () "Validate desktop entry in the current buffer." (interactive) (require 'compile) (compile compile-command)) ;;;###autoload(add-to-list 'auto-mode-alist '("\\.desktop\\(\\.in\\)?$" . desktop-entry-mode)) (provide 'desktop-entry-mode) ;;; desktop-entry-mode.el ends here