emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Patch] reformat man buffer on the fly for man.el


From: Darren Hoo
Subject: [Patch] reformat man buffer on the fly for man.el
Date: Fri, 25 Oct 2013 14:28:23 +0800
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (darwin)

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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]