diff lisp/dired/dired-xemacs-highlight.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children 0293115a14e9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/dired/dired-xemacs-highlight.el	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,206 @@
+;;; Copyright (C) 1993 Cengiz Alaettinoglu
+;;; Cengiz Alaettinoglu <ca@cs.umd.edu>
+
+;;; Copyright (C) 1991 Tim Wilson and Sebastian Kremer
+;;; Tim.Wilson@cl.cam.ac.uk
+;;; Sebastian Kremer <sk@thp.uni-koeln.de>
+;;; Modified to work with XEmacs
+
+;; Keywords: dired extensions, faces
+
+;; 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, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+;;; Synched up with: Not synched with FSF.
+
+
+; How to install
+; (add-hook 'dired-load-hook '(lambda () (require 'dired-xemacs-highlight)) t)
+
+(require 'dired)
+(require 'dired-extra "dired-x")
+(provide 'dired-xemacs-highlight)
+
+(or (find-face 'dired-face-marked)
+    (and
+     (make-face 'dired-face-marked)
+     (or (face-differs-from-default-p 'dired-face-marked)
+	 (if (eq (device-class) 'color)
+	     (progn
+	       (set-face-foreground 'dired-face-marked (face-foreground 'default))
+	       (set-face-background 'dired-face-marked "PaleVioletRed"))
+	   (set-face-underline-p 'dired-face-marked t)))))
+
+(or (find-face 'dired-face-deleted)
+    (and
+     (make-face 'dired-face-deleted)
+     (or (face-differs-from-default-p 'dired-face-deleted)
+	 (if (eq (device-class) 'color)
+	     (progn
+	       (set-face-foreground 'dired-face-deleted
+				    (face-foreground 'default))
+	       (set-face-background 'dired-face-deleted "LightSlateGray"))
+	   (set-face-underline-p 'dired-face-deleted t)))))
+
+(or (find-face 'dired-face-directory)
+    (and
+     (make-face 'dired-face-directory)
+     (or (face-differs-from-default-p 'dired-face-directory)
+	 (if (eq (device-class) 'color)
+	     (progn 
+	       (set-face-foreground 'dired-face-directory
+				    (face-foreground 'default))
+	       (make-face-bold 'dired-face-directory))
+	   (make-face-bold-italic 'dired-face-directory)))))
+
+(or (find-face 'dired-face-executable)
+    (and
+     (make-face 'dired-face-executable)
+     (or (face-differs-from-default-p 'dired-face-executable)
+	 (if (eq (device-class) 'color)
+	     (set-face-foreground 'dired-face-executable "SeaGreen")
+	   (make-face-bold 'dired-face-executable)))))
+
+(or (find-face 'dired-face-setuid)
+    (and
+     (make-face 'dired-face-setuid)
+     (or (face-differs-from-default-p 'dired-face-setuid)
+	 (if (eq (device-class) 'color)
+	     (set-face-foreground 'dired-face-setuid "Red")
+	   (make-face-bold 'dired-face-setuid)))))
+
+(or (find-face 'dired-face-socket)
+    (and
+     (make-face 'dired-face-socket)
+     (or (face-differs-from-default-p 'dired-face-socket)
+	 (if (eq (device-class) 'color)
+	     (set-face-foreground 'dired-face-socket "Gold")
+	   (make-face-italic 'dired-face-socket)))))
+
+(or (find-face 'dired-face-symlink)
+    (and
+     (make-face 'dired-face-symlink)
+     (or (face-differs-from-default-p 'dired-face-symlink)
+	 (if (eq (device-class) 'color)
+	     (progn 
+	       (set-face-foreground 'dired-face-symlink "MediumBlue")
+	       (make-face-bold 'dired-face-symlink))
+	   (make-face-italic 'dired-face-symlink)))))
+
+(or (find-face 'dired-face-boring)
+    (and
+     (make-face 'dired-face-boring)
+     (or (face-differs-from-default-p 'dired-face-boring)
+	 (if (eq (device-class) 'color)
+	     (set-face-foreground 'dired-face-boring "Grey")
+	   (set-face-background-pixmap
+	    'dired-face-boring 
+	    [32 2 "\125\125\125\125\252\252\252\252"])))))
+
+(defvar dired-do-permission-highlighting-too nil
+  "Set if we think we should use dired-chmod style permission highlighting.
+This is determined at first-pass time, to avoid filtering the buffer twice.")
+
+(defvar dired-x11-re-boring (if (fboundp 'dired-omit-regexp)
+				(dired-omit-regexp)
+			      "^#\\|~$")
+  "Regexp to match backup, autosave and otherwise boring files.
+Those files are displayed in a boring color such as grey (see
+variable `dired-x11-boring-color').")
+
+(defvar dired-re-socket
+  (concat dired-re-maybe-mark dired-re-inode-size "s"))
+
+(defvar dired-re-setuid 
+  (concat dired-re-maybe-mark dired-re-inode-size
+	  "-[-r][-w][Ss][-r][-w][sx][-r][-w][xst]")
+  "setuid plain file (even if not executable)")
+
+(defvar dired-re-setgid 
+  (concat dired-re-maybe-mark dired-re-inode-size
+	  "-[-r][-w][-x][-r][-w][Ss][-r][-w][xst]")
+  "setgid plain file (even if not executable)")
+
+(defun dired-xemacs-highlight-one (face)
+  (and (dired-move-to-filename t)
+       (set-extent-face (make-extent (dired-move-to-filename) 
+				     (dired-move-to-end-of-filename)) 
+			face)))
+
+(defun dired-xemacs-highlight ()
+  (message "Highlighting... directory")
+  ;; Let's try to do this in one pass...
+  (setq dired-do-permission-highlighting-too
+	(or dired-do-permission-highlighting-too (featurep 'dired-chmod)))
+  (if (and dired-do-permission-highlighting-too
+	   (member 'dired-permissions-highlight dired-after-readin-hook))
+      (remove-hook 'dired-after-readin-hook 'dired-permissions-highlight))
+  (save-excursion
+    (goto-char (point-min))
+    (while (not (eobp))
+      (and (not (eolp))
+	   (progn
+	     (beginning-of-line)
+	     (cond
+	      ((re-search-forward
+		dired-x11-re-boring
+		(save-excursion
+		  (end-of-line)
+		  (point))
+		t)
+	       (dired-xemacs-highlight-one 'dired-face-boring))
+	      ((looking-at dired-re-dir)
+	       (dired-xemacs-highlight-one 'dired-face-directory))
+	      ((looking-at dired-re-sym)
+	       (dired-xemacs-highlight-one 'dired-face-symlink))
+	      ((or (looking-at dired-re-setuid)
+		   (looking-at dired-re-setgid))
+	       (dired-xemacs-highlight-one 'dired-face-setuid))
+	      ((looking-at dired-re-exe)
+	       (dired-xemacs-highlight-one 'dired-face-executable))
+	      ((looking-at dired-re-socket)
+	       (dired-xemacs-highlight-one 'dired-face-socket)))
+	     (if dired-do-permission-highlighting-too
+		 (dired-make-permissions-interactive))))
+      (forward-line 1))
+    (message "Highlighting...done")
+    ))
+
+;FSF's version?
+;(defconst dired-font-lock-keywords
+;  (list (cons "^\\*.*$" 'dired-face-marked)
+;	(cons "^\\D.*$" 'dired-face-deleted)))
+
+(defconst dired-font-lock-keywords (purecopy
+  (let ((bn (concat "\\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|"
+		    "Aug\\|Sep\\|Oct\\|Nov\\|Dec\\) +[0-9]+ +[0-9:]+")))
+    (list
+     '("^  [/~].*:$" . bold-italic)				   ; Header
+     (list (concat "^\\(\\([^ ].*\\)" bn "\\) \\(.*\\)$") 1 'bold) ; Marked
+     (list (concat "^. +d.*" bn " \\(.*\\)$") 2 'bold)		   ; Subdirs
+     (list (concat "^. +l.*" bn " \\(.*\\)$") 2 'italic)	   ; Links
+     (cons (concat "^. +-..[xsS]......\\|"	; Regular files with executable
+		   "^. +-.....[xsS]...\\|"	; or setuid/setgid bits set
+		   "^. +-........[xsS]")
+	   'bold)
+     ;; Possibly we should highlight more types of files differently:
+     ;; backups; autosaves; core files?  Those with ignored-extensions?
+     )))
+  "Expressions to highlight in Dired buffers.")
+
+(put 'dired-mode 'font-lock-keywords 'dired-font-lock-keywords)
+
+(add-hook 'dired-after-readin-hook 'dired-xemacs-highlight)