summaryrefslogtreecommitdiff
path: root/misc/desktop-entry-mode.el
diff options
context:
space:
mode:
Diffstat (limited to 'misc/desktop-entry-mode.el')
-rw-r--r--misc/desktop-entry-mode.el233
1 files changed, 233 insertions, 0 deletions
diff --git a/misc/desktop-entry-mode.el b/misc/desktop-entry-mode.el
new file mode 100644
index 0000000..4a44cdd
--- /dev/null
+++ b/misc/desktop-entry-mode.el
@@ -0,0 +1,233 @@
+;;; desktop-entry-mode.el --- freedesktop.org desktop entry editing
+
+;; Copyright (C) 2003-2004, 2006-2007 Ville Skyttä, <scop at xemacs.org>
+
+;; Author: Ville Skyttä, <scop at xemacs.org>
+;; 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 <http://www.xemacs.org/Documentation/packageGuide.html>.
+;;
+;; 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
+;; <http://www.freedesktop.org/Standards/desktop-entry-spec>
+;;
+;; 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
+ "\\(\\<Type\\s-*=\\s-*MimeType\\>\\|"
+ (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 <http://www.freedesktop.org/Standards/desktop-entry-spec> 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