aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorCarsten Dominik <[email protected]>2005-01-26 08:28:31 +0000
committerCarsten Dominik <[email protected]>2005-01-26 08:28:31 +0000
commit0072e19e631a50efef487e02ac3434a429ddc8f6 (patch)
tree8cc6e92f6ac5e09998c2b643ec81a8264204301b /lisp
parent5d4ba9da90a6e4e401bc9b7dee2483049e84aea7 (diff)
* textmodes/reftex-global.el (reftex-isearch-push-state-function)
(reftex-isearch-pop-state-function, reftex-isearch-isearch-search) (reftex-isearch-switch-to-next-file, reftex-isearch-turn-off) (reftex-isearch-turn-on, reftex-isearch-minor-mode): New functions.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/textmodes/reftex-global.el126
1 files changed, 126 insertions, 0 deletions
diff --git a/lisp/textmodes/reftex-global.el b/lisp/textmodes/reftex-global.el
index d4d91b476e..d3ef2dcb78 100644
--- a/lisp/textmodes/reftex-global.el
+++ b/lisp/textmodes/reftex-global.el
@@ -338,5 +338,131 @@ Also checks if buffers visiting the files are in read-only mode."
(buffer-name buf)))
(error "Abort"))))))
+(defun reftex-isearch-wrap-function ()
+ (if (not isearch-word)
+ (switch-to-buffer
+ (funcall isearch-next-buffer-function (current-buffer) t)))
+ (goto-char (if isearch-forward (point-min) (point-max))))
+
+(defun reftex-isearch-push-state-function ()
+ `(lambda (cmd)
+ (reftex-isearch-pop-state-function cmd ,(current-buffer))))
+
+(defun reftex-isearch-pop-state-function (cmd buffer)
+ (switch-to-buffer buffer))
+
+(defun reftex-isearch-isearch-search (string bound noerror)
+ (let ((nxt-buff nil)
+ (search-fun
+ (cond
+ (isearch-word
+ (if isearch-forward 'word-search-forward 'word-search-backward))
+ (isearch-regexp
+ (if isearch-forward 're-search-forward 're-search-backward))
+ (t
+ (if isearch-forward 'search-forward 'search-backward)))))
+ (or
+ (funcall search-fun string bound noerror)
+ (unless bound
+ (condition-case nil
+ (when isearch-next-buffer-function
+ (while (not (funcall search-fun string bound noerror))
+ (cond
+ (isearch-forward
+ (setq nxt-buff
+ (funcall isearch-next-buffer-function
+ (current-buffer)))
+ (if (not nxt-buff)
+ (progn
+ (error "Wrap forward"))
+ (switch-to-buffer nxt-buff)
+ (goto-char (point-min))))
+ (t
+ (setq nxt-buff
+ (funcall isearch-next-buffer-function
+ (current-buffer)))
+ (if (not nxt-buff)
+ (progn
+ (error "Wrap backward"))
+ (switch-to-buffer nxt-buff)
+ (goto-char (point-max))))))
+ (point))
+ (error nil))))))
+
+;;; This function is called when isearch reaches the end of a
+;;; buffer. For reftex what we want to do is not wrap to the
+;;; beginning, but switch to the next buffer in the logical order of
+;;; the document. This function looks through list of files in the
+;;; document (reftex-all-document-files), searches for the current
+;;; buffer and switches to the next/previous one in the logical order
+;;; of the document. If WRAPP is true then wrap the search to the
+;;; beginning/end of the file list, depending of the search direction.
+(defun reftex-isearch-switch-to-next-file (crt-buf &optional wrapp)
+ (reftex-access-scan-info)
+ (let* ((cb (buffer-file-name crt-buf))
+ (flist (reftex-all-document-files))
+ (orig-flist flist))
+ (when flist
+ (if wrapp
+ (unless isearch-forward
+ (setq flist (last flist)))
+ (unless isearch-forward
+ (setq flist (nreverse (copy-list flist)))
+ (setq orig-flist flist))
+ (while (not (string= (car flist) cb))
+ (setq flist (cdr flist)))
+ (setq flist (cdr flist)))
+ (when flist
+ (find-file (car flist))))))
+
+;;;###autoload
+(defvar reftex-isearch-minor-mode nil)
+(make-variable-buffer-local 'reftex-isearch-minor-mode)
+
+;;;###autoload
+(defun reftex-isearch-minor-mode (&optional arg)
+ "When on, isearch searches the whole document, not only the current file.
+This minor mode allows isearch to search through all the files of
+the current TeX document.
+
+With no argument, this command toggles
+`reftex-isearch-minor-mode'. With a prefix argument ARG, turn
+`reftex-isearch-minor-mode' on iff ARG is positive."
+ (interactive "P")
+ (let ((old-reftex-isearch-minor-mode reftex-isearch-minor-mode))
+ (setq reftex-isearch-minor-mode
+ (not (or (and (null arg) reftex-isearch-minor-mode)
+ (<= (prefix-numeric-value arg) 0))))
+ (unless (eq reftex-isearch-minor-mode old-reftex-isearch-minor-mode)
+ (if reftex-isearch-minor-mode
+ (progn
+ (dolist (crt-buf (buffer-list))
+ (with-current-buffer crt-buf
+ (when reftex-mode
+ (set (make-local-variable 'isearch-wrap-function)
+ 'reftex-isearch-wrap-function)
+ (set (make-local-variable 'isearch-search-fun-function)
+ (lambda () 'reftex-isearch-isearch-search))
+ (set (make-local-variable 'isearch-push-state-function)
+ 'reftex-isearch-push-state-function)
+ (set (make-local-variable 'isearch-next-buffer-function)
+ 'reftex-isearch-switch-to-next-file)
+ (setq reftex-isearch-minor-mode t))))
+ (add-hook 'reftex-mode-hook 'reftex-isearch-minor-mode))
+ (dolist (crt-buf (buffer-list))
+ (with-current-buffer crt-buf
+ (when reftex-mode
+ (kill-local-variable 'isearch-wrap-function)
+ (kill-local-variable 'isearch-search-fun-function)
+ (kill-local-variable 'isearch-push-state-function)
+ (kill-local-variable 'isearch-next-buffer-function)
+ (setq reftex-isearch-minor-mode nil))))
+ (remove-hook 'reftex-mode-hook 'reftex-isearch-minor-mode)))
+ ;; Force modeline redisplay.
+ (set-buffer-modified-p (buffer-modified-p))))
+
+(add-minor-mode 'reftex-isearch-minor-mode "/I" nil nil
+ 'reftex-isearch-minor-mode)
+
;;; arch-tag: 2dbf7633-92c8-4340-8656-7aa019d0f80d
;;; reftex-global.el ends here