diff options
| author | Juri Linkov | 2004-09-01 19:29:28 +0000 |
|---|---|---|
| committer | Juri Linkov | 2004-09-01 19:29:28 +0000 |
| commit | 0b02cda944925610e955e59438165ff9116858d6 (patch) | |
| tree | d4460d5a8af4ddfab70dfb2f5644b740d3cf5674 | |
| parent | 8b3094c7c622d3420a9e6ca0f82792954a3d00be (diff) | |
| download | emacs-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.el | 120 |
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. |
| 193 | This applies to Info search for regular expressions. | 193 | This applies to Info search for regular expressions. |
| 194 | You might want to use something like \"[ \\t\\r\\n]+\" instead. | 194 | You 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. |
| 1447 | If 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 | ||