Commit f5ac77cc authored by David Byers's avatar David Byers
Browse files

Fix 19.34 compatibility. Fix bug 1312. Maybe fix bug 1362.

Detailed changes:
> 2004-06-26  David Byers  <byers@lysator.liu.se>
>
> 	Fix Emacs 19.34 compatibility problems:
> 	* compatibility.el (map-keymap): Bug fix-
>
> 	* menus.el (lyskom-swedish-bindings): Moved here from vars.el.in
> 	to make Emacs 19.34 work again.
> 	(lyskom-swedish-bindings-reverse): Ditto.
>
> 2004-06-25  David Byers  <byers@lysator.liu.se>
>
> 	New abstraction for listing texts:
> 	* faqs.el (lyskom-present-unread-faqs): Implement using new
> 	functions.
> 	(lyskom-do-list-faqs): Ditto.
>
> 	* commands2.el (lyskom-do-list-summary): Removed. Not used.
> 	(lyskom-list-summary): Implement using new functions.
> 	(lyskom-print-summary-line): Not used any more. Removed.
> 	(lyskom-construct-summary-format-string): Ditto.
>
> 	* utilities.el (lyskom-max-text-no-width): Moved here from
> 	commands2.el.
> 	(lyskom-symbolic-mark-type-string): Ditto.
> 	(lyskom-max-text-no-width): Ditto.
>
> 	* commands2.el (kom-list-marks): Implement using
> 	lyskom-list-text-summary. Show number of marks for each text.
> 	(lyskom-print-mark-summary-line): No longer used. Removed.
> 	(lyskom-max-mark-width): Cleaned up this code a little.
>
> 	* utilities.el (lyskom-list-text-summary-get): New support function.
> 	(lyskom-list-text-summary-put): Ditto.
> 	(lyskom-text-summary-fields): New variable.
> 	(lyskom-list-text-summary-subject): New support function.
> 	(lyskom-summary-line-format-string): Ditto.
> 	(lyskom-list-text-summary-print): Ditto.
> 	(lyskom-list-text-summary): Generic function for printing lists of
> 	texts. Incorporates support for all features in older text list
> 	functions.
>
> 2004-06-24  David Byers  <byers@lysator.liu.se>
>
> 	Fix bug 1362:
> 	* parse.el (lyskom-parse-float): Relaxed the regexp matching
> 	floats to avoid terminating the parse too early.
>
parent d3762650
2004-06-26 David Byers <byers@lysator.liu.se>
Fix Emacs 19.34 compatibility problems:
* compatibility.el (map-keymap): Bug fix-
* menus.el (lyskom-swedish-bindings): Moved here from vars.el.in
to make Emacs 19.34 work again.
(lyskom-swedish-bindings-reverse): Ditto.
2004-06-25 David Byers <byers@lysator.liu.se>
New abstraction for listing texts:
* faqs.el (lyskom-present-unread-faqs): Implement using new
functions.
(lyskom-do-list-faqs): Ditto.
* commands2.el (lyskom-do-list-summary): Removed. Not used.
(lyskom-list-summary): Implement using new functions.
(lyskom-print-summary-line): Not used any more. Removed.
(lyskom-construct-summary-format-string): Ditto.
* utilities.el (lyskom-max-text-no-width): Moved here from
commands2.el.
(lyskom-symbolic-mark-type-string): Ditto.
(lyskom-max-text-no-width): Ditto.
* commands2.el (kom-list-marks): Implement using
lyskom-list-text-summary. Show number of marks for each text.
(lyskom-print-mark-summary-line): No longer used. Removed.
(lyskom-max-mark-width): Cleaned up this code a little.
* utilities.el (lyskom-list-text-summary-get): New support function.
(lyskom-list-text-summary-put): Ditto.
(lyskom-text-summary-fields): New variable.
(lyskom-list-text-summary-subject): New support function.
(lyskom-summary-line-format-string): Ditto.
(lyskom-list-text-summary-print): Ditto.
(lyskom-list-text-summary): Generic function for printing lists of
texts. Incorporates support for all features in older text list
functions.
2004-06-24 David Byers <byers@lysator.liu.se>
Fix bug 1362:
* parse.el (lyskom-parse-float): Relaxed the regexp matching
floats to avoid terminating the parse too early.
2004-06-23 David Byers <byers@lysator.liu.se>
Make kom-join-all-conferences more responsive:
......
......@@ -2264,7 +2264,7 @@ exist."
(setq mark ""))
(cond
;; Default completion.
((and nildefault (null mark))
((and nildefault (string-equal "" mark))
(setq mark-type 'default))
((null mark))
......
......@@ -1112,189 +1112,11 @@ the text on one line."
(setq r (1+ r))))
(setq read-info (read-list->nth read-list r))
(when read-info
(lyskom-do-list-summary
(text-list->texts (read-info->text-list read-info))
unique))
))
(lyskom-list-text-summary
(text-list->texts (read-info->text-list read-info))
'(text-no " " written " " lines " " comments " " author " " subject)
(if unique :unique :comment-order)))))
(defun lyskom-do-list-summary (texts &optional unique)
"List a summary of the texts in TEXTS.
The summary contains the date, number of lines, author and subject of the text
on one line."
(let ((time (lyskom-current-server-time))
(texts (copy-sequence texts))
(indent 0)
(unique-subjects nil))
;; The header.
(lyskom-format-insert (lyskom-construct-summary-format-string t nil t)
(lyskom-get-string 'Texts)
(lyskom-get-string 'Written)
(lyskom-get-string 'Lines)
(lyskom-get-string 'Author)
(lyskom-get-string 'Subject)
nil
(lyskom-get-string 'Comments))
;; The summary lines.
(let ((text-no nil)
(last-subject ""))
(while texts
(setq text-no (car texts) texts (cdr texts))
(cond
((eq text-no 'in) (setq indent (1+ indent)))
((eq text-no 'out) (setq indent (1- indent)))
(t (blocking-do-multiple ((text-stat (get-text-stat text-no))
(text (get-text text-no)))
(let* ((txt (text->decoded-text-mass text text-stat))
(eos (and txt (string-match (regexp-quote "\n") txt)))
(subject (and eos (substring txt 0 eos))))
(when (or (not unique)
(and (not (lyskom-string-member subject unique-subjects))
(setq unique-subjects (cons subject unique-subjects))))
(lyskom-print-summary-line
(lyskom-construct-summary-format-string nil nil t)
text-stat
(if (and (> indent 0) (string-equal subject last-subject))
""
subject)
text-no
(time->year time)
(time->mon time)
(time->mday time)
indent))
(setq last-subject subject)
(let ((comments (lyskom-text-comments text-stat)))
(setq texts (cons 'out texts))
(lyskom-traverse comment-no (nreverse comments)
(when (memq comment-no texts)
(setq texts (cons comment-no (delq comment-no texts)))))
(setq texts (cons 'in texts)))))
(sit-for 0)))))))
(defun lyskom-print-summary-line (format-string text-stat subject text-no year mon mday indent)
"Handle the info, fetch the author and print it.
The year, mon and mday are there to be able to choose format on the
day. Format is HH:MM(:SS) if the text is written today, otherwise
YYYY-MM-DD."
(if (null text-stat) ;+++ B{ttre felhantering.
(lyskom-format-insert 'could-not-read text-no)
(let* ((lines (text-stat->no-of-lines text-stat))
(mx-date (car (lyskom-get-aux-item (text-stat->aux-items text-stat) 21)))
(mx-from (car (lyskom-get-aux-item (text-stat->aux-items text-stat) 17)))
(mx-author (car (lyskom-get-aux-item (text-stat->aux-items text-stat) 16)))
(time (or (lyskom-mx-date-to-time mx-date)
(text-stat->creation-time text-stat)))
(time (if (and (= year (time->year time))
(= mon (time->mon time))
(= mday (time->mday time)))
(lyskom-format-time 'time time)
(lyskom-format-time 'timeformat-yyyy-mm-dd time))))
(lyskom-format-insert format-string
text-no
time
lines
(if (or mx-from mx-author)
(lyskom-format-mx-author mx-from mx-author)
(text-stat->author text-stat))
(lyskom-default-button 'text text-no)
(concat
(if (>= indent 10)
(format ">>>[%d]>>>" indent)
(make-string indent ?\>))
subject)
(length (lyskom-text-comments text-stat))))))
(defun lyskom-max-text-no-width ()
"Ask the server about the maximum text number width."
(length (int-to-string (blocking-do 'find-previous-text-no
lyskom-max-int))))
(defun lyskom-construct-summary-format-string (header
include-mark-field
&optional include-comments-field)
"Returns a format string suitable for printing text summaries. If
HEADER is non-nil, a header format string is contructed, otherwise a
format string for a summary row. If (and only if) INCLUDE-MARK-FIELD
is non-nil, a field where the mark string can be put will be
included."
(let* ((mark-field-width (when include-mark-field
(max (length (lyskom-get-string 'mark-type))
(lyskom-max-mark-width))))
(comments-field-width (when include-comments-field 2))
(text-no-width (lyskom-max-text-no-width))
(text-no-field-width (max (length (lyskom-get-string 'Texts))
text-no-width))
(written-field-width (max (length (lyskom-get-string 'Written))
(length (lyskom-format-time 'time))
(length (lyskom-format-time
'timeformat-yyyy-mm-dd))))
(lines-field-width (max (length (lyskom-get-string 'Lines))
5))
(author-and-subject-fields-width
(max (+ (length (lyskom-get-string 'Author))
1
(length (lyskom-get-string 'Subject)))
(- (lyskom-window-width)
(+ (if include-mark-field (1+ mark-field-width) 0)
(if include-comments-field (1+ comments-field-width) 0)
text-no-field-width
1
written-field-width
1
lines-field-width
1)
1)))
(author-field-width (max (length (lyskom-get-string 'Author))
(/ author-and-subject-fields-width 3)))
(subject-field-width (- author-and-subject-fields-width
author-field-width
1)))
(if header
(concat (if include-mark-field
(concat "%-" (int-to-string mark-field-width) "#6s"
" ")
"")
"%-" (int-to-string text-no-field-width) "#1s"
" "
"%-" (int-to-string written-field-width) "#2s"
" "
"%-" (int-to-string lines-field-width) "#3s"
" "
(if include-comments-field
(concat "%-" (int-to-string comments-field-width) "#7s"
" ")
"")
"%-" (int-to-string author-field-width) "#4s"
" "
"%#5s"
"\n")
(concat (if include-mark-field
(concat "%-" (int-to-string mark-field-width) "#7s"
" ")
"")
"%-" (int-to-string text-no-field-width) "#1n"
" "
"%-" (int-to-string written-field-width) "#2s"
" "
"%" (int-to-string lines-field-width) "#3d"
" "
(if include-comments-field
(concat "%#7?z%[%"
(int-to-string comments-field-width)
"#7d%]%["
(make-string comments-field-width ?\ )
"%]"
" ")
"")
"%=-" (int-to-string (1- author-field-width)) "#4P"
" "
"%[%#5@%=-" (int-to-string subject-field-width) "#6r%]"
"\n"))))
;;; ============================================================
;;; kom-list-marks Lista markeringar
......@@ -1311,76 +1133,19 @@ will be prompted for the mark."
(setq which-mark (lyskom-read-mark-type
(lyskom-get-string 'list-which-mark)
t)))
(let ((marks
(sort (listify-vector (blocking-do 'get-marks))
(lambda (a b) (< (mark->mark-type a) (mark->mark-type b)))))
(time (lyskom-current-server-time)))
;; Start fetching all text-stats and text to list them.
(lyskom-format-insert (lyskom-construct-summary-format-string t t)
(lyskom-get-string 'Texts)
(lyskom-get-string 'Written)
(lyskom-get-string 'Lines)
(lyskom-get-string 'Author)
(lyskom-get-string 'Subject)
(lyskom-get-string 'mark-type))
(lyskom-traverse
mark marks
(when (or (null which-mark)
(eq (mark->mark-type mark) which-mark))
(let* ((text-no (mark->text-no mark))
(text-stat (blocking-do 'get-text-stat text-no))
(text (blocking-do 'get-text text-no))
;; We could do som optimization here.
;; We really don't need the whole text.
)
(lyskom-print-mark-summary-line (lyskom-construct-summary-format-string nil t)
mark text-stat text text-no
(time->year time) (time->yday time))
(sit-for 0))))
))
(defun lyskom-print-mark-summary-line (format-string mark text-stat text text-no year day)
"Handle the info, fetch the author and print it.
Args: FORMAT-STRING TEXT-STAT TEXT TEXT-NO YEAR DAY.
The year and day is there to be able to choose format on the day.
Format is HH:MM(:SS) if the text is written today, otherwise
YYYY-MM-DD."
(if (not (and text-stat text)) ;+++ B{ttre felhantering.
(lyskom-format-insert 'could-not-read text-no)
(let* ((lines (text-stat->no-of-lines text-stat))
(txt (text->decoded-text-mass text text-stat))
(eos (string-match (regexp-quote "\n") txt))
(subject (substring txt 0 eos))
(time (text-stat->creation-time text-stat))
(time (if (and (= year (time->year time))
(= day (time->yday time)))
(lyskom-format-time 'time time)
(lyskom-format-time 'timeformat-yyyy-mm-dd time))))
(lyskom-format-insert format-string
text-no
time
lines
(text-stat->author text-stat)
(lyskom-default-button 'text
text-no)
subject
(mark->symbolic-mark-type mark)))))
(defun lyskom-symbolic-mark-type-string (mark-no &optional strict)
"Return a symbolic name string for the mark-type of MARK.
If optional argument STRICT is non-nil, return nil if there is no symbolic
name for the mark type."
(or (car-safe (rassoc mark-no kom-symbolic-marks-alist))
(and (not strict) (int-to-string mark-no))))
(defun lyskom-max-mark-width ()
"Return the maximum width of the user's symbolic mark strings."
(max 3
(apply 'max
(mapcar (function (lambda (x) (length (car x))))
kom-symbolic-marks-alist))))
;; Start fetching all text-stats and text to list them.
(lyskom-list-text-summary
(sort (listify-vector (blocking-do 'get-marks))
(lambda (a b) (< (mark->mark-type a)
(mark->mark-type b))))
'(mark-type " " text-no " " written " " lines " " mark-count " " author " " subject)
:filter (lambda (mark which-mark)
(or (null which-mark)
(eq (mark->mark-type mark) which-mark)))
:filter-args (list which-mark)))
;;; ============================================================
;;; kom-who-am-i - Vem r jag
......
......@@ -149,15 +149,15 @@ KEYS should be a string in the format used for saving keyboard macros
;; except that the sort-first argument is ignored.
(lyskom-function-alias map-keymap (fn keymap &optional sort-first)
"Map FN over all bindings in KEYMAP."
(let ((r 0))
(when (keymapp keymap)
(when (symbolp keymap) (setq keymap (symbol-value keymap)))
(let ((keymap (cdr keymap))
(el nil))
(while (and keymap (not (keymapp keymap)))
(setq el (car keymap)
keymap (cdr keymap))
(cond ((vectorp keymap)
(setq el (car keymap) keymap (cdr keymap))
(cond ((vectorp el)
(while (< r (length el))
(if (aref el r)
(funcall fn r (aref el r)))
......@@ -564,7 +564,32 @@ Otherwise treat \\ in NEWTEXT string as special:
(lyskom-make-self-evaluating :default-help-echo)
(lyskom-make-self-evaluating :group)
(lyskom-make-self-evaluating :automatic)
(lyskom-make-self-evaluating :read-only))
(lyskom-make-self-evaluating :read-only)
(lyskom-make-self-evaluating :filter)
(lyskom-make-self-evaluating :filter-args)
(lyskom-make-self-evaluating :constraint)
(lyskom-make-self-evaluating :save)
(lyskom-make-self-evaluating :refer)
(lyskom-make-self-evaluating :width)
(lyskom-make-self-evaluating :prompt)
(lyskom-make-self-evaluating :align)
(lyskom-make-self-evaluating :format)
(lyskom-make-self-evaluating :output)
(lyskom-make-self-evaluating :subject-mode)
(lyskom-make-self-evaluating :subject-indent)
(lyskom-make-self-evaluating :text)
(lyskom-make-self-evaluating :text-stat)
(lyskom-make-self-evaluating :text-no)
(lyskom-make-self-evaluating :subjects)
(lyskom-make-self-evaluating :subject-last)
(lyskom-make-self-evaluating :comment-order)
(lyskom-make-self-evaluating :unique)
(lyskom-make-self-evaluating :weight)
(lyskom-make-self-evaluating :prompt-format)
(lyskom-make-self-evaluating :dead-ok)
(lyskom-make-self-evaluating :mark)
(lyskom-make-self-evaluating :may-interrupt)
)
;;; ================================================================
......
......@@ -457,8 +457,7 @@ create a new FAQ."
(when kom-auto-list-faqs
(lyskom-format-insert 'unread-faqs-header (length faq-list)
(and conf-stat (conf-stat->conf-no conf-stat)))
(lyskom-do-list-summary faq-list))
(lyskom-list-text-summary faq-list nil))
(when kom-auto-review-faqs
(lyskom-do-review-faq faq-list t))))
......@@ -490,5 +489,5 @@ create a new FAQ."
(lyskom-format-insert 'all-faqs-header
(and conf-stat
(conf-stat->conf-no conf-stat)))
(lyskom-do-list-summary faq-list))
(lyskom-list-text-summary faq-list nil))
(t (lyskom-format-insert 'conf-has-no-faq conf-stat))))
......@@ -236,28 +236,29 @@ All the forms in BIND-LIST are evaluated before any symbols are bound."
(defmacro lyskom-end-of-compilation ()
(`
(eval-when-compile
(progn
(if (and (boundp 'byte-compile-unresolved-functions)
(consp (car-safe byte-compile-unresolved-functions))
(symbolp (car-safe (car-safe
byte-compile-unresolved-functions))))
(progn
(mapcar (function (lambda (x)
(setq byte-compile-unresolved-functions
(delq
(assq x
byte-compile-unresolved-functions)
byte-compile-unresolved-functions))))
lyskom-expected-unresolved-functions)
))
(if lyskom-compatibility-definitions
(message "Compatibility definitions: %s"
(mapconcat '(lambda (sym)
(symbol-name sym))
lyskom-compatibility-definitions
", ")))))))
`(progn
(eval-when-compile
(progn
(if (and (boundp 'byte-compile-unresolved-functions)
(consp (car-safe byte-compile-unresolved-functions))
(symbolp (car-safe (car-safe
byte-compile-unresolved-functions))))
(progn
(mapcar (function (lambda (x)
(setq byte-compile-unresolved-functions
(delq
(assq x
byte-compile-unresolved-functions)
byte-compile-unresolved-functions))))
lyskom-expected-unresolved-functions)
))
(if lyskom-compatibility-definitions
(message "Compatibility definitions: %s"
(mapconcat '(lambda (sym)
(symbol-name sym))
lyskom-compatibility-definitions
", ")))))))
;;; ============================================================
;;; Keymap handling
......
......@@ -343,6 +343,28 @@
(defvar lyskom-popup-menu nil
"A keymap the LysKOM menu in the edit buffer.")
;;; ================================================================
;;; Hack for swedish bindings and shortcuts
(defvar lyskom-swedish-bindings
`(( . (aring Aring ,(elt (kbd "") 0) ,(elt (kbd "") 0)
229 197 2277 2245 3909 3941))
( . (adiaeresis Adiaeresis ,(elt (kbd "") 0) ,(elt (kbd "") 0)
228 196 2276 2244 3908 3940)))
"Hack to deal with binding swedish characters")
(defvar lyskom-swedish-bindings-reverse
(let ((tmp nil)
(seq lyskom-swedish-bindings))
(while seq
(let ((el (car seq)))
(setq tmp (nconc tmp (mapcar (lambda (x)
(cons x (car el)))
(cdr el)))))
(setq seq (cdr seq)))
tmp)
"Hack to deal with binding swedish characters")
(defun lyskom-menu-guess-shortcuts (keymap &optional prefix result force)
(lyskom-traverse-keymap
(lambda (key binding)
......
......@@ -134,7 +134,7 @@ Signal lyskom-protocol-error if the next token is not a number."
Signal lyskom-parse-incomplete if the number is not followed by whitespace.
Signal lyskom-protocol-error if the next token is not a number."
(goto-char lyskom-parse-pos)
(cond ((looking-at "[ \n]*[-+]?[0-9]*\\(\\.[0-9]*\\)?\\([eE][-+]?[0-9]+\\)?")
(cond ((looking-at "[ \n]*[-+]?[0-9]*\\(\\.\\([0-9]*\\([eE]\\([-+]?[0-9]*\\)?\\)?\\)?\\)?")
(if (char-after (match-end 0))
(progn (setq lyskom-parse-pos (goto-char (match-end 0)))
(string-to-number (match-string 0)))
......
......@@ -793,7 +793,9 @@ Meddelandet du f
(Author . "Frfattare")
(Subject . "rende")
(Comments . "Ko")
(mark-type . "Typ")
(Num-marks . "Mk")
(mark-type . "Markering")
(mark-no . "Mrk")
(could-not-read . "Du fick inte lsa denna text (%#1n).\n")
(multiple-choice . "Flera alternativ finns.")
(does-not-exist . "Detta kommando finns inte.")
......
......@@ -701,8 +701,8 @@ non-negative integer and 0 means the given text-no."
;;; The main function
(defun lyskom-tnpa-apply-strategy (strategies filter-spec constraint-spec)
(let ((filter-locl (car (cdr (memq ':filter strategies))))
(constraint-locl (car (cdr (memq ':constraint strategies)))))
(let ((filter-locl (car (cdr (memq :filter strategies))))
(constraint-locl (car (cdr (memq :constraint strategies)))))
(lyskom-traverse strategy strategies
(if (memq strategy '(:filter :constraint :save))
(lyskom-traverse-break)
......@@ -730,12 +730,12 @@ non-negative integer and 0 means the given text-no."
(when (listp prompt) (setq prompt (car prompt)))
(let* ((command (or command lyskom-current-command this-command))
(command-spec (cdr (assq command kom-pick-text-no-strategy-alist)))
(refer-spec (car (cdr (memq ':refer command-spec))))
(refer-spec (car (cdr (memq :refer command-spec))))
(default-spec (cdr (assq t kom-pick-text-no-strategy-alist)))
(filter-spec (car (cdr (or (memq ':filter command-spec)
(memq ':filter default-spec)))))
(constraint-spec (car (cdr (or (memq ':constraint command-spec)
(memq ':constraint default-spec)))))
(filter-spec (car (cdr (or (memq :filter command-spec)
(memq :filter default-spec)))))
(constraint-spec (car (cdr (or (memq :constraint command-spec)
(memq :constraint default-spec)))))
(text nil))
(if refer-spec
......@@ -1895,7 +1895,7 @@ has the bug in that algorithm fixed)."
Any whitespace and newlines in TEXT will be ignored."
(save-match-data
(let ((text (replace-in-string text "\\s-+" "")))
(or (string-match "^\\(file://\\|ftp://\\|gopher://\\|http://\\|https://\\|news:\\|wais://\\|mailto:\\|telnet:\\)[^\t \012\014\"<>|\\]*[^][\t \012\014\"<>|.,!(){}?'`:;]$" text)
(or (string-match "^\\(file://\\|ftp://\\|gopher://\\|http://\\|https://\\|news:\\|wais://\\|mailto:\\|telnet:\\|rtsp:\\)[^\t \012\014\"<>|\\]*[^][\t \012\014\"<>|.,!(){}?'`:;]$" text)
(string-match "^\\(www\\|ftp\\|home\\)\\.[^\t \012\014\"<>|\\]*[^][\t \012\014\"<>|.,!(){}?'`:;]$" text)))))
......@@ -2276,5 +2276,416 @@ It ignores leading spaces and tabs."
(setq name (format "lyskom-gensym: %d" lyskom-gensym-index)))
(intern name)))
(put 'lyskom-with-magic-minibuffer 'edebug-form-spec '(body))
;;; ================================================================
;;; List text summaries
(defvar lyskom-list-text-summary-params)
(defvar lyskom-list-text-summary-params-persistent)
(defvar lyskom-list-text-summary-format)
(defsubst lyskom-list-text-summary-get (sym)
(or (plist-get lyskom-list-text-summary-params sym)
(plist-get lyskom-list-text-summary-params-persistent sym)))
(defsubst lyskom-list-text-summary-put (sym val &optional persistent)
(if persistent
(setq lyskom-list-text-summary-params-persistent
(plist-put lyskom-list-text-summary-params-persistent sym val))
(setq lyskom-list-text-summary-params
(plist-put lyskom-list-text-summary-params sym val))))
(defun lyskom-max-mark-width ()
"Return the maximum width of the user's symbolic mark strings."
(apply 'max 3 (mapcar (function (lambda (x) (length (car x))))
kom-symbolic-marks-alist)))
(defun lyskom-max-text-no-width ()
"Ask the server about the maximum text number width."
(length (int-to-string (blocking-do 'find-previous-text-no
lyskom-max-int))))
(defun lyskom-symbolic-mark-type-string (mark-no &optional strict)
"Return a symbolic name string for the mark-type of MARK.
If optional argument STRICT is non-nil, return nil if there is no symbolic
name for the mark type."
(or (car-safe (rassoc mark-no kom-symbolic-marks-alist))
(and (not strict) (int-to-string mark-no))))
(defvar lyskom-text-summary-fields
'((mark-type :width lyskom-max-mark-width
:prompt mark-type