From: Kaushal Modi <kaushal.modi@gmail.com>
To: martin rudalics <rudalics@gmx.at>
Cc: Ari Roponen <ari.roponen@gmail.com>, 22332@debbugs.gnu.org
Subject: bug#22332: 25.0.50; woman moves point in a wrong buffer
Date: Thu, 04 Feb 2016 05:41:27 +0000 [thread overview]
Message-ID: <CAFyQvY1bS+_hZOm8w-56rBS92AKC=8L8STuDamNwBvy5nBdObw@mail.gmail.com> (raw)
In-Reply-To: <56923823.1030109@gmx.at>
[-- Attachment #1: Type: text/plain, Size: 16734 bytes --]
Hi all,
>> Martin Rudalics
> This might fix the call from ‘woman-find-file’. But ‘WoMan-find-buffer’
> is also called from ‘WoMan-previous-manpage’ and ‘WoMan-next-manpage’.
> How can we be sure that ‘display-buffer’ does not display the previous
> or next WoMan buffer in another window? And if it does so, we have the
> problem that that other window does not get selected.
>
Can you please try this updated patch? This time, I hope to have it tested
all the woman buffer switching activities.
PS: The patch also resulted in many indentation changes. Looks like the
default lisp-indent-function is changed since the last major edits to
woman.el (because I did C-x h C-M-\ at the end committing my edits). Please
advise how to remove just the indentation changes.
From 657205fa5156a853e6d300b98f26fba75210e646 Mon Sep 17 00:00:00 2001
From: Kaushal Modi <kaushal.modi@gmail.com>
Date: Thu, 4 Feb 2016 00:22:31 -0500
Subject: [PATCH] Fix-22332: woman.el display/switch-to-buffer behav
- This is a continuation of the fix in commit
244a00860b6fe1d6acf92948c5c0d1ef0f8426fa
- This also fixes debbugs 22332; now executing `woman` does not
manipulate the point in a non-*WoMan* buffer.
- WoMan-find-buffer definition is changed; now it returns the WoMan
buffer but does not switch to it by default. We directly switch to the
WoMan buffer only if `WoMan-find-buffer` is given a non-nil argument.
- WoMan-previous-manpage and WoMan-next-manpage now do not result in new
window pops. We now switch to prev/next manpage in the same window.
---
lisp/woman.el | 189
++++++++++++++++++++++++++++++++--------------------------
1 file changed, 103 insertions(+), 86 deletions(-)
mode change 100644 => 100755 lisp/woman.el
diff --git a/lisp/woman.el b/lisp/woman.el
index 28a4798..f171ac2
--- a/lisp/woman.el
+++ b/lisp/woman.el
@@ -1601,32 +1601,38 @@ woman-find-file
(interactive "fBrowse UN*X manual file: \nP")
(setq woman-last-file-name
(setq file-name (expand-file-name file-name))) ; to canonicalize
- (let ((alist-tail woman-buffer-alist) exists)
+ (let ((alist-tail woman-buffer-alist)
+ woman-buffer
+ exists)
(setq woman-buffer-number 0)
(while (and alist-tail (not (string= file-name (car (car
alist-tail)))))
(setq alist-tail (cdr alist-tail)
woman-buffer-number (1+ woman-buffer-number)))
- (or (and (setq exists
- (and alist-tail (WoMan-find-buffer))) ; buffer exists
- (not reformat))
- ;; Format new buffer or reformat current buffer:
- (let* ((bufname (file-name-nondirectory file-name))
- (case-fold-search t)
- (compressed
- (and (string-match-p woman-file-compression-regexp bufname) t)))
- (if compressed
- (setq bufname (file-name-sans-extension bufname)))
- (setq bufname (if exists
- (buffer-name)
- (woman-make-bufname bufname)))
- (woman-really-find-file file-name compressed bufname)
- (or exists
- (setq woman-buffer-alist
- (cons (cons file-name bufname) woman-buffer-alist)
- woman-buffer-number 0)))))
- (Man-build-section-alist)
- (Man-build-references-alist)
- (goto-char (point-min)))
+ (when alist-tail
+ (setq woman-buffer (WoMan-find-buffer)))
+ (setq exists (and alist-tail woman-buffer))
+ (or (and exists ; buffer exists
+ (not reformat))
+ ;; Format new buffer or reformat current buffer:
+ (let* ((bufname (file-name-nondirectory file-name))
+ (case-fold-search t)
+ (compressed
+ (and (string-match-p woman-file-compression-regexp
bufname) t)))
+ (if compressed
+ (setq bufname (file-name-sans-extension bufname)))
+ (setq bufname (if exists
+ (buffer-name)
+ (woman-make-bufname bufname)))
+ (woman-really-find-file file-name compressed bufname)
+ (or exists
+ (setq woman-buffer-alist
+ (cons (cons file-name bufname) woman-buffer-alist)
+ woman-buffer-number 0))))
+ (when woman-buffer
+ (with-current-buffer (get-buffer woman-buffer)
+ (Man-build-section-alist)
+ (Man-build-references-alist)
+ (goto-char (point-min))))))
(defun woman-make-bufname (bufname)
"Create an unambiguous buffer name from BUFNAME."
@@ -2032,13 +2038,13 @@ WoMan-previous-manpage
"Find the previous WoMan buffer."
;; Assumes currently in a WoMan buffer!
(interactive)
- (WoMan-find-buffer) ; find current existing buffer
+ (WoMan-find-buffer :switch) ; find current existing buffer
(if (null (cdr woman-buffer-alist))
(error "No previous WoMan buffer"))
(if (>= (setq woman-buffer-number (1+ woman-buffer-number))
- (length woman-buffer-alist))
+ (length woman-buffer-alist))
(setq woman-buffer-number 0))
- (if (WoMan-find-buffer)
+ (if (WoMan-find-buffer :switch)
()
(if (< (setq woman-buffer-number (1- woman-buffer-number)) 0)
(setq woman-buffer-number (1- (length woman-buffer-alist))))
@@ -2048,30 +2054,41 @@ WoMan-next-manpage
"Find the next WoMan buffer."
;; Assumes currently in a WoMan buffer!
(interactive)
- (WoMan-find-buffer) ; find current existing buffer
+ (WoMan-find-buffer :switch) ; find current existing buffer
(if (null (cdr woman-buffer-alist))
(error "No next WoMan buffer"))
(if (< (setq woman-buffer-number (1- woman-buffer-number)) 0)
(setq woman-buffer-number (1- (length woman-buffer-alist))))
- (if (WoMan-find-buffer)
+ (if (WoMan-find-buffer :switch)
()
(WoMan-next-manpage)))
-(defun WoMan-find-buffer ()
- "Switch to buffer corresponding to `woman-buffer-number' and return it.
+(defun WoMan-find-buffer (&optional switch)
+ "Display the buffer corresponding to `woman-buffer-number'.
+If SWITCH is non-nil, directly switch to the WoMan buffer using
+`switch-to-buffer' instead of `display-buffer'.
If such a buffer does not exist then remove its association from the
-alist in `woman-buffer-alist' and return nil."
+alist in `woman-buffer-alist' and return nil.
+Return the buffer otherwise."
(if (zerop woman-buffer-number)
(let ((buffer (get-buffer (cdr (car woman-buffer-alist)))))
(if buffer
- (display-buffer buffer)
+ (if switch
+ (switch-to-buffer buffer)
+ (progn
+ (display-buffer buffer)
+ buffer))
;; Delete alist element:
(setq woman-buffer-alist (cdr woman-buffer-alist))
nil))
(let* ((prev-ptr (nthcdr (1- woman-buffer-number) woman-buffer-alist))
(buffer (get-buffer (cdr (car (cdr prev-ptr))))))
(if buffer
- (display-buffer buffer)
+ (if switch
+ (switch-to-buffer buffer)
+ (progn
+ (display-buffer buffer)
+ buffer))
;; Delete alist element:
(setcdr prev-ptr (cdr (cdr prev-ptr)))
(if (>= woman-buffer-number (length woman-buffer-alist))
@@ -2137,12 +2154,12 @@ woman-decode-buffer
(let ((start-time (current-time))
time)
(message "WoMan formatting buffer...")
-; (goto-char (point-min))
-; (cond
-; ((re-search-forward "^\\.[ \t]*TH" nil t) ; wrong format if not found?
-; (beginning-of-line)
-; (delete-region (point-min) (point))) ; potentially dangerous!
-; (t (message "WARNING: .TH request not found -- not man-page format?")))
+ ;; (goto-char (point-min)) ; ; ;
+ ;; (cond ; ; ;
+ ;; ((re-search-forward "^\\.[ \t]*TH" nil t) ; wrong format if not
found? ; ; ;
+ ;; (beginning-of-line) ; ; ;
+ ;; (delete-region (point-min) (point))) ; potentially dangerous! ;
; ;
+ ;; (t (message "WARNING: .TH request not found -- not man-page
format?"))) ; ; ;
(woman-decode-region (point-min) (point-max))
(setq time (float-time (time-since start-time)))
(message "WoMan formatting buffer...done in %g seconds" time)
@@ -2259,7 +2276,7 @@ woman-decode-region
(setq-local adaptive-fill-mode nil) ; No special "%" "#" etc filling.
- ;; Set syntax and display tables:
+ ;; Set syntax and display tables:
(set-syntax-table woman-syntax-table)
(woman-set-buffer-display-table)
@@ -2335,8 +2352,8 @@ woman-decode-region
(woman-strings)
;; Special chars moved after translation in
;; `woman2-process-escapes' (for pic.1):
-; (goto-char from)
-; (woman-special-characters)
+ ;; (goto-char from) ; ;
+ ;; (woman-special-characters) ; ;
;; Process standard font-change requests and escapes:
(goto-char from)
@@ -2875,7 +2892,7 @@ woman-strings
(let ((beg (match-beginning 0)))
(woman-match-name)
(let* ((stringname (match-string 0))
- (string (assoc stringname woman-string-alist)))
+ (string (assoc stringname woman-string-alist)))
(cond (string
(delete-region beg (point))
;; Temporary hack in case string starts with a
@@ -2884,7 +2901,7 @@ woman-strings
(insert-before-markers (cdr string)))
(t
(WoMan-warn "Undefined string %s not interpolated!"
- stringname)
+ stringname)
(cond (woman-ignore
;; Output above message once only per call
(delete-region beg (point))
@@ -3050,10 +3067,10 @@ woman1-roff-buffer
;; (woman1-unquote is used by called function):
(setq woman1-unquote (not (eolp)))
(if (eolp) (delete-char 1))
-; ;; Hide leading control character in unquoted argument:
-; (cond ((memq (following-char) '(?. ?'))
-; (insert "\\&")
-; (beginning-of-line)))
+ ;; ;; Hide leading control character in unquoted argument:
+ ;; (cond ((memq (following-char) '(?. ?'))
+ ;; (insert "\\&")
+ ;; (beginning-of-line)))
;; Call the appropriate function:
(funcall fn)
;; Hide leading control character in quoted argument (only):
@@ -3107,15 +3124,15 @@ woman1-IB
(woman1-alt-fonts (list "\\fI" "\\fB")))
(defun woman1-IR ()
- ".IR -- Join words of current line alternating italic and Roman fonts."
- (woman1-alt-fonts (list "\\fI" "\\fR")))
+ ".IR -- Join words of current line alternating italic and Roman fonts."
+ (woman1-alt-fonts (list "\\fI" "\\fR")))
(defun woman1-RB ()
- ".RB -- Join words of current line alternating Roman and bold fonts."
+ ".RB -- Join words of current line alternating Roman and bold fonts."
(woman1-alt-fonts (list "\\fR" "\\fB")))
(defun woman1-RI ()
- ".RI -- Join words of current line alternating Roman and italic fonts."
+ ".RI -- Join words of current line alternating Roman and italic fonts."
(woman1-alt-fonts (list "\\fR" "\\fI")))
(defun woman1-alt-fonts (fonts)
@@ -3202,7 +3219,7 @@ woman1-hc
".hc c -- Set hyphenation character to c, i.e. delete it!"
(let ((c (char-to-string (following-char))))
;; (WoMan-log
- ;; "Hyphenation character %s deleted -- hyphenation not supported!" c)
+ ;; "Hyphenation character %s deleted -- hyphenation not supported!" c)
(woman-delete-whole-line)
(setq c (concat "\\(" c "\\)\\|^[.'][ \t]*hc"))
(save-excursion
@@ -3220,27 +3237,27 @@ woman1-hw
(put 'woman1-ps 'notfont t)
(defalias 'woman1-ps 'woman-delete-whole-line)
- ;; .ps -- Point size -- IGNORE!
+;; .ps -- Point size -- IGNORE!
(put 'woman1-ss 'notfont t)
(defalias 'woman1-ss 'woman-delete-whole-line)
- ;; .ss -- Space-character size -- IGNORE!
+;; .ss -- Space-character size -- IGNORE!
(put 'woman1-cs 'notfont t)
(defalias 'woman1-cs 'woman-delete-whole-line)
- ;; .cs -- Constant character space (width) mode -- IGNORE!
+;; .cs -- Constant character space (width) mode -- IGNORE!
(put 'woman1-ne 'notfont t)
(defalias 'woman1-ne 'woman-delete-whole-line)
- ;; .ne -- Need vertical space -- IGNORE!
+;; .ne -- Need vertical space -- IGNORE!
(put 'woman1-vs 'notfont t)
(defalias 'woman1-vs 'woman-delete-whole-line)
- ;; .vs -- Vertical base line spacing -- IGNORE!
+;; .vs -- Vertical base line spacing -- IGNORE!
(put 'woman1-bd 'notfont t)
(defalias 'woman1-bd 'woman-delete-whole-line)
- ;; .bd -- Embolden font -- IGNORE!
+;; .bd -- Embolden font -- IGNORE!
;;; Non-breaking SunOS-specific macros:
@@ -3251,7 +3268,7 @@ woman1-TX
(put 'woman1-IX 'notfont t)
(defalias 'woman1-IX 'woman-delete-whole-line)
- ;; .IX -- Index macro, for Sun internal use -- IGNORE!
+;; .IX -- Index macro, for Sun internal use -- IGNORE!
;;; Direct font selection:
@@ -3552,14 +3569,14 @@ woman-parse-numeric-arg
(if (> (woman-parse-numeric-value) 0) 1 0))
)))
))
-; (if (looking-at "[ \t\nRC)\"]") ; R, C are tab types
-; ()
-; (WoMan-warn "Unimplemented numerical operator `%c' in %s"
-; (following-char)
-; (buffer-substring
-; (line-beginning-position)
-; (line-end-position)))
-; (skip-syntax-forward "^ "))
+ ;; (if (looking-at "[ \t\nRC)\"]") ; R, C are tab types
+ ;; ()
+ ;; (WoMan-warn "Unimplemented numerical operator `%c' in %s"
+ ;; (following-char)
+ ;; (buffer-substring
+ ;; (line-beginning-position)
+ ;; (line-end-position)))
+ ;; (skip-syntax-forward "^ "))
value
))
@@ -3700,16 +3717,16 @@ woman2-roff-buffer
(beginning-of-line) (woman-delete-line 1))
(t (end-of-line) (insert ?\n))
)
- (if (not (or fn
- (and (not (memq (following-char) '(?. ?')))
- (setq fn 'woman2-format-paragraphs))))
- ()
- ;; Find next control line:
- (if (equal woman-request "TS")
- (set-marker to (woman-find-next-control-line "TE"))
- (set-marker to (woman-find-next-control-line)))
- ;; Call the appropriate function:
- (funcall fn to)))
+ (if (not (or fn
+ (and (not (memq (following-char) '(?. ?')))
+ (setq fn 'woman2-format-paragraphs))))
+ ()
+ ;; Find next control line:
+ (if (equal woman-request "TS")
+ (set-marker to (woman-find-next-control-line "TE"))
+ (set-marker to (woman-find-next-control-line)))
+ ;; Call the appropriate function:
+ (funcall fn to)))
(if (not (eobp)) ; This should not happen, but ...
(woman2-format-paragraphs (copy-marker (point-max) t)
woman-left-margin))
@@ -4312,13 +4329,13 @@ woman-set-arg
(if previous (set previous (eval arg)))
(woman2-process-escapes-to-eol 'numeric)
(let ((pm (if (looking-at "[+-]")
- (prog1 (following-char)
- (forward-char 1))))
- (i (woman-parse-numeric-arg)))
- (cond ((null pm) (set arg i))
- ((= pm ?+) (set arg (+ (eval arg) i)))
- ((= pm ?-) (set arg (- (eval arg) i)))
- ))
+ (prog1 (following-char)
+ (forward-char 1))))
+ (i (woman-parse-numeric-arg)))
+ (cond ((null pm) (set arg i))
+ ((= pm ?+) (set arg (+ (eval arg) i)))
+ ((= pm ?-) (set arg (- (eval arg) i)))
+ ))
(beginning-of-line))
(woman-delete-line 1)) ; ignore any remaining arguments
@@ -4515,8 +4532,8 @@ woman2-TS
(woman2-format-paragraphs to))
(defalias 'woman2-TE 'woman2-fi)
- ;; ".TE -- End of table code for the tbl processor."
- ;; Turn filling and adjusting back on.
+;; ".TE -- End of table code for the tbl processor."
+;; Turn filling and adjusting back on.
(defun woman-break-table (start-column to start)
(while (< (point) to)
--
2.6.0.rc0.24.gec371ff
I used this little snippet (saved to test.el) and then running "emacs -Q
--load=test.el" to test the above. "C-c 0" would load the patched woman.el
and then it is self explanatory how I would have used the test.el.
=====
(global-set-key (kbd "C-c 0") (lambda ()
(interactive)
(load-file
"/path/to/the/patched/woman.el")))
(global-set-key (kbd "C-c 1") (lambda () (interactive) (woman "timelocal")))
(global-set-key (kbd "C-c 2") (lambda () (interactive) (woman "timezone")))
(global-set-key (kbd "C-c 3") (lambda () (interactive) (woman "acos")))
(global-set-key (kbd "C-c p") #'WoMan-previous-manpage)
(global-set-key (kbd "C-c n") #'WoMan-next-manpage)
=====
[-- Attachment #2: Type: text/html, Size: 28218 bytes --]
next prev parent reply other threads:[~2016-02-04 5:41 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-08 18:24 bug#22332: 25.0.50; woman moves point in a wrong buffer Ari Roponen
2016-01-09 9:25 ` martin rudalics
2016-01-09 16:36 ` Kaushal Modi
2016-01-09 16:54 ` martin rudalics
2016-01-09 17:19 ` Kaushal Modi
2016-01-09 17:29 ` Ari Roponen
2016-01-09 17:42 ` martin rudalics
2016-01-09 22:32 ` Kaushal Modi
2016-01-10 10:53 ` martin rudalics
2016-02-04 5:41 ` Kaushal Modi [this message]
2016-02-04 7:55 ` martin rudalics
2016-02-04 8:44 ` Ari Roponen
2016-02-04 16:36 ` Kaushal Modi
2016-02-18 16:20 ` Kaushal Modi
2016-02-20 2:41 ` John Wiegley
2016-02-20 6:17 ` Lars Ingebrigtsen
2016-02-20 7:58 ` Lars Ingebrigtsen
2016-01-09 17:42 ` martin rudalics
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='CAFyQvY1bS+_hZOm8w-56rBS92AKC=8L8STuDamNwBvy5nBdObw@mail.gmail.com' \
--to=kaushal.modi@gmail.com \
--cc=22332@debbugs.gnu.org \
--cc=ari.roponen@gmail.com \
--cc=rudalics@gmx.at \
/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).