From: "H. Dieter Wilhelm" <dieter@duenenhof-wilhelm.de>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: Juri Linkov <juri@jurta.org>, Eli Zaretskii <eliz@gnu.org>,
"60587@debbugs.gnu.org" <60587@debbugs.gnu.org>,
Drew Adams <drew.adams@oracle.com>
Subject: bug#60587: Patch for adding links to symbols' help documentation
Date: Sun, 12 Feb 2023 12:04:36 +0100 [thread overview]
Message-ID: <86mt5j87qz.fsf@duenenhof-wilhelm.de> (raw)
In-Reply-To: <jwv4js0lqwl.fsf-monnier+emacs@gnu.org> (Stefan Monnier's message of "Sat, 04 Feb 2023 22:54:00 -0500")
[-- Attachment #1: Type: text/plain, Size: 878 bytes --]
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> + (if (string= major-mode "Info-mode")
>
> `major-mode` contains a symbol, so better do (eq major-mode 'Info-mode).
> This said, I don't know why you have that test. Any reason you're
> worried about this being called from another buffer?
No, not any longer 😊. In the meantime I mentioned the example of
'emacs-news-mode' also linking quoted symbols (and Info references) to
their documentation. So 'info-link-to-help-mode' is now a local
minor-mode which should work for any buffer. (I understood that it's
supposed to be the default for all *info* buffers.)
If all agree on this direction I'll adjust the Info documentation
accordingly..
But then, doesn't it makes sense to develop such a universal mode
independent of info.el, e.g. like a 'bug-reference-mode'?
Thanks for your opinions
[-- Attachment #2: 0001-Info-providing-buttons-on-quoted-symbols-bug-60587.patch --]
[-- Type: text/x-diff, Size: 20870 bytes --]
From 7d8e1ce37b35a782430b985b0f7b54aa24377388 Mon Sep 17 00:00:00 2001
From: Dieter Wilhelm <dieter@duenenhof-wilhelm.de>
Date: Wed, 25 Jan 2023 22:00:57 +0100
Subject: [PATCH] Info providing buttons on quoted symbols (bug#60587)
*lisp/info.el
---
lisp/info.el | 450 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 450 insertions(+)
diff --git a/lisp/info.el b/lisp/info.el
index 035dff66e75..a7fa11e6a5c 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -5510,6 +5510,456 @@ info--manual-names
Info-directory-list
(mapcar #'car Info-suffix-list))))))))
+\f
+;;; Commentary:
+
+;; All code below provides buttons of symbols (functions, variables,
+;; and faces) within Emacs' Info viewer linking to their builtin help
+;; documentation. This linking is done when symbol names in texinfo
+;; documentation (like the Emacs- and Elisp manual) are:
+
+;; 1. Quoted symbol names like `symbol-name'.
+
+;; 2. Function names which are prefixed by M-x, for example M-x
+;; function-name or are quoted and prefixed, like `M-x function-name'.
+
+;; 3. Function names appearing behind the following forms, which
+;; occur, for example, in the Elisp manual: (info "(elisp) Eval")
+
+;; -- Special Form: function-name
+;; -- Command: ...
+;; -- Function: ...
+;; -- Macro: ...
+
+;; 4. And variables names behind the following text:
+
+;; -- User Option: variable-name
+;; -- Variable: ...
+
+;; In any case all symbol names must be known to Emacs, which means it
+;; is either a built-in, or its Lisp package is loaded for the current
+;; Emacs session, or the symbol is auto-loaded.
+
+;; You can follow the additional links with the usual Info
+;; keybindings. The customisation variable
+;; `mouse-1-click-follows-link' is influencing the clicking behavior
+;; (and tooltips) of the links, the variable's default is 450 (milli
+;; seconds) setting it to nil means only clicking with mouse-2 is
+;; following the link (hint: Drew Adams).
+
+;; The link color of symbols - referencing their builtin documentation
+;; - is distinct from links which are referencing further Info
+;; documentation.
+
+;; Below code is checking if Info documents are relevant Elisp and
+;; Emacs related files to avoid false positives. Please see the
+;; customization variable `info-none-emacs-or-elisp-documents'.
+
+;; The code uses mostly mechanisms from Emacs' lisp/help-mode.el file.
+
+\f
+;;; Code:
+
+(require 'button)
+(require 'cl-lib)
+(require 'help-mode)
+(require 'cl-seq)
+(require 'subr-x)
+
+;;;###autoload
+(define-minor-mode info-links-to-help-mode
+ "The mode creates buttons on symbols linking to their documentation string.
+It shows their documentation in a *Help* buffers (in another
+window) when typing <RET> or clicking `mouse-2' on the buttons.
+These can be followed, as the regular Info manual references,
+with \\[Info-next-reference] and \\[Info-prev-reference].
+
+For details about which symbols are considered and the linking
+process itself please see the function `info-make-links-to-help'."
+ :init-value nil
+ :lighter " Hlp"
+ :group 'info
+ :version "30.1"
+ ;;(if (eq major-mode 'Info-mode)
+ (if info-links-to-help-mode
+ (progn
+ (if (eq major-mode 'Info-mode)
+ ;; we need this under Info-mode because of the narrowed
+ ;; Info file
+ (add-hook 'Info-selection-hook 'info-make-links-to-help))
+ (info-make-links-to-help)) ;for the current buffer
+ (with-silent-modifications
+ (if (eq major-mode 'Info-mode)
+ (remove-hook 'Info-selection-hook 'info-make-links-to-help))
+ ;; TODO: for Info mode we need to remove buttons from the whole
+ ;; (unnarrowed) file! (Actually for all buffers under "Hlp" mode.. :-/)
+ (remove-list-of-text-properties (point-min) (point-max)
+ '(button category info-args))))
+ ;;(setq info-links-to-help-mode nil)
+ ;;)
+ )
+;; No defcustom for variable i-l-t-h-m since it activates it for ALL
+;; buffers when setting i-l-t-h-m to none-nil
+
+;; Activate the mode for all Info buffers
+(add-hook 'Info-mode-hook 'info-links-to-help-mode)
+
+(defvar info-emacs-info-dir-content nil
+ "List of file names in Emacs' info directories.
+It is used to check if the current info file `Info-current-file'
+belongs to the Emacs and Elisp context. This variable will be
+initialised when opening the first info file.")
+
+(defcustom info-none-emacs-or-elisp-documents
+ '("aarm2012" ; Ada manual from package "ada-ref-man", 2023 on Elpa
+ "aarm2020" ; Ada manual from package "ada-ref-man", 2023 on Elpa
+ "arm2012" ; Ada manual from package "ada-ref-man", 2023 on Elpa
+ "arm2020" ; Ada manual from package "ada-ref-man", 2023 on Elpa
+ "sicp" ; Structure and Interpretation of Computer Programs,
+ ; package "sicp" 2023 on Melpa archive
+ )
+ "List of documentation which is not related to GNU Emacs or Elisp.
+As well as documents which should not be searched for linking to
+help documentation, for more details please see
+`info-check-docu-p'. The list must contain only the base name of
+info files, e.g. without the file extension \".info\"."
+ :type '(repeat string)
+ :version "30.1"
+ :group 'info)
+
+(defun info-check-docu-p ()
+ "Check if the current info file is relevant to Emacs or Elisp.
+That means `Info-current-file' is either found in Emacs' info/
+directory or in `package-user-dir' and is not included in the
+`info-none-emacs-or-elisp-documents' list."
+ ;; When initialising Info and `Info-mode-hook' is running there is
+ ;; not yet `Info-current-file' initialised
+ (when Info-current-file
+ (unless info-emacs-info-dir-content
+ (info-compile-emacs-info-dir-content))
+ (let* ((ifile Info-current-file) ;I-c-f doesn't yield file suffices!
+ (ifi (file-name-nondirectory ifile))
+ ;; Verify that checking pdir is redundant because Package
+ ;; adds info package folders to Info-directory-list
+ (pdir (when (boundp 'package-user-dir)
+ (expand-file-name
+ package-user-dir)))
+ (ifiles info-emacs-info-dir-content)
+ (ndocu info-none-emacs-or-elisp-documents)
+ (sufs (mapcar 'car Info-suffix-list))
+ (vars (mapcar #'(lambda (x)(concat ifi x)) sufs))
+ (emacsy (and ifile
+ (or (cl-intersection vars ifiles :test #'string=)
+ (when pdir (string-match pdir ifile)))
+ (not (assoc-string ifi ndocu)))))
+ (if emacsy
+ t))))
+
+(defvar describe-symbol-backends) ;from help-mode.el
+(defvar help-xref-following) ;dito
+
+(defvar-keymap info-button-map
+ :doc "Keymap used by buttons in Info buffers."
+ "RET" #'push-button
+ "<mouse-2>" #'push-button
+ "<follow-link>" 'mouse-face
+ "<mode-line> <mouse-2>" #'push-button
+ "<header-line> <mouse-2>" #'push-button)
+
+;;
+;; Button types
+;;
+
+;; Below parent button type `info' inherits Info's quoted symbol face
+;; `Info-quoted'. Otherwise the buttons would inherit from
+;; button.el's `link' face which looks identical to Info's links. But
+;; I think it is helpful to distinguish between button link and cross
+;; reference types because they react differently.
+(define-button-type 'info
+ 'link t
+ 'follow-link t
+ 'face 'Info-quoted
+ 'keymap info-button-map
+ 'action #'info-button-action)
+
+(define-button-type 'info-function
+ :supertype 'info
+ 'info-function 'describe-function
+ 'help-echo (purecopy "mouse-2, RET: describe this function"))
+
+(define-button-type 'info-variable
+ :supertype 'info
+ 'info-function 'describe-variable
+ 'help-echo (purecopy "mouse-2, RET: describe this variable"))
+
+(define-button-type 'info-face
+ :supertype 'info
+ 'info-function 'describe-face
+ 'help-echo (purecopy "mouse-2, RET: describe this face"))
+
+(define-button-type 'info-symbol
+ :supertype 'info
+ 'info-function #'describe-symbol
+ 'help-echo (purecopy "mouse-2, RET: describe this symbol"))
+
+(define-button-type 'info-function-def
+ :supertype 'info
+ 'info-function (lambda (fun &optional file type)
+ (or file
+ (setq file (find-lisp-object-file-name fun type)))
+ (if (not file)
+ (message "Unable to find defining file")
+ (require 'find-func)
+ (when (eq file 'C-source)
+ (setq file
+ (help-C-file-name (indirect-function fun) 'fun)))
+ ;; Don't use find-function-noselect because it follows
+ ;; aliases (which fails for built-in functions).
+ (let ((location
+ (find-function-search-for-symbol fun type file)))
+ (pop-to-buffer (car location))
+ (run-hooks 'find-function-after-hook)
+ (if (cdr location)
+ (goto-char (cdr location))
+ (message "Unable to find location in file")))))
+ 'help-echo (purecopy "mouse-2, RET: find function's definition"))
+
+(defun info-compile-emacs-info-dir-content ()
+ "Build a list of file names from Emacs' info directories.
+This function fills `info-emacs-info-dir-content' with files from
+`Info-directory-list'."
+ (setq info-emacs-info-dir-content
+ (mapcar 'file-name-nondirectory
+ (directory-files
+ (car
+ ;; search for the main Emacs' info/ directory, when this
+ ;; function is called Info-directory-list is already
+ ;; initialised
+ (cl-member "[^.]emacs" Info-directory-list :test
+ 'string-match-p))
+ ;; don't list "." and ".."
+ t "[^.]$"))))
+
+(defun info-button-action (button)
+ "Call BUTTON's help function."
+ (info-do-xref nil
+ (button-get button 'info-function)
+ (button-get button 'info-args)))
+
+(defun info-do-xref (_pos function args)
+ "Call the help cross-reference function FUNCTION with args ARGS.
+Things are set up properly so that the resulting `help-buffer' has
+a proper [back] button."
+ ;; There is a reference at point. Follow it.
+ (let ((help-xref-following nil))
+ (apply
+ function (if (eq function 'info)
+ (append args (list (generate-new-buffer-name "*info*")))args))))
+
+(defun info-button (match-number type &rest args)
+ "Make a hyperlink for cross-reference text previously matched.
+MATCH-NUMBER is the subexpression of interest in the last matched
+regexp. TYPE is the type of button to use. Any remaining
+arguments are passed to the button's info-function when it is
+invoked. See `info-make-links-to-help'. Don't forget ARGS."
+ ;; Don't munge properties we've added, especially in some instances.
+ (unless (button-at (match-beginning match-number))
+ (make-text-button (match-beginning match-number)
+ (match-end match-number)
+ 'type type 'info-args args)))
+
+(defvar info-symbol-context
+ '((variable . "variable\\|option")
+ (function . "function\\|command\\|call")
+ (face . "face")
+ ;; ignore symbols following this context type
+ (ignore . "symbol\\|program\\|property")
+ ;; function definitions in files
+ (definition . "source \\(?:code \\)?\\(?:of\\|for\\)"))
+ "This list helps to distinguish symbol types.
+Words in info documentation preceding a (quoted) symbol are used
+to distinguish variables, functions, faces and symbols. The
+context information can also be used to ignore symbols because
+there is no help documentation for them. The strings of the the
+list are becoming part of `info-symbol-regexp'.")
+
+(defvar info-symbol-regexp
+ ;; better use purecopy?
+ (concat
+ "\\(" ; Context start
+ "\\<\\(" ; Contex type definition
+ (string-remove-suffix
+ "\\|"
+ (mapconcat
+ (lambda (x) (concat "\\(" (cdr x) "\\)\\|"))
+ info-symbol-context ""))
+ "\\)" ; Context type definition end
+ "[ \t\n]+" ; Separators to quoted symbols
+ "\\)?" ; End of context
+ ;; quoted symbol
+ "['`‘]" ; opening quotes
+ ;; Note: Symbol starting with word-syntax character:
+ "\\(\\sw\\(\\sw\\|\\s_\\)+\\|`\\)" ; The symbol itself
+ "['’]" ; End quotes
+ )
+ "The regular expression for matching symbols to their help documentation.
+It is comprised of the symbol's context and the (quoted) symbol
+name. The various groups of context regular expressions are
+matched in `info-make-links-to-help' to distinct info buttons.")
+
+(defun info-check-type( type)
+ "Check if TYPE corresponds to the current search result.
+The function is used in `info-make-links-to-help'."
+ (let* ((isc info-symbol-context)
+ (n 3) ;embedded within 2 groups
+ (l (+ 3 (length isc))))
+ (while (and (not (eq type (caar isc) ) ) (< n l) )
+ (setq n (1+ n))
+ (setq isc (cdr isc)))
+ (match-string n)))
+
+\f
+;;;###autoload
+(defun info-make-links-to-help (&optional buffer)
+ "Parse and hyperlink quoted symbols in the given BUFFER.
+BUFFER defaults to the current buffer if omitted or nil. Find
+symbols and their context in an Info buffer and activate buttons
+for linking to their documentation string with `info-button'.
+
+Symbols have the canonical (quoted) form `symbol-name' and the
+type of reference may be disambiguated by the preceding word(s)
+as compiled in `info-symbol-regexp'. For example: Symbol names
+are receiving distinct variable buttons when preceeded by the
+words \"variable\" or \"option\".
+
+Variables are also detected when their names follow below forms:
+
+ -- User Option: variable-name
+ -- Variable: ...
+
+Function names are detected when prefixed by `M-x', for example
+`M-x function-name' or are quoted and prefixed like `M-x
+function-name'.
+
+Function names are detected, as well, when appearing behind the
+following forms, which occur - for example - in the Elisp manual:
+
+ -- Special Form: function-name
+ -- Command: ...
+ -- Function: ...
+ -- Macro: ...
+
+The linking is similar to mechanisms from lisp/help.el."
+ (interactive "b") ;asking for buffer name..
+ (if (eq major-mode 'Info-mode)
+ (when (info-check-docu-p)
+ (with-current-buffer (or buffer (current-buffer))
+ (save-excursion
+ (goto-char (point-min))
+ (with-silent-modifications
+ (let ((case-fold-search t)
+ (inhibit-read-only t))
+ (with-syntax-table emacs-lisp-mode-syntax-table
+ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; The following is for finding "quoted symbols"
+ (save-excursion
+ (while (re-search-forward info-symbol-regexp nil t)
+ ;; sym-group is the regexp group for the symbol name
+ (let* ((sym-group (+ 3 (length info-symbol-context)))
+ (data (match-string sym-group))
+ (sym (intern-soft data)))
+ (if sym
+ (cond
+ ((info-check-type 'variable)
+ (and (or (boundp sym)
+ (get sym 'variable-documentation))
+ (info-button sym-group 'info-variable sym)))
+ ((info-check-type 'function)
+ (and (fboundp sym)
+ (info-button sym-group 'info-function sym)))
+ ((info-check-type 'face)
+ (and (facep sym)
+ (info-button sym-group 'info-face sym)))
+ ((info-check-type 'ignore))
+ ((info-check-type 'definition)
+ (info-button sym-group 'info-function-def sym))
+ ;; for symbols
+ ((cl-some (lambda (x) (funcall (nth 1 x) sym))
+ describe-symbol-backends)
+ (info-button sym-group 'info-symbol sym)))))))
+ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; See e.g.: (info "(elisp) Eval")
+ ;; Elisp manual -- Special Form:
+ ;; -- Command:
+ ;; -- Function: function-name function
+ ;; -- Macro:
+ (save-excursion
+ (while (re-search-forward
+ "-- \\(Special Form:\\|Command:\\|Function:\\|Macro:\\) "
+ nil t)
+ (looking-at "\\(\\sw\\|\\s_\\)+")
+ (let ((sym (intern-soft (match-string 0))))
+ (if (fboundp sym)
+ (info-button 0 'info-function sym)))))
+ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; -- User Option:
+ ;; -- Variable: variable-name
+ (save-excursion
+ (while (re-search-forward
+ "-- \\(User Option:\\|Variable:\\) "
+ nil t)
+ (looking-at "\\(\\sw\\|\\s_\\)+")
+ (let ((sym (intern-soft (match-string 0))))
+ (if (boundp sym)
+ (info-button 0 'info-variable sym)))))
+ ;; M-x prefixed functions
+ (save-excursion
+ (while (re-search-forward
+ ;; Assume command name is only word and symbol
+ ;; characters to get things like `use M-x foo->bar'.
+ ;; Command required to end with word constituent
+ ;; to avoid `.' at end of a sentence.
+ ;; "\\<M-x\\s-+\\(\\sw\\(\\sw\\|\\s_\\)*\\sw\\)" nil t)
+ ;; include M-x and quotes
+ "['`‘]?M-x\\s-*\n?\\(\\sw\\(\\sw\\|\\s_\\)*\\sw\\)['’]?" nil t)
+ (let ((sym (intern-soft (match-string 1))))
+ (if (fboundp sym)
+ (info-button 1 'info-function sym)))))))))))
+ ;; other, non-Info buffers
+ (info--buttonize)
+ ))
+
+;; stolen from emacs-news-mode.el
+(defun info--buttonize ()
+ "Make manual and symbol references into buttons."
+ (save-excursion
+ (with-silent-modifications
+ (let ((inhibit-read-only t))
+ ;; Do functions and variables.
+ (goto-char (point-min))
+ (search-forward "\f" nil t)
+ ;; symbol quoting styles: '' and `' (grave accent and
+ ;; apostrophe, pre Emacs-25)
+ (while (re-search-forward "['`]\\([^-][^ \t\n]+\\)'" nil t)
+ ;; Filter out references to key sequences.
+ (let ((string (match-string 1)))
+ (when-let ((symbol (intern-soft string)))
+ (when (or (boundp symbol)
+ (fboundp symbol))
+ (buttonize-region (match-beginning 1) (match-end 1)
+ (lambda (symbol)
+ (describe-symbol symbol))
+ symbol)))))
+ ;; Do manual references '"(...) ..."'.
+ (goto-char (point-min))
+ (search-forward "\f" nil t)
+ (while (re-search-forward "\"\\(([a-z0-9-]+)[ \n][^\"]\\{1,80\\}\\)\""
+ nil t)
+ (buttonize-region (match-beginning 1) (match-end 1)
+ (lambda (node) (info node))
+ (match-string 1)))))))
+
+
(provide 'info)
;;; info.el ends here
--
2.34.1
[-- Attachment #3: Type: text/plain, Size: 70 bytes --]
--
Dieter
Best wishes
H. Dieter Wilhelm
Zwingenberg, Germany
next prev parent reply other threads:[~2023-02-12 11:04 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-05 23:47 bug#60587: 30.0.50; Info pages are lacking links from symbol names to the symbol's help documentation H. Dieter Wilhelm
2023-01-06 19:03 ` bug#60587: Patch for adding links to symbols' " H. Dieter Wilhelm
2023-01-07 7:38 ` Eli Zaretskii
2023-01-08 20:06 ` H. Dieter Wilhelm
2023-01-09 12:46 ` Eli Zaretskii
2023-01-09 14:25 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-09 20:01 ` H. Dieter Wilhelm
2023-01-13 23:33 ` H. Dieter Wilhelm
2023-01-14 7:12 ` Eli Zaretskii
2023-01-15 12:48 ` H. Dieter Wilhelm
2023-01-17 21:53 ` H. Dieter Wilhelm
2023-01-18 13:20 ` Eli Zaretskii
2023-01-20 21:09 ` H. Dieter Wilhelm
2023-01-20 21:59 ` Drew Adams
2023-01-20 23:32 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-22 13:00 ` H. Dieter Wilhelm
2023-01-21 8:21 ` Eli Zaretskii
2023-01-21 20:27 ` H. Dieter Wilhelm
2023-01-22 6:00 ` Eli Zaretskii
2023-01-22 22:09 ` Drew Adams
2023-01-23 12:14 ` Eli Zaretskii
2023-01-23 16:16 ` Drew Adams
2023-01-25 21:29 ` H. Dieter Wilhelm
2023-01-25 22:24 ` Drew Adams
2023-01-26 10:29 ` Ihor Radchenko
2023-01-26 15:06 ` Drew Adams
2023-01-26 15:12 ` Ihor Radchenko
2023-01-26 15:23 ` Drew Adams
2023-01-27 21:35 ` H. Dieter Wilhelm
2023-01-27 22:12 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-27 23:09 ` Drew Adams
2023-01-27 23:13 ` Drew Adams
2023-01-28 8:11 ` Eli Zaretskii
2023-01-28 17:30 ` Drew Adams
2023-02-01 22:09 ` H. Dieter Wilhelm
2023-02-02 2:30 ` Drew Adams
2023-02-05 0:48 ` H. Dieter Wilhelm
2023-02-05 3:54 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-02-05 13:54 ` H. Dieter Wilhelm
2023-02-06 21:04 ` H. Dieter Wilhelm
2023-02-12 11:04 ` H. Dieter Wilhelm [this message]
2023-02-14 20:56 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-02-15 22:18 ` H. Dieter Wilhelm
2023-02-16 3:08 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-02-20 23:53 ` H. Dieter Wilhelm
2023-02-21 2:12 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-03-01 21:45 ` H. Dieter Wilhelm
2023-03-11 8:32 ` Eli Zaretskii
2023-03-11 9:16 ` H. Dieter Wilhelm
2023-02-15 5:17 ` Richard Stallman
2023-02-15 9:53 ` Gregory Heytings
2023-02-15 13:42 ` Gregory Heytings
2023-01-26 10:37 ` Eli Zaretskii
2023-01-27 7:45 ` Juri Linkov
2023-01-27 8:11 ` Eli Zaretskii
2023-01-27 22:21 ` H. Dieter Wilhelm
2023-01-28 7:51 ` Eli Zaretskii
2023-02-01 21:26 ` H. Dieter Wilhelm
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=86mt5j87qz.fsf@duenenhof-wilhelm.de \
--to=dieter@duenenhof-wilhelm.de \
--cc=60587@debbugs.gnu.org \
--cc=drew.adams@oracle.com \
--cc=eliz@gnu.org \
--cc=juri@jurta.org \
--cc=monnier@iro.umontreal.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).