1;;; options.el --- edit Options command for Emacs 2 3;; Copyright (C) 1985, 2001, 2002, 2003, 2004, 2005, 4;; 2006, 2007 Free Software Foundation, Inc. 5 6;; Maintainer: FSF 7 8;; This file is part of GNU Emacs. 9 10;; GNU Emacs is free software; you can redistribute it and/or modify 11;; it under the terms of the GNU General Public License as published by 12;; the Free Software Foundation; either version 2, or (at your option) 13;; any later version. 14 15;; GNU Emacs is distributed in the hope that it will be useful, 16;; but WITHOUT ANY WARRANTY; without even the implied warranty of 17;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18;; GNU General Public License for more details. 19 20;; You should have received a copy of the GNU General Public License 21;; along with GNU Emacs; see the file COPYING. If not, write to the 22;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 23;; Boston, MA 02110-1301, USA. 24 25;;; Commentary: 26 27;; This code provides functions to list and edit the values of all global 28;; option variables known to loaded Emacs Lisp code. There are two entry 29;; points, `list-options' and `edit' options'. The latter enters a major 30;; mode specifically for editing option values. Do `M-x describe-mode' in 31;; that context for more details. 32 33;; The customization buffer feature is intended to make this obsolete. 34 35;;; Code: 36 37;;;###autoload 38(defun list-options () 39 "Display a list of Emacs user options, with values and documentation. 40It is now better to use Customize instead." 41 (interactive) 42 (with-output-to-temp-buffer "*List Options*" 43 (let (vars) 44 (princ "This facility is obsolete; we recommend using M-x customize instead.") 45 46 (mapatoms (function (lambda (sym) 47 (if (user-variable-p sym) 48 (setq vars (cons sym vars)))))) 49 (setq vars (sort vars 'string-lessp)) 50 (while vars 51 (let ((sym (car vars))) 52 (when (boundp sym) 53 (princ ";; ") 54 (prin1 sym) 55 (princ ":\n\t") 56 (prin1 (symbol-value sym)) 57 (terpri) 58 (princ (substitute-command-keys 59 (documentation-property sym 'variable-documentation))) 60 (princ "\n;;\n")) 61 (setq vars (cdr vars)))) 62 (with-current-buffer "*List Options*" 63 (Edit-options-mode) 64 (setq buffer-read-only t))))) 65 66;;;###autoload 67(defun edit-options () 68 "Edit a list of Emacs user option values. 69Selects a buffer containing such a list, 70in which there are commands to set the option values. 71Type \\[describe-mode] in that buffer for a list of commands. 72 73The Custom feature is intended to make this obsolete." 74 (interactive) 75 (list-options) 76 (pop-to-buffer "*List Options*")) 77 78(defvar Edit-options-mode-map 79 (let ((map (make-keymap))) 80 (define-key map "s" 'Edit-options-set) 81 (define-key map "x" 'Edit-options-toggle) 82 (define-key map "1" 'Edit-options-t) 83 (define-key map "0" 'Edit-options-nil) 84 (define-key map "p" 'backward-paragraph) 85 (define-key map " " 'forward-paragraph) 86 (define-key map "n" 'forward-paragraph) 87 map) 88 "") 89 90;; Edit Options mode is suitable only for specially formatted data. 91(put 'Edit-options-mode 'mode-class 'special) 92 93(defun Edit-options-mode () 94 "\\<Edit-options-mode-map>\ 95Major mode for editing Emacs user option settings. 96Special commands are: 97\\[Edit-options-set] -- set variable point points at. New value read using minibuffer. 98\\[Edit-options-toggle] -- toggle variable, t -> nil, nil -> t. 99\\[Edit-options-t] -- set variable to t. 100\\[Edit-options-nil] -- set variable to nil. 101Changed values made by these commands take effect immediately. 102 103Each variable description is a paragraph. 104For convenience, the characters \\[backward-paragraph] and \\[forward-paragraph] move back and forward by paragraphs." 105 (kill-all-local-variables) 106 (set-syntax-table emacs-lisp-mode-syntax-table) 107 (use-local-map Edit-options-mode-map) 108 (make-local-variable 'paragraph-separate) 109 (setq paragraph-separate "[^\^@-\^?]") 110 (make-local-variable 'paragraph-start) 111 (setq paragraph-start "\t") 112 (setq truncate-lines t) 113 (setq major-mode 'Edit-options-mode) 114 (setq mode-name "Options") 115 (run-mode-hooks 'Edit-options-mode-hook)) 116 117(defun Edit-options-set () (interactive) 118 (Edit-options-modify 119 (lambda (var) (eval-minibuffer (concat "New " (symbol-name var) ": "))))) 120 121(defun Edit-options-toggle () (interactive) 122 (Edit-options-modify (lambda (var) (not (symbol-value var))))) 123 124(defun Edit-options-t () (interactive) 125 (Edit-options-modify (lambda (var) t))) 126 127(defun Edit-options-nil () (interactive) 128 (Edit-options-modify (lambda (var) nil))) 129 130(defun Edit-options-modify (modfun) 131 (save-excursion 132 (let ((buffer-read-only nil) var pos) 133 (re-search-backward "^;; \\|\\`") 134 (forward-char 3) 135 (setq pos (point)) 136 (save-restriction 137 (narrow-to-region pos (progn (end-of-line) (1- (point)))) 138 (goto-char pos) 139 (setq var (read (current-buffer)))) 140 (goto-char pos) 141 (forward-line 1) 142 (forward-char 1) 143 (save-excursion 144 (set var (funcall modfun var))) 145 (kill-sexp 1) 146 (prin1 (symbol-value var) (current-buffer))))) 147 148(provide 'options) 149 150;;; arch-tag: d18211a1-f3fb-48c9-a449-d5acde406a3c 151;;; options.el ends here 152