Commit 7dfc7774 authored by David Byers's avatar David Byers
Browse files

Massor av ändringar. Se ChangeLogen.

parent 694c37e2
Thu Oct 24 10:38:06 1996 David Byers <davby@sen2.ida.liu.se>
* english-strings.el,swedish-strings.el (lyskom-message): ndra
comment-to-by, by
(lyskom-sv-edit-mode-map): Lade till bindningar av musknappar.
* edit-text.el (lyskom-edit-insert-misc-conf): Stt properties p
mtesnumret. (lyskom-edit-insert-commented-author): Dito.
Tue Oct 22 02:47:55 1996 Niels Mller <nisse@lysator.liu.se>
* language.el: Tog bort lyskom-language-symbols.
Mon Oct 21 12:41:46 1996 David Byers <davby@sen2.ida.liu.se>
* utilities.el (lyskom-display-buffer): Lgg till en
kill-buffer-hoom ven om man gr display i samma fnster.
* english-strings.el (lyskom-button-actions): Lade till email som
action.
Mon Oct 21 00:54:00 1996 David Kgedal <davidk@lysator.liu.se>
* swedish-strings.el (lyskom-language-sv): Rensade bort
......@@ -74,6 +91,21 @@ Sun Oct 20 03:46:22 1996 David K
(lyskom-language-var-internal): Ny funktion.
(lyskom-language-vars): Ny variabel.
Thu Oct 17 16:28:54 1996 David Byers <davby@sen2.ida.liu.se>
* english-strings.el (lyskom-custom-strings): Lade in i
english-strings.el
(lyskom-customize-map): Dito.
Wed Oct 16 11:24:41 1996 David Byers <davby@sen2.ida.liu.se>
* async.el (lyskom-show-logged-out-person): Gjorde s att
kom-presence-messages kan vara en lista av vilka som skall visas.
(lyskom-show-logged-in-person): Dito.
(lyskom-show-changed-person): Dito.
(lyskom-show-presence): Ny funktion.
Tue Oct 15 03:30:31 1996 David Kgedal <davidk@lysator.liu.se>
* commands1.el (lyskom-do-go-to-conf): Tog bort specialhacket fr
......@@ -237,6 +269,13 @@ Wed Oct 9 15:59:06 1996 Niels M
* swedish-strings.el (menu): Lade till nya menynamn
Tue Oct 8 18:06:02 1996 David Byers <davby@sen2.ida.liu.se>
* lyskom-buttons.el (lyskom-default-button): Frsk stta
lyskom-button-text ven om argumentet inte anger det genom att
gra cache-get-* p personer och mten. Lev med att man kanske
inte alltid fr tag p texten.
Tue Oct 8 14:33:24 1996 Niels Mller <nisse@lysator.liu.se>
* vars.el.in (lyskom-inherited-variables): Lade till
......@@ -269,6 +308,18 @@ Tue Oct 8 14:33:24 1996 Niels M
swedish-strings.el
swedish-strings.el: Anpassad till lyskom-get-string
Tue Oct 8 04:44:29 1996 David Kgedal <davidk@lysator.liu.se>
* lyskom-rest.el: Anropa lyskom-build-menus p toppnivn.
* menus.el (lyskom-background-menu): Ny funktion.
Tue Oct 8 03:55:40 1996 David Kgedal <kg@infovav.se>
* lyskom-buttons.el (lyskom-make-button-menu): Ny funktion.
(lyskom-mouse-3): Anvnd en keymap som meny.
(lyskom-button-menu): Bytte namn frn lyskom-mouse-3.
Tue Oct 8 04:44:29 1996 David Kgedal <davidk@lysator.liu.se>
* lyskom-buttons.el (lyskom-make-button-menu): Kopiera listorna.
......@@ -277,6 +328,10 @@ Tue Oct 8 04:44:29 1996 David K
* menus.el (lyskom-background-menu): Ny funktion.
Tue Oct 8 02:10:10 1996 Niels Mller <nisse@lysator.liu.se>
* menus.el : Ny fil. Menyer i lyskom-mode.
Tue Oct 8 03:55:40 1996 David Kgedal <kg@infovav.se>
* lyskom-buttons.el (lyskom-make-button-menu): Ny funktion.
......@@ -287,6 +342,40 @@ Tue Oct 8 02:10:10 1996 Niels M
* menus.el : Ny fil. Menyer i lyskom-mode.
Mon Oct 7 12:10:01 1996 David Byers <davby@sen2.ida.liu.se>
* option-edit.el (lyskom-custom-variables): Lade till
kom-ding-on-new-letter.
(lyskom-customize-buffer-format): Dito.
* swedish-strings.el (lyskom-custom-strings): Lade till
kom-ding-on-new-letter.
* async.el (lyskom-async-new-text): Pip vid brev.
* vars.el.in (kom-ding-on-new-letter): Ny variabel.
(lyskom-elisp-variables): Lade till den.
* completing-read.el (lyskom-read-conf-internal): Bugfix. Hantera
TAB p namn som inte finns med vissa predikatkombinationer.
Sun Oct 6 16:28:13 1996 David Byers <davby@sen2.ida.liu.se>
* compatibility.el (compiled-function-p): Definiera
compiled-function-p, inte byte-code-function-p s klagar XEmacs
mindre.
* utilities.el (functionp): Anvnd compiled-function-p.
* lyskom-buttons.el (lyskom-button-transform-text): Hantera
email-urler ocks.
* swedish-strings.el (lyskom-strings): Lade till
email-popup-title.
* vars.el.in (lyskom-text-buttons): Lade till regexp fr
mail-adresser.
Sun Oct 6 10:11:25 1996 David Kgedal <kg@infovav.se>
* utilities.el (lyskom-setup-faces): Anvnd device-class istllet
......@@ -348,6 +437,41 @@ Sat Oct 5 19:23:13 1996 David K
* lyskom-rest.el (lyskom-trim-buffer): Stt inhibit-read-only.
Sat Oct 5 14:58:44 1996 David Byers <davby@sen2.ida.liu.se>
* utilities.el (lyskom-set-partial-window-configuration): Hantera
att fnster byter buffert p rtt stt.
* vars.el.in (lyskom-elisp-variables): Lade till
kom-customize-format.
* swedish-strings.el (lyskom-customize-map): Flyttade hit
variabeln.
(lyskom-custom-strings): Dito.
(lyskom-commands): Lade till kom-customize.
* prioritize.el (kom-prioritize): Anvnda
kom-dont-restore-window-after-prioritize
Thu Oct 3 09:49:37 1996 David Byers <davby@sen2.ida.liu.se>
* commands1.el (lyskom-who-is-on-9): Hantera prefixargumentet - p
Rtt Stt.
* commands2.el (kom-set-unread): Stt in strng med \n p slutet.
* startup.el (lyskom-clear-vars): Use lyskom-protect-environment.
(kom-start-anew): Set lyskom-current-conf to nil.
* compatibility.el: Flyttade kompatibilitetsfunktioner hit.
* utilities.el: Flyttade kompatiibilitetsfunktioner till
compatibility.el.
* macros.el: Dito
* vars.el.in (lyskom-prefetch-limit): Stt default till 10.
Thu Oct 3 01:30:03 1996 David Kgedal <davidk@lysator.liu.se>
* lyskom-rest.el (lyskom-binsearch-internal): Tro inte att tv
......@@ -375,6 +499,28 @@ Wed Oct 2 16:41:53 1996 David K
(lyskom-binsearch): Ny funktion.
(lyskom-binsearch-internal): Ny funktion.
Wed Oct 2 16:37:31 1996 David Byers <davby@sen2.ida.liu.se>
* parse.el (lyskom-parse-bitstring): Mikrooptimeringar i
parse-koden fr mindre consning och mindre bytekod.
(Mnga funktioner) Testa inte TAB och RET som whitespace.
Tue Oct 1 15:27:12 1996 David Byers <davby@sen2.ida.liu.se>
* utilities.el (lyskom-set-partial-window-configuration): Ny
funktion.
(lyskom-reset-window-configuration-hook): Anvnd den.
(buffer-live-p): Ny kompatibilitetsfunktion. Jag r trtt p Emacs
19.28.
Mon Sep 30 11:03:07 1996 David Byers <davby@sen2.ida.liu.se>
* swedish-strings.el,english-strings.el (lyskom-strings): Lade
till formatkod fr att f in tiden ocks.
* lyskom-rest.el (lyskom-sentinel): Lade till current-time-string
i argumentlistan vid onormalt stng session.
Mon Sep 30 01:25:23 1996 David Kgedal <kg@infovav.se>
* commands1.el (lyskom-quit): Ta bort rtt sak ur listorna.
......@@ -445,6 +591,12 @@ Fri Sep 27 01:47:13 1996 David K
* commands1.el (lyskom-add-membership): Anvnd prefetch fr att
hmta mappen istllet.
Thu Sep 26 10:19:11 1996 David Byers <davby@sen2.ida.liu.se>
* option-edit.el (lyskom-widget-kbd-macro-action): Stt buffert
via property istf hrdkodat namn.
(lyskom-kbd-macro-widget): Stt :macro-buffer propery p widgeten.
Thu Sep 26 00:08:32 1996 David Kgedal <davidk@lysator.liu.se>
* lyskom-rest.el (lyskom-end-of-command): Se till att de saker som
......
......@@ -56,9 +56,10 @@ PARTS-EL = komtypes.el clienttypes.el deferred-insert.el utilities.el \
prioritize.el flags.el messages.el ansaphone.el remote-control.el \
menus.el slow.el \
elib-string.el \
option-edit.el \
lyskom-rest.el
HEADER-EL = vars.el macros.el language.el
HEADER-ELC = vars.elc macros.elc deferred-insert.elc
HEADER-EL = vars.el macros.el compatibility.el language.el
HEADER-ELC = vars.elc macros.elc compatibility.elc language.elc
SWEDISH-EL = swedish-strings.el
SWEDISH-ELC = swedish-strings.elc
ENGLISH-EL = english-strings.el
......@@ -76,6 +77,7 @@ SRC-ELC = komtypes.elc clienttypes.elc deferred-insert.elc utilities.elc \
view-text.elc async.elc completing-read.elc \
prioritize.elc flags.elc messages.elc ansaphone.elc \
remote-control.elc menus.elc slow.elc elib-string.elc \
option-edit.elc \
lyskom-rest.elc
PARTS-ELC = $(SRC-ELC)
......@@ -97,7 +99,7 @@ lyskom.el: $(HEADER-EL) $(SWEDISH-EL) $(ENGLISH-EL) $(PARTS-EL)
cat $(HEADER-EL) $(SWEDISH-EL) $(ENGLISH-EL) $(PARTS-EL) > lyskom.el
lyskom.elc: lyskom.el
$(EMACS-BATCH) -f batch-byte-compile lyskom.el
$(EMACS-BATCH) -l ./lpath.el -f batch-byte-compile lyskom.el
.PHONY: check
check:
......
......@@ -3,21 +3,34 @@ Att g
-------- Buggar
prefix-kommandon änndras inte vid språkbyten.
Långsamma kommandon buggar, eftersom bufferten är skrivskyddad.
Långsamma kommandon buggar, eftersom bufferten är skrivskyddad.
prefix-kommandon änndras inte vid språkbyten.
Dubbla prefetcher kan vara väldigt förvirrande. Om man t.ex. gör
endast i ett möte (säg IÅM) innan det prefetchas får man två
parallella prefetcher på samma möte.
Dubbla prefetcher kan vara väldigt förvirrande. Om man t.ex. gör
endast i ett möte (säg IÅM) innan det prefetchas får man två
parallella prefetcher på samma möte.
I vilkalistan borde nog hemliga personer skrivas ut med någon
annan text än "Ej närvarande i något möte"
Gå med i möten startar inte prefetch på mötet.
Gå ur mötet man prefetchar genererar en bug.
kom-recover (antagligen lyskom-refetch) är en no-op.
Dubbla prefetcher kan vara väldigt förvirrande. Om man t.ex. gör
endast i ett möte (säg IÅM) innan det prefetchas får man två
parallella prefetcher på samma möte.
Om man går till ett möte som inte prefetchats och inte har några
inlägg blir promten fel, och man får ett felmeddelande.
Lista nyheter visar fel innan prefetchen har hämtat alla mappar.
Efter återse senaste fick jag fel prompt. Jag vill ha återse
nästa-prompten direkt om det finns texter som matchar villkoret.
Efter återse senaste fick jag fel prompt. Jag vill ha återse
nästa-prompten direkt om det finns texter som matchar villkoret.
lyskom-read-session-no hanterar inte att man anger specifikt
sessionsnummer om samma person har flera sessioner, tror jag.
......@@ -29,8 +42,6 @@ n
rekursiv. Man överskrider ibland max-specpdl-size eller något
sådant.
Bygga Ändra Variabler mha widget.el.
Fixa så LysKOM och complete.el fungerar ihop genom att sätta om
samma mappar som complete.el gör, till wrappers runt complete.el
som kollar om completion är LysKOM-completion eller något annat.
......@@ -171,3 +182,5 @@ n
vore det bra om bufferten scrollades upp så att man fick se dem...
[FIXAT]
Bygga Ändra Variabler mha widget.el. [FIXAT]
......@@ -137,8 +137,7 @@ this function shall be with current-buffer the BUFFER."
(set-buffer buffer)
(if (and lyskom-pers-no
(not (zerop lyskom-pers-no))
(/= pers-no lyskom-pers-no))
; Don't show myself.
(/= pers-no lyskom-pers-no)) ; Don't show myself.
(initiate-get-conf-stat 'follow
'lyskom-show-logged-in-person
pers-no))
......@@ -202,17 +201,29 @@ this function shall be with current-buffer the BUFFER."
(lyskom-skip-tokens tokens)))))
(defsubst lyskom-show-presence (num flag)
"Returns non-nil if presence messages for NUM should be displayed
according to the value of FLAG."
(cond ((null flag) nil)
((and (listp flag)
(memq num flag)) t)
((not (listp flag)) t)))
(defun lyskom-show-logged-in-person (conf-stat)
"Visa p} kommandoraden vem som loggat in."
(cond
((lyskom-is-in-minibuffer))
(kom-presence-messages
((lyskom-show-presence (conf-stat->conf-no conf-stat)
kom-presence-messages)
(lyskom-message
"%s"
(lyskom-format 'has-entered (or conf-stat
(lyskom-get-string 'secret-person))))))
(cond
(kom-presence-messages-in-buffer
((lyskom-show-presence (conf-stat->conf-no conf-stat)
kom-presence-messages-in-buffer)
(if conf-stat
(lyskom-format-insert-before-prompt 'has-entered-r conf-stat
(and kom-text-properties
......@@ -227,13 +238,15 @@ this function shall be with current-buffer the BUFFER."
"Visa p} kommandoraden vem som loggat ut."
(cond
((lyskom-is-in-minibuffer))
(kom-presence-messages
((lyskom-show-presence (conf-stat->conf-no conf-stat)
kom-presence-messages)
(lyskom-message
"%s"
(lyskom-format 'has-left (or conf-stat
(lyskom-get-string 'secret-person))))))
(cond
(kom-presence-messages-in-buffer
((lyskom-show-presence (conf-stat->conf-no conf-stat)
kom-presence-messages-in-buffer)
(if conf-stat
(lyskom-format-insert-before-prompt 'has-left-r conf-stat
(and kom-text-properties
......@@ -244,13 +257,14 @@ this function shall be with current-buffer the BUFFER."
'(face kom-presence-face)))))))
(defun lyskom-show-changed-person (personconfstat conf-num doing)
"Tells the user what another person is doing."
(if personconfstat ;+++ Annan felhantering
(progn
(cond
((lyskom-is-in-minibuffer))
((and kom-presence-messages
((and (lyskom-show-presence (conf-stat->conf-no personconfstat)
kom-presence-messages)
(or (= 0 conf-num)
(eq conf-num lyskom-current-conf))
(/= 0 (length doing)))
......@@ -261,7 +275,8 @@ this function shall be with current-buffer the BUFFER."
(substring doing 1))))
string))))
(cond
((and (eq kom-presence-messages-in-buffer t)
((and (lyskom-show-presence (conf-stat->conf-no personconfstat)
kom-presence-messages-in-buffer)
(or (= 0 conf-num)
(eq conf-num lyskom-current-conf))
(/= 0 (length doing)))
......@@ -429,7 +444,12 @@ converted, before insertion."
(eq type 'CC-RECPT))
;; add on lyskom-reading-list and lyskom-to-do-list if
;; this recipient is a recipient that has been checked.
(initiate-get-conf-stat 'async 'lyskom-add-new-text
(if (and (eq (misc-info->recipient-no misc-info)
lyskom-pers-no)
(not (eq (text-stat->author text-stat)
lyskom-pers-no)))
(lyskom-beep kom-ding-on-new-letter))
(initiate-get-conf-stat 'async 'lyskom-add-new-text
(misc-info->recipient-no misc-info)
(text-stat->text-no text-stat)
(misc-info->local-no misc-info)))
......
......@@ -1551,8 +1551,8 @@ Uses Protocol A version 9 calls"
(let* ((wants-invisibles (or (and (numberp arg) (< arg 0))
(and (symbolp arg) (eq '- arg))))
(idle-hide (if (numberp arg) (abs arg)
(cond ((numberp kom-idle-hide) kom-idle-hide)
((eq '- arg) 0)
(cond ((eq '- arg) 0)
((numberp kom-idle-hide) kom-idle-hide)
(kom-idle-hide 30)
(t 0))))
(who-info-list (blocking-do 'who-is-on-dynamic
......
......@@ -610,7 +610,9 @@ send. If DONTSHOW is non-nil, don't display the sent message."
(interactive "P")
(setq conf-no (or conf-no lyskom-current-conf))
(if (and (zerop lyskom-current-conf) (null conf-no))
(lyskom-insert-string 'not-present-anywhere)
(progn
(lyskom-insert-string 'not-present-anywhere)
(lyskom-insert-string "\n"))
(let ((conf-stat (blocking-do 'get-conf-stat conf-no)))
(if (null conf-stat) ;+++ annan errorhantering
(lyskom-insert "Error!\n") ;+++ Hrrrmmmmffff????
......
(setq byte-compile-compatibility t)
;;;;; -*- emacs-lisp -*-
;;;;; $Id$
;;;;; Copyright (C) 1996 Lysator Academic Computer Association.
;;;;;
;;;;; This file is part of the LysKOM server.
;;;;;
;;;;; LysKOM 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.
;;;;;
;;;;; LysKOM 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 LysKOM; see the file COPYING. If not, write to
;;;;; Lysator, c/o ISY, Linkoping University, S-581 83 Linkoping, SWEDEN,
;;;;; or the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
;;;;; MA 02139, USA.
;;;;;
;;;;; Please mail bug reports to bug-lyskom@lysator.liu.se.
;;;;;
;;;; ================================================================
;;;; ================================================================
;;;;
;;;; File: compatibility.el
;;;;
;;;; This file contains functions that may not exist in all supported
;;;; versions of Gnu Emacs. XEmacs-specific and Emacs 18-specific code
;;;; should go in some other file.
;;;;
(setq lyskom-clientversion-long
(concat lyskom-clientversion-long
"$Id$\n"))
;;; ======================================================================
;;; Use lyskom-provide to supply a definition that is only to be used
;;; if no definition already exists. The definition will be evaluated at
;;; both compile and run time.
;;;
;;; lyskom-provide-macros behaves like defmacro
;;; lyskom-provide-function behaves like defun
;;; lyskom-provide-subst behaves like defsubst
;;;
(eval-and-compile
(defvar lyskom-compatibility-definitions nil
"Functions defined or redefined because they are incompatible with
LysKOM"))
;;; ============================================================
;;; lyskom-compatibility-forms
;;; lyskom-compatibility-definition
;;;
(defmacro lyskom-compatibility-forms (predicate &rest forms)
"If PREDICATE is nil, evaluate FORMS at compile and run time"
(` (eval-and-compile
(if (not (, predicate))
(progn (,@ forms))))))
(defmacro lyskom-compatibility-definition (predicate definition)
"If PREDICATE is nil, evaluate DEFINITION at compile and run time.
Definition should be a function definition of some kind, with syntax
similar to defun or defmacro.
To simply define a function if it is not already defined, used one
of the lyskom-provide-* functions instead."
(` (progn (eval-when-compile
(if (not (, predicate))
(message "Compatibility %S for %S"
(quote (, (car definition)))
(quote (, (car (cdr definition))))))
(eval-and-compile
(if (not (, predicate))
(progn
(, definition)
(setq lyskom-compatibility-definitions
(cons (quote (, (car (cdr definition))))
lyskom-compatibility-definitions)))))))))
;;; ============================================================
;;; lyskom-provide
;;; lyskom-provide-macro
;;; lyskom-provide-function
;;; lyskom-provide-subst
;;;
;;; Define functions if they are not already defined
;;;
(defmacro lyskom-provide (definer name rest)
(` (progn (eval-when-compile
(if (not (fboundp (quote (, name))))
(message "Compatibility %S for %S"
(quote (, definer))
(quote (, name)))))
(eval-and-compile
(if (not (fboundp (quote (, name))))
(progn
(setq lyskom-compatibility-definitions
(cons (quote (, name))
lyskom-compatibility-definitions))
((, definer) (, name) (,@ rest))))))))
(defmacro lyskom-provide-macro (name &rest rest)
"If NAME is not already defined, define it as a macro."
(` (lyskom-provide defmacro (, name) (, rest))))
(defmacro lyskom-provide-function (name &rest rest)
"If NAME is not already defined, define it as a function."
(` (lyskom-provide defun (, name) (, rest))))
(defmacro lyskom-provide-subst (name &rest rest)
"If NAME is not already defined, define it as a defsubst."
(` (lyskom-provide defsubst (, name) (, rest))))
;;; ======================================================================
;;; ======================================================================
;;; ======================================================================
;;;
;;; Dummy definitions
;;;
(defun add-hook-org (x y z))
(defun remove-hook-org (x y))
;;;
;;; Real functions
;;;
(lyskom-provide-function rassoc (key list)
"Return non-nil if KEY is `equal' to the cdr of an element of LIST.
The value is actually the element of LIST whose cdr is KEY."
(catch 'rassoc
(while list
(if (equal key (cdr (car list)))
(throw 'rassoc (car list))
(setq list (cdr list))))
(throw 'rassoc nil)))
(lyskom-provide-function rassq (key list)
"Return non-nil if KEY is `eq' to the cdr of an element of LIST.
The value is actually the element of LIST whose cdr is KEY."
(catch 'rassq
(while list
(if (eq key (cdr (car list)))
(throw 'rassq (car list))
(setq list (cdr list))))
(throw 'rassq nil)))
;;;
;;; Functions for limited simulation of local hooks
;;;
(lyskom-compatibility-forms (fboundp 'make-local-hook)
(fset 'add-hook-org (symbol-function 'add-hook))
(fset 'remove-hook-org (symbol-function 'remove-hook)))
(lyskom-compatibility-definition (fboundp 'make-local-hook)
(defun add-hook (hook function &optional append local)
(add-hook-org hook function append)))
(lyskom-compatibility-definition (fboundp 'make-local-hook)
(defun remove-hook (hook function &optional local)
(remove-hook-org hook function)))
(lyskom-provide-function make-local-hook (hook)
"Poor man's definition of make-local-hook. Better'n nothing..."
(make-variable-buffer-local hook))
(lyskom-provide-function buffer-live-p (buf)
(and (bufferp buf) (buffer-name buf)))
(lyskom-provide-function get-buffer-window-list (buffer
&optional minibuf frame)
"Return windows currently displaying BUFFER, or nil if none.
See `walk-windows' for the meaning of MINIBUF and FRAME."
(let ((buffer (if (bufferp buffer) buffer (get-buffer buffer))) windows)
(walk-windows (function (lambda (window)
(if (eq (window-buffer window) buffer)
(setq windows (cons window windows)))))
minibuf frame)
windows))
(lyskom-provide-macro byte-code-function-p (obj)
(` (compiled-function-p (, obj))))
(lyskom-provide-subst internal-facep (x)
(and (vectorp x) (= (length x) 8) (eq (aref x 0) 'face)))
(lyskom-provide-function facep (x)
"Return t if X is a face name or an internal face vector."
(and (or (and (fboundp 'internal-facep)
(internal-facep x))
(and (symbolp x)
(boundp 'global-face-data)
(assq x global-face-data)))
t))
(lyskom-provide-macro save-selected-window (&rest body)
"Execute BODY, then select the window that was selected before BODY."
(list 'let
'((save-selected-window-window (selected-window)))
(list 'unwind-protect