emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] master f946402: Handle more subprocess chunking in M-x man


From: Noam Postavsky
Subject: [Emacs-diffs] master f946402: Handle more subprocess chunking in M-x man (Bug#36927)
Date: Sun, 18 Aug 2019 18:29:56 -0400 (EDT)

branch: master
commit f9464020d403be8344f8293297b27276872571d4
Author: Noam Postavsky <address@hidden>
Commit: Noam Postavsky <address@hidden>

    Handle more subprocess chunking in M-x man (Bug#36927)
    
    * lisp/man.el (Man-bgproc-filter): Make sure not to chop man sections
    by narrowing.
    (Man-highlight-references0): Revert previous fix, as it's no longer
    needed.
    * test/lisp/man-tests.el (man-tests-filter-strings): New function.
    (man-bgproc-filter-buttonize-includes): New test.
---
 lisp/man.el            | 20 ++++----------------
 test/lisp/man-tests.el | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+), 16 deletions(-)

diff --git a/lisp/man.el b/lisp/man.el
index 89d5144..cef3d59 100644
--- a/lisp/man.el
+++ b/lisp/man.el
@@ -1296,21 +1296,7 @@ default type, `Man-xref-man-page' is used for the 
buttons."
   ;; Based on `Man-build-references-alist'
   (when (or (null start-section)        ;; Search regardless of sections.
             ;; Section header is in this chunk.
-           (Man-find-section start-section)
-            ;; Section header was in one of the previous chunks.
-            (save-excursion
-              (save-restriction
-                (let ((orig-pos (point)))
-                  (widen)
-                  (if (Man-find-section start-section)
-                      ;; We are in the right section of the next
-                      ;; section is either not yet in the buffer, or
-                      ;; it starts after the position where we should
-                      ;; start highlighting.
-                      (progn
-                        (forward-line 1)
-                        (or (null (re-search-forward Man-heading-regexp nil t))
-                            (> (point) orig-pos))))))))
+            (Man-find-section start-section))
     (let ((end (if start-section
                   (progn
                     (forward-line 1)
@@ -1384,7 +1370,9 @@ command is run.  Second argument STRING is the entire 
string of output."
                (narrow-to-region
                 (save-excursion
                   (goto-char beg)
-                  (line-beginning-position))
+                   ;; Process whole sections (Bug#36927).
+                   (Man-previous-section 1)
+                   (point))
                 (point))
                (if Man-fontify-manpage-flag
                    (Man-fontify-manpage)
diff --git a/test/lisp/man-tests.el b/test/lisp/man-tests.el
index dca0ff1..9932e03 100644
--- a/test/lisp/man-tests.el
+++ b/test/lisp/man-tests.el
@@ -24,6 +24,7 @@
 
 (require 'ert)
 (require 'man)
+(require 'seq)
 
 (defconst man-tests-parse-man-k-tests
   '(;; GNU/Linux: man-db-2.6.1
@@ -113,6 +114,53 @@ in the cdr of the element.")
   (dolist (test man-tests-parse-man-k-tests)
     (should (man-tests-parse-man-k-test-case test))))
 
+(defun man-tests-filter-strings (buffer strings)
+  "Run `Man-bgproc-filter' on each of STRINGS.
+The formatted result will be inserted into BUFFER."
+  (let ((proc (start-process "dummy man-tests proc" (current-buffer) "cat")))
+    (set-process-query-on-exit-flag proc nil)
+    (dolist (str strings)
+      (Man-bgproc-filter proc str))))
+
+(ert-deftest man-bgproc-filter-buttonize-includes ()
+  ;; Test with abridged version of printf man page (Bug#36927).
+  (let ((str "\
+PRINTF(3)              Linux Programmer's Manual             PRINTF(3)
+
+NAME
+       printf, fprintf, dprintf, sprintf, snprintf, vprintf, vfprintf,
+
+SYNOPSIS
+       #include <stdio.h>
+
+       int printf(const char *format, ...);
+
+       #include <stdarg.h>
+
+       int vsprintf(char *str, const char *format, va_list ap);
+
+DESCRIPTION
+       The functions in the printf() family produce  output  according\n"))
+    (with-temp-buffer
+      (dolist (chunks
+               (list
+                ;; Test a few different kinds of chunking.
+                (list str)
+                (seq-mapcat (lambda (line)
+                              (list line "\n"))
+                            (split-string str "\n"))
+                (mapcar #'string str)))
+        (erase-buffer)
+        (man-tests-filter-strings (current-buffer) chunks)
+        (goto-char (point-min))
+        (ert-info ((format "%S" chunks) :prefix "Input: ")
+          (search-forward "#include <stdio.h>")
+          (let ((button (button-at (match-beginning 0))))
+            (should (and button (eq 'Man-xref-header-file (button-type 
button)))))
+          (search-forward "#include <stdarg.h>")
+          (let ((button (button-at (match-beginning 0))))
+            (should (and button (eq 'Man-xref-header-file (button-type 
button))))))))))
+
 (provide 'man-tests)
 
 ;;; man-tests.el ends here



reply via email to

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