2010-02-19 5 views
9

Когда я использую grep - find, он открывает другое окно (область в кадре) со списком результатов, которые я могу выбрать. Когда я выбираю один открывает целевой файл в другом окне, чем grep -. find находится вКак выполнить ссылку emacs grep-find в том же окне?

Как я могу получить целевой файл, чтобы открыть в том же окне, что и grep результатов (замена окна grep результатов с тем, что я я действительно ищу).

Как сохранить grep-find от открытия отдельного окна (открыть его в текущем окне). Моя цель - я что-то ищу, я нахожу это, я иду к нему, все в одном окне. Я хотел бы добавить это в мой файл .emacs.

ответ

6

Не похоже, что есть какой-либо способ настроить пакет compile, чтобы выполнить то, что вы просите. И нет простого способа использовать advice, чтобы настроить поведение. Я думаю, вы должны прибегнуть к редактированию функции, которая на самом деле перескакивает на ошибку, которую вы можете сделать со следующим дополнением к вашему .emacs (проверено в Emacs 23.1):

(eval-after-load "compile" 
'(defun compilation-goto-locus (msg mk end-mk) 
    "Jump to an error corresponding to MSG at MK. 
All arguments are markers. If END-MK is non-nil, mark is set there 
and overlay is highlighted between MK and END-MK." 
    ;; Show compilation buffer in other window, scrolled to this error. 
    (let* ((from-compilation-buffer (eq (window-buffer (selected-window)) 
        (marker-buffer msg))) 
    ;; Use an existing window if it is in a visible frame. 
    (pre-existing (get-buffer-window (marker-buffer msg) 0)) 
    (w (if (and from-compilation-buffer pre-existing) 
     ;; Calling display-buffer here may end up (partly) hiding 
     ;; the error location if the two buffers are in two 
     ;; different frames. So don't do it if it's not necessary. 
     pre-existing 
     (let ((display-buffer-reuse-frames t) 
     (pop-up-windows t)) 
     ;; Pop up a window. 
     (display-buffer (marker-buffer msg))))) 
    (highlight-regexp (with-current-buffer (marker-buffer msg) 
      ;; also do this while we change buffer 
      (compilation-set-window w msg) 
      compilation-highlight-regexp))) 
;; Ideally, the window-size should be passed to `display-buffer' (via 
;; something like special-display-buffer) so it's only used when 
;; creating a new window. 
(unless pre-existing (compilation-set-window-height w)) 

(switch-to-buffer (marker-buffer mk)) 

    ;; was 
;; (if from-compilation-buffer 
;;  ;; If the compilation buffer window was selected, 
;;  ;; keep the compilation buffer in this window; 
;;  ;; display the source in another window. 
;;  (let ((pop-up-windows t)) 
;;  (pop-to-buffer (marker-buffer mk) 'other-window)) 
;; (if (window-dedicated-p (selected-window)) 
;;  (pop-to-buffer (marker-buffer mk)) 
;;  (switch-to-buffer (marker-buffer mk)))) 
;; If narrowing gets in the way of going to the right place, widen. 
(unless (eq (goto-char mk) (point)) 
    (widen) 
    (goto-char mk)) 
(if end-mk 
    (push-mark end-mk t) 
    (if mark-active (setq mark-active))) 
;; If hideshow got in the way of 
;; seeing the right place, open permanently. 
(dolist (ov (overlays-at (point))) 
    (when (eq 'hs (overlay-get ov 'invisible)) 
    (delete-overlay ov) 
    (goto-char mk))) 

(when highlight-regexp 
    (if (timerp next-error-highlight-timer) 
     (cancel-timer next-error-highlight-timer)) 
    (unless compilation-highlight-overlay 
    (setq compilation-highlight-overlay 
     (make-overlay (point-min) (point-min))) 
    (overlay-put compilation-highlight-overlay 'face 'next-error)) 
    (with-current-buffer (marker-buffer mk) 
    (save-excursion 
     (if end-mk (goto-char end-mk) (end-of-line)) 
     (let ((end (point))) 
    (if mk (goto-char mk) (beginning-of-line)) 
    (if (and (stringp highlight-regexp) 
     (re-search-forward highlight-regexp end t)) 
     (progn 
      (goto-char (match-beginning 0)) 
      (move-overlay compilation-highlight-overlay 
       (match-beginning 0) (match-end 0) 
       (current-buffer))) 
     (move-overlay compilation-highlight-overlay 
      (point) end (current-buffer))) 
    (if (or (eq next-error-highlight t) 
     (numberp next-error-highlight)) 
     ;; We want highlighting: delete overlay on next input. 
     (add-hook 'pre-command-hook 
       'compilation-goto-locus-delete-o) 
     ;; We don't want highlighting: delete overlay now. 
     (delete-overlay compilation-highlight-overlay)) 
    ;; We want highlighting for a limited time: 
    ;; set up a timer to delete it. 
    (when (numberp next-error-highlight) 
     (setq next-error-highlight-timer 
     (run-at-time next-error-highlight nil 
       'compilation-goto-locus-delete-o))))))) 
(when (and (eq next-error-highlight 'fringe-arrow)) 
    ;; We want a fringe arrow (instead of highlighting). 
    (setq next-error-overlay-arrow-position 
    (copy-marker (line-beginning-position))))))) 

eval-afer-load часть только гарантирует, что вы переопределить его после Emacs определил его, чтобы ваше изменение укрепилось.

+0

большое спасибо, Трей! Ты спас свой день. –

+0

Трей, возможно ли настроить вашу функцию, чтобы открыть щелчок Shift-mouse в том же буфере, или сохранить одно и то же поведение мыши, чтобы открыть его в отдельном окне? – SFbay007

+1

@Ammari Не тривиально. Подход взлома должен состоять в том, чтобы иметь новую привязку для Shift-mouse, чтобы локально установить переменную '(let ((use-same-window t)) ...), а затем выдать команду, чтобы перейти к ошибке, и в функция выше, выберите, какое поведение вы хотите. –

1

Вы можете добавить связывания (например, Alt-M) и сделайте следующее

(define-key grep-mode-map "\M-m" (lambda() 
            (interactive) 
            (compile-goto-error) 
            (delete-other-windows) 
            (kill-buffer "*grep*"))) 

я не нашел способ заменить стандарт «Enter»/щелчок мыши связывание с пользовательской функцией

+1

стандартная привязка ввода/щелчка мыши является текстовым свойством этой подстроки буфера, вы можете отредактировать это свойство или изменить способ компиляции добавляет это свойство –

1

Существует другое подход:

(defun eab/compile-goto-error() 
    (interactive) 
    (let ((cwc (current-window-configuration))) 
    (funcall 
    `(lambda() 
     (defun eab/compile-goto-error-internal() 
      (let ((cb (current-buffer)) 
       (p (point))) 
      (set-window-configuration ,cwc) 
      (switch-to-buffer cb) 
      (goto-char p)))))) 
    (compile-goto-error) 
    (run-with-timer 0.01 nil 'eab/compile-goto-error-internal)) 
Смежные вопросы