Path: utzoo!attcan!utgpu!jarvis.csri.toronto.edu!mailrus!wasatch!helios.ee.lbl.gov!pasteur!ames!apple!bbn!gateway!dsys.ncsl.nist.GOV!rbj From: rbj@dsys.ncsl.nist.GOV (Root Boy Jim) Newsgroups: comp.emacs Subject: gnu emacs lisp question Message-ID: <8907271852.AA18438@dsys.ncsl.nist.gov> Date: 27 Jul 89 18:52:19 GMT Sender: news@bbn.COM Organization: National Institute of Standards and Technology formerly National Bureau of Standards Lines: 83 ? From: Jimmy Aitken ? This is my first attempt at a lisp routine for GNU emacs so excuse the ? sloppyness/incorrectness. What I'm trying to do is toggle certain ? vlaaues of variables/states in GNU emacs so that they can be changed ? via a single keystroke rather than setting the variable manually. I ? wrote the function by looking at the code for other lisp functions in ? the lisp directory of GNU. Things seem to work OK for the readonly ? funtion, but for the clt-arrow, wrap, and mode changes the effect of ? changing the variable doesn't appear until I redraw the screen. Can ? anybody explain why and, more importantly, how to fix it? Also if Yeah. If you need to redraw the screen, do so in your lisp code. ? there are any style improvements I'll gladly accept criticism. Consider these gentle criticisms of style. ? many thanks, ? Jimmy ? Here's the code: ? (defun toggle () ? "Toggle the values of certain variables." ? (interactive) ? (message ? "toggle: srwct (control^ searchanycase readonly textmode wrap)") ? (let ((char (read-char))) The (let), (message), and (read-char) can be done inside (interactive): (defun toggle (what) "Toggle ..." (interactive "cToggle: ") This has the advantage of allowing your function to be called as (toggle ?c) from other elisp code. BTW, toggle is too generic a name ? (if (char-equal char (string-to-char "c")) Characters are denoted as a `?' followed by the character desired. Thus, (if (char-equal char ?c) ...) ?\C-x is C-x, ?\M-x is M-x, ?\M-C-x is M-C-X, ?\n is \n, ?\e is ESC In elisp, characters are numbers, and numbers can be compared with (eq) as well as (=). But if you prefer (char-equal), that's fine, as it will be more portable and you're saying what you mean. This sequence of (if)'s should really be coded as a cond. A cond is a good way to implement a case statement, which is what you are doing. The format is (cond C language equivalent ((c1) (e1)) if (c1) { e1; } else ((c2) (e2)) if (c2) { e2; } else .... ... (t (en)) { en; } ) ? (set 'ctl-arrow (not ctl-arrow))) Why don't you use setq instead of set? Perhaps it makes a difference if a variable is a local one? ? (if (char-equal char (string-to-char "r")) ? (toggle-read-only)) ? (if (char-equal char (string-to-char "s")) ? (setq case-fold-search (not case-fold-search))) ? (if (char-equal char (string-to-char "t")) ? (if (eq major-mode 'fundamental-mode) ? (text-mode) ? (fundamental-mode))) ? (if (char-equal char (string-to-char "w")) ? (setq truncate-lines (not truncate-lines))) ? )) ? -- ? -m------- Jimmy Aitken Phone : +44 252 373035 ? ---mmm----- Pyramid Technology Ltd PSS : 234248300152 ? -----mmmmm--- Concept 2000, Farnboro' Rd. Telex : 859056 ? -------mmmmmmm- Farnboro', Hants GU14 7NA ...!mcvax!ukc!pyrltd!jimmy Root Boy Jim Have GNU, Will Travel.