aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuri Linkov2004-09-01 19:29:28 +0000
committerJuri Linkov2004-09-01 19:29:28 +0000
commit0b02cda944925610e955e59438165ff9116858d6 (patch)
treed4460d5a8af4ddfab70dfb2f5644b740d3cf5674
parent8b3094c7c622d3420a9e6ca0f82792954a3d00be (diff)
downloademacs-0b02cda944925610e955e59438165ff9116858d6.tar.gz
emacs-0b02cda944925610e955e59438165ff9116858d6.zip
(Info-search-whitespace-regexp): Fix backslashes.
(Info-search): Add new optional arguments for the sake of isearch. Replace whitespace in Info-search-whitespace-regexp literally. Add backward search. Don't call `Info-select-node' if regexp is found in the same Info node. Don't add node to Info-history for wrapped isearch. (Info-search-backward, Info-isearch-search, Info-isearch-wrap) (Info-isearch-push-state, Info-isearch-pop-state): New funs. (Info-mode): Set local variables `isearch-search-fun-function', `isearch-wrap-function', `isearch-push-state-function', `search-whitespace-regexp'.
-rw-r--r--lisp/info.el120
1 files changed, 100 insertions, 20 deletions
diff --git a/lisp/info.el b/lisp/info.el
index 43e1dafcc6f..13bf3901d6d 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -188,7 +188,7 @@ file, so be prepared for a few surprises if you enable this feature."
188 :type 'boolean 188 :type 'boolean
189 :group 'info) 189 :group 'info)
190 190
191(defcustom Info-search-whitespace-regexp "\\\\(?:\\\\s-+\\\\)" 191(defcustom Info-search-whitespace-regexp "\\(?:\\s-+\\)"
192 "*If non-nil, regular expression to match a sequence of whitespace chars. 192 "*If non-nil, regular expression to match a sequence of whitespace chars.
193This applies to Info search for regular expressions. 193This applies to Info search for regular expressions.
194You might want to use something like \"[ \\t\\r\\n]+\" instead. 194You might want to use something like \"[ \\t\\r\\n]+\" instead.
@@ -1442,8 +1442,9 @@ If FORK is a string, it is the name to use for the new buffer."
1442(defvar Info-search-case-fold nil 1442(defvar Info-search-case-fold nil
1443 "The value of `case-fold-search' from previous `Info-search' command.") 1443 "The value of `case-fold-search' from previous `Info-search' command.")
1444 1444
1445(defun Info-search (regexp) 1445(defun Info-search (regexp &optional bound noerror count direction)
1446 "Search for REGEXP, starting from point, and select node it's found in." 1446 "Search for REGEXP, starting from point, and select node it's found in.
1447If DIRECTION is `backward', search in the reverse direction."
1447 (interactive (list (read-string 1448 (interactive (list (read-string
1448 (if Info-search-history 1449 (if Info-search-history
1449 (format "Regexp search%s (default `%s'): " 1450 (format "Regexp search%s (default `%s'): "
@@ -1458,31 +1459,42 @@ If FORK is a string, it is the name to use for the new buffer."
1458 (setq regexp (car Info-search-history))) 1459 (setq regexp (car Info-search-history)))
1459 (when regexp 1460 (when regexp
1460 (let (found beg-found give-up 1461 (let (found beg-found give-up
1462 (backward (eq direction 'backward))
1461 (onode Info-current-node) 1463 (onode Info-current-node)
1462 (ofile Info-current-file) 1464 (ofile Info-current-file)
1463 (opoint (point)) 1465 (opoint (point))
1466 (opoint-min (point-min))
1467 (opoint-max (point-max))
1464 (ostart (window-start)) 1468 (ostart (window-start))
1465 (osubfile Info-current-subfile)) 1469 (osubfile Info-current-subfile))
1466 (when Info-search-whitespace-regexp 1470 (when Info-search-whitespace-regexp
1467 (setq regexp (replace-regexp-in-string 1471 (setq regexp
1468 "[ \t\n]+" Info-search-whitespace-regexp regexp))) 1472 (mapconcat 'identity (split-string regexp "[ \t\n]+")
1473 Info-search-whitespace-regexp)))
1469 (setq Info-search-case-fold case-fold-search) 1474 (setq Info-search-case-fold case-fold-search)
1470 (save-excursion 1475 (save-excursion
1471 (save-restriction 1476 (save-restriction
1472 (widen) 1477 (widen)
1473 (while (and (not give-up) 1478 (while (and (not give-up)
1474 (or (null found) 1479 (or (null found)
1475 (isearch-range-invisible beg-found found))) 1480 (if backward
1476 (if (re-search-forward regexp nil t) 1481 (isearch-range-invisible found beg-found)
1477 (setq found (point) beg-found (match-beginning 0)) 1482 (isearch-range-invisible beg-found found))))
1483 (if (if backward
1484 (re-search-backward regexp bound t)
1485 (re-search-forward regexp bound t))
1486 (setq found (point) beg-found (if backward (match-end 0)
1487 (match-beginning 0)))
1478 (setq give-up t))))) 1488 (setq give-up t)))))
1479 ;; If no subfiles, give error now. 1489 ;; If no subfiles, give error now.
1480 (if give-up 1490 (if give-up
1481 (if (null Info-current-subfile) 1491 (if (null Info-current-subfile)
1482 (re-search-forward regexp) 1492 (if backward
1493 (re-search-backward regexp)
1494 (re-search-forward regexp))
1483 (setq found nil))) 1495 (setq found nil)))
1484 1496
1485 (unless found 1497 (unless (or found bound)
1486 (unwind-protect 1498 (unwind-protect
1487 ;; Try other subfiles. 1499 ;; Try other subfiles.
1488 (let ((list ())) 1500 (let ((list ()))
@@ -1498,29 +1510,39 @@ If FORK is a string, it is the name to use for the new buffer."
1498 ;; Find the subfile we just searched. 1510 ;; Find the subfile we just searched.
1499 (search-forward (concat "\n" osubfile ": ")) 1511 (search-forward (concat "\n" osubfile ": "))
1500 ;; Skip that one. 1512 ;; Skip that one.
1501 (forward-line 1) 1513 (forward-line (if backward 0 1))
1502 ;; Make a list of all following subfiles. 1514 ;; Make a list of all following subfiles.
1503 ;; Each elt has the form (VIRT-POSITION . SUBFILENAME). 1515 ;; Each elt has the form (VIRT-POSITION . SUBFILENAME).
1504 (while (not (eobp)) 1516 (while (not (if backward (bobp) (eobp)))
1505 (re-search-forward "\\(^.*\\): [0-9]+$") 1517 (if backward
1518 (re-search-backward "\\(^.*\\): [0-9]+$")
1519 (re-search-forward "\\(^.*\\): [0-9]+$"))
1506 (goto-char (+ (match-end 1) 2)) 1520 (goto-char (+ (match-end 1) 2))
1507 (setq list (cons (cons (+ (point-min) 1521 (setq list (cons (cons (+ (point-min)
1508 (read (current-buffer))) 1522 (read (current-buffer)))
1509 (match-string-no-properties 1)) 1523 (match-string-no-properties 1))
1510 list)) 1524 list))
1511 (goto-char (1+ (match-end 0)))) 1525 (goto-char (if backward
1526 (1- (match-beginning 0))
1527 (1+ (match-end 0)))))
1512 ;; Put in forward order 1528 ;; Put in forward order
1513 (setq list (nreverse list)))) 1529 (setq list (nreverse list))))
1514 (while list 1530 (while list
1515 (message "Searching subfile %s..." (cdr (car list))) 1531 (message "Searching subfile %s..." (cdr (car list)))
1516 (Info-read-subfile (car (car list))) 1532 (Info-read-subfile (car (car list)))
1533 (if backward (goto-char (point-max)))
1517 (setq list (cdr list)) 1534 (setq list (cdr list))
1518 (setq give-up nil found nil) 1535 (setq give-up nil found nil)
1519 (while (and (not give-up) 1536 (while (and (not give-up)
1520 (or (null found) 1537 (or (null found)
1521 (isearch-range-invisible beg-found found))) 1538 (if backward
1522 (if (re-search-forward regexp nil t) 1539 (isearch-range-invisible found beg-found)
1523 (setq found (point) beg-found (match-beginning 0)) 1540 (isearch-range-invisible beg-found found))))
1541 (if (if backward
1542 (re-search-backward regexp nil t)
1543 (re-search-forward regexp nil t))
1544 (setq found (point) beg-found (if backward (match-end 0)
1545 (match-beginning 0)))
1524 (setq give-up t))) 1546 (setq give-up t)))
1525 (if give-up 1547 (if give-up
1526 (setq found nil)) 1548 (setq found nil))
@@ -1534,12 +1556,20 @@ If FORK is a string, it is the name to use for the new buffer."
1534 (goto-char opoint) 1556 (goto-char opoint)
1535 (Info-select-node) 1557 (Info-select-node)
1536 (set-window-start (selected-window) ostart))))) 1558 (set-window-start (selected-window) ostart)))))
1537 (widen) 1559
1538 (goto-char found) 1560 (if (and (string= osubfile Info-current-subfile)
1539 (Info-select-node) 1561 (> found opoint-min)
1562 (< found opoint-max))
1563 ;; Search landed in the same node
1564 (goto-char found)
1565 (widen)
1566 (goto-char found)
1567 (save-match-data (Info-select-node)))
1568
1540 ;; Use string-equal, not equal, to ignore text props. 1569 ;; Use string-equal, not equal, to ignore text props.
1541 (or (and (string-equal onode Info-current-node) 1570 (or (and (string-equal onode Info-current-node)
1542 (equal ofile Info-current-file)) 1571 (equal ofile Info-current-file))
1572 (and isearch-mode isearch-wrapped (eq opoint opoint-min))
1543 (setq Info-history (cons (list ofile onode opoint) 1573 (setq Info-history (cons (list ofile onode opoint)
1544 Info-history)))))) 1574 Info-history))))))
1545 1575
@@ -1556,6 +1586,48 @@ If FORK is a string, it is the name to use for the new buffer."
1556 (if Info-search-history 1586 (if Info-search-history
1557 (Info-search (car Info-search-history)) 1587 (Info-search (car Info-search-history))
1558 (call-interactively 'Info-search)))) 1588 (call-interactively 'Info-search))))
1589
1590(defun Info-search-backward (regexp &optional bound noerror count)
1591 "Search for REGEXP in the reverse direction."
1592 (interactive (list (read-string
1593 (if Info-search-history
1594 (format "Regexp search%s backward (default `%s'): "
1595 (if case-fold-search "" " case-sensitively")
1596 (car Info-search-history))
1597 (format "Regexp search%s backward: "
1598 (if case-fold-search "" " case-sensitively")))
1599 nil 'Info-search-history)))
1600 (Info-search regexp bound noerror count 'backward))
1601
1602(defun Info-isearch-search ()
1603 (cond
1604 (isearch-word
1605 (if isearch-forward 'word-search-forward 'word-search-backward))
1606 (isearch-regexp
1607 (lambda (regexp bound noerror)
1608 (condition-case nil
1609 (progn
1610 (Info-search regexp bound noerror nil
1611 (unless isearch-forward 'backward))
1612 (point))
1613 (error nil))))
1614 (t
1615 (if isearch-forward 'search-forward 'search-backward))))
1616
1617(defun Info-isearch-wrap ()
1618 (if isearch-regexp
1619 (if isearch-forward (Info-top-node) (Info-final-node))
1620 (goto-char (if isearch-forward (point-min) (point-max)))))
1621
1622(defun Info-isearch-push-state ()
1623 `(lambda (cmd)
1624 (Info-isearch-pop-state cmd ,Info-current-file ,Info-current-node)))
1625
1626(defun Info-isearch-pop-state (cmd file node)
1627 (or (and (string= Info-current-file file)
1628 (string= Info-current-node node))
1629 (progn (Info-find-node file node) (sit-for 0))))
1630
1559 1631
1560(defun Info-extract-pointer (name &optional errorname) 1632(defun Info-extract-pointer (name &optional errorname)
1561 "Extract the value of the node-pointer named NAME. 1633 "Extract the value of the node-pointer named NAME.
@@ -3064,6 +3136,14 @@ Advanced commands:
3064 (setq desktop-save-buffer 'Info-desktop-buffer-misc-data) 3136 (setq desktop-save-buffer 'Info-desktop-buffer-misc-data)
3065 (add-hook 'clone-buffer-hook 'Info-clone-buffer-hook nil t) 3137 (add-hook 'clone-buffer-hook 'Info-clone-buffer-hook nil t)
3066 (add-hook 'change-major-mode-hook 'font-lock-defontify nil t) 3138 (add-hook 'change-major-mode-hook 'font-lock-defontify nil t)
3139 (set (make-local-variable 'isearch-search-fun-function)
3140 'Info-isearch-search)
3141 (set (make-local-variable 'isearch-wrap-function)
3142 'Info-isearch-wrap)
3143 (set (make-local-variable 'isearch-push-state-function)
3144 'Info-isearch-push-state)
3145 (set (make-local-variable 'search-whitespace-regexp)
3146 Info-search-whitespace-regexp)
3067 (Info-set-mode-line) 3147 (Info-set-mode-line)
3068 (run-hooks 'Info-mode-hook)) 3148 (run-hooks 'Info-mode-hook))
3069 3149