1;;; score-mode.el --- mode for editing Gnus score files 2 3;; Copyright (C) 1996, 2001, 2002, 2003, 2004, 4;; 2005, 2006, 2007 Free Software Foundation, Inc. 5 6;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org> 7;; Keywords: news, mail 8 9;; This file is part of GNU Emacs. 10 11;; GNU Emacs is free software; you can redistribute it and/or modify 12;; it under the terms of the GNU General Public License as published by 13;; the Free Software Foundation; either version 2, or (at your option) 14;; any later version. 15 16;; GNU Emacs is distributed in the hope that it will be useful, 17;; but WITHOUT ANY WARRANTY; without even the implied warranty of 18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19;; GNU General Public License for more details. 20 21;; You should have received a copy of the GNU General Public License 22;; along with GNU Emacs; see the file COPYING. If not, write to the 23;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 24;; Boston, MA 02110-1301, USA. 25 26;;; Commentary: 27 28;;; Code: 29 30(eval-when-compile (require 'cl)) 31(require 'mm-util) ; for mm-universal-coding-system 32(require 'gnus-util) ; for gnus-pp, gnus-run-mode-hooks 33 34(defvar gnus-score-mode-hook nil 35 "*Hook run in score mode buffers.") 36 37(defvar gnus-score-menu-hook nil 38 "*Hook run after creating the score mode menu.") 39 40(defvar gnus-score-edit-exit-function nil 41 "Function run on exit from the score buffer.") 42 43(defvar gnus-score-mode-map nil) 44(unless gnus-score-mode-map 45 (setq gnus-score-mode-map (make-sparse-keymap)) 46 (set-keymap-parent gnus-score-mode-map emacs-lisp-mode-map) 47 (define-key gnus-score-mode-map "\C-c\C-c" 'gnus-score-edit-exit) 48 (define-key gnus-score-mode-map "\C-c\C-d" 'gnus-score-edit-insert-date) 49 (define-key gnus-score-mode-map "\C-c\C-p" 'gnus-score-pretty-print)) 50 51(defvar score-mode-syntax-table 52 (let ((table (copy-syntax-table lisp-mode-syntax-table))) 53 (modify-syntax-entry ?| "w" table) 54 table) 55 "Syntax table used in score-mode buffers.") 56 57;; We need this to cope with non-ASCII scoring. 58(defvar score-mode-coding-system mm-universal-coding-system) 59 60;;;###autoload 61(defun gnus-score-mode () 62 "Mode for editing Gnus score files. 63This mode is an extended emacs-lisp mode. 64 65\\{gnus-score-mode-map}" 66 (interactive) 67 (kill-all-local-variables) 68 (use-local-map gnus-score-mode-map) 69 (gnus-score-make-menu-bar) 70 (set-syntax-table score-mode-syntax-table) 71 (setq major-mode 'gnus-score-mode) 72 (setq mode-name "Score") 73 (lisp-mode-variables nil) 74 (make-local-variable 'gnus-score-edit-exit-function) 75 (gnus-run-mode-hooks 'emacs-lisp-mode-hook 'gnus-score-mode-hook)) 76 77(defun gnus-score-make-menu-bar () 78 (unless (boundp 'gnus-score-menu) 79 (easy-menu-define 80 gnus-score-menu gnus-score-mode-map "" 81 '("Score" 82 ["Exit" gnus-score-edit-exit t] 83 ["Insert date" gnus-score-edit-insert-date t] 84 ["Format" gnus-score-pretty-print t])) 85 (run-hooks 'gnus-score-menu-hook))) 86 87(defun gnus-score-edit-insert-date () 88 "Insert date in numerical format." 89 (interactive) 90 (princ (time-to-days (current-time)) (current-buffer))) 91 92(defun gnus-score-pretty-print () 93 "Format the current score file." 94 (interactive) 95 (goto-char (point-min)) 96 (let ((form (read (current-buffer)))) 97 (erase-buffer) 98 (let ((emacs-lisp-mode-syntax-table score-mode-syntax-table)) 99 (gnus-pp form))) 100 (goto-char (point-min))) 101 102(defun gnus-score-edit-exit () 103 "Stop editing the score file." 104 (interactive) 105 (unless (file-exists-p (file-name-directory (buffer-file-name))) 106 (make-directory (file-name-directory (buffer-file-name)) t)) 107 (let ((coding-system-for-write score-mode-coding-system)) 108 (save-buffer)) 109 (bury-buffer (current-buffer)) 110 (let ((buf (current-buffer))) 111 (when gnus-score-edit-exit-function 112 (funcall gnus-score-edit-exit-function)) 113 (when (eq buf (current-buffer)) 114 (switch-to-buffer (other-buffer (current-buffer)))))) 115 116(provide 'score-mode) 117 118;;; arch-tag: a74a416b-2505-4ad4-bc4e-a418c96b8845 119;;; score-mode.el ends here 120