unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [Patch] reformat man buffer on the fly for man.el
@ 2013-10-25  6:28 Darren Hoo
  2013-10-29 20:34 ` Stefan Monnier
  2013-11-08  4:11 ` [Patch] reformat man buffer on the fly for man.el Stefan Monnier
  0 siblings, 2 replies; 11+ messages in thread
From: Darren Hoo @ 2013-10-25  6:28 UTC (permalink / raw)
  To: emacs-devel


Hi All,

As man works by invoking the man command background, it is not easy to
figure out how wide the buffer is going to be displayed, so the width
guess is not always correct, eg, when there's only one window on the
current frame and man is first run, while it pops to the man buffer by
split-window-right, the lines in the man buffer is longer than the width
of the new window. 

This is not convenient when reading the man page side by side or when
the window is resized. Thus I added function Man-update-manpage, any
comments on the following patch?


--8<---------------cut here---------------start------------->8---
diff --git a/lisp/man.el b/lisp/man.el
index 5619803..bceba6f 100644
--- a/lisp/man.el
+++ b/lisp/man.el
@@ -441,6 +441,7 @@ Otherwise, the value is whatever the function
     (define-key map "s"    'Man-goto-see-also-section)
     (define-key map "k"    'Man-kill)
     (define-key map "q"    'Man-quit)
+    (define-key map "u"    'Man-update-manpage)
     (define-key map "m"    'man)
     ;; Not all the man references get buttons currently.  The text in the
     ;; manual page can contain references to other man pages
@@ -971,6 +972,54 @@ names or descriptions.  The pattern argument is usually an
       (error "No item under point")
     (man man-args)))
 
+(defmacro Man-start-calling (&rest body)
+  "Start the man command in `body' after setting up the environment"
+  `(let ((process-environment (copy-sequence process-environment))
+	;; The following is so Awk script gets \n intact
+	;; But don't prevent decoding of the outside.
+	(coding-system-for-write 'raw-text-unix)
+	;; We must decode the output by a coding system that the
+	;; system's locale suggests in multibyte mode.
+	(coding-system-for-read
+	 (if (default-value 'enable-multibyte-characters)
+	     locale-coding-system 'raw-text-unix))
+	;; Avoid possible error by using a directory that always exists.
+	(default-directory
+	  (if (and (file-directory-p default-directory)
+		   (not (find-file-name-handler default-directory
+						'file-directory-p)))
+	      default-directory
+	    "/")))
+    ;; Prevent any attempt to use display terminal fanciness.
+    (setenv "TERM" "dumb")
+    ;; In Debian Woody, at least, we get overlong lines under X
+    ;; unless COLUMNS or MANWIDTH is set.  This isn't a problem on
+    ;; a tty.  man(1) says:
+    ;;        MANWIDTH
+    ;;               If $MANWIDTH is set, its value is used as the  line
+    ;;               length  for which manual pages should be formatted.
+    ;;               If it is not set, manual pages  will  be  formatted
+    ;;               with  a line length appropriate to the current ter-
+    ;;               minal (using an ioctl(2) if available, the value of
+    ;;               $COLUMNS,  or falling back to 80 characters if nei-
+    ;;               ther is available).
+    (when (or window-system
+	      (not (or (getenv "MANWIDTH") (getenv "COLUMNS"))))
+      ;; This isn't strictly correct, since we don't know how
+      ;; the page will actually be displayed, but it seems
+      ;; reasonable.
+      (setenv "COLUMNS" (number-to-string
+			 (cond
+			  ((and (integerp Man-width) (> Man-width 0))
+			   Man-width)
+			  (Man-width (frame-width))
+			  ((window-width))))))
+    ;; Since man-db 2.4.3-1, man writes plain text with no escape
+    ;; sequences when stdout is not a tty.	In 2.5.0, the following
+    ;; env-var was added to allow control of this (see Debian Bug#340673).
+    (setenv "MAN_KEEP_FORMATTING" "1")
+    ,@body))
+
 (defun Man-getpage-in-background (topic)
   "Use TOPIC to build and fire off the manpage and cleaning command.
 Return the buffer in which the manpage will appear."
@@ -986,51 +1035,8 @@ Return the buffer in which the manpage will appear."
 	(setq buffer-undo-list t)
 	(setq Man-original-frame (selected-frame))
 	(setq Man-arguments man-args))
-      (let ((process-environment (copy-sequence process-environment))
-	    ;; The following is so Awk script gets \n intact
-	    ;; But don't prevent decoding of the outside.
-	    (coding-system-for-write 'raw-text-unix)
-	    ;; We must decode the output by a coding system that the
-	    ;; system's locale suggests in multibyte mode.
-	    (coding-system-for-read
-	     (if (default-value 'enable-multibyte-characters)
-		 locale-coding-system 'raw-text-unix))
-	    ;; Avoid possible error by using a directory that always exists.
-	    (default-directory
-	      (if (and (file-directory-p default-directory)
-		       (not (find-file-name-handler default-directory
-						    'file-directory-p)))
-		  default-directory
-		"/")))
-	;; Prevent any attempt to use display terminal fanciness.
-	(setenv "TERM" "dumb")
-	;; In Debian Woody, at least, we get overlong lines under X
-	;; unless COLUMNS or MANWIDTH is set.  This isn't a problem on
-	;; a tty.  man(1) says:
-	;;        MANWIDTH
-	;;               If $MANWIDTH is set, its value is used as the  line
-	;;               length  for which manual pages should be formatted.
-	;;               If it is not set, manual pages  will  be  formatted
-	;;               with  a line length appropriate to the current ter-
-	;;               minal (using an ioctl(2) if available, the value of
-	;;               $COLUMNS,  or falling back to 80 characters if nei-
-	;;               ther is available).
-	(when (or window-system
-                  (not (or (getenv "MANWIDTH") (getenv "COLUMNS"))))
-	  ;; This isn't strictly correct, since we don't know how
-	  ;; the page will actually be displayed, but it seems
-	  ;; reasonable.
-	  (setenv "COLUMNS" (number-to-string
-			     (cond
-			      ((and (integerp Man-width) (> Man-width 0))
-			       Man-width)
-			      (Man-width (frame-width))
-			      ((window-width))))))
-	;; Since man-db 2.4.3-1, man writes plain text with no escape
-	;; sequences when stdout is not a tty.	In 2.5.0, the following
-	;; env-var was added to allow control of this (see Debian Bug#340673).
-	(setenv "MAN_KEEP_FORMATTING" "1")
-	(if (fboundp 'start-process)
+      (Man-start-calling
+       (if (fboundp 'start-process)
 	    (set-process-sentinel
 	     (start-process manual-program buffer
 			    (if (memq system-type '(cygwin windows-nt))
@@ -1052,7 +1058,34 @@ Return the buffer in which the manpage will appear."
 				   exit-status)))
 		(setq msg exit-status))
 	    (Man-bgproc-sentinel bufname msg)))))
-    buffer))
+      buffer))
+
+(defun Man-update-manpage ()
+  "Reformat current manpage by calling the man command again synchronously."
+  (interactive)
+  (when (eq Man-arguments nil)
+    ;;this shouldn't happen unless it is not in a Man buffer."
+    (error "Man-arguments not initialized"))
+  (let ((old-pos (point))
+	(text (current-word))
+	(old-size (buffer-size)) 
+	(inhibit-read-only t)
+	(buffer-read-only nil))
+     (erase-buffer)
+     (Man-start-calling
+      (call-process shell-file-name nil (list (current-buffer) nil) nil
+		    shell-command-switch
+		    (format (Man-build-man-command) Man-arguments)))
+     (if Man-fontify-manpage-flag
+	 (Man-fontify-manpage)
+       (Man-cleanup-manpage))
+     (goto-char old-pos)
+     ;;restore the point, not strictly right.
+     (unless (or (eq text nil) (= old-size (buffer-size)))
+       (let ((case-fold-search nil))
+	 (if (> old-size (buffer-size))
+	     (search-backward text nil t))
+	 (search-forward text nil t)))))
 
 (defun Man-notify-when-ready (man-buffer)
   "Notify the user when MAN-BUFFER is ready.
--8<---------------cut here---------------end--------------->8---





^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2013-11-08  4:11 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-25  6:28 [Patch] reformat man buffer on the fly for man.el Darren Hoo
2013-10-29 20:34 ` Stefan Monnier
2013-10-30  4:24   ` Darren Hoo
2013-10-30 12:27     ` Stefan Monnier
2013-10-31 14:07       ` Xue Fuqiao
2013-10-31 16:28         ` Glenn Morris
2013-10-31 17:20           ` Eli Zaretskii
2013-10-31 17:37             ` DOS versions [was Re: [Patch] reformat man buffer on the fly for man.el] Glenn Morris
2013-10-31 18:08               ` Eli Zaretskii
2013-10-31 23:05               ` Xue Fuqiao
2013-11-08  4:11 ` [Patch] reformat man buffer on the fly for man.el Stefan Monnier

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).