2012-06-15 6 views
8

Z góry dziękuję bardzo za pomoc.Emacs: Połącz iseach-forward i recenter-top-bottom

W Emacs lubię używać iseach-forward (C-s), ale chciałbym, aby było jeszcze więcej, jeśli podświetlone słowa fount byłyby wyśrodkowane na środku ekranu zamiast na samym dole.

znajdę się w ten sposób ciągły:

C-s foo C-s-s C C-s ... oh! to jest "foo", którego szukałem! C-l

Czy istnieje sposób na wyśrodkowanie wyników wyszukiwania na środku ekranu?

Cheers

Odpowiedz

1

Można użyć defadvice uruchomić recenter-top-bottom po isearch-forward.

5

najlepszym rozwiązaniem byłoby prawdopodobnie dodać następujące haczyk:

(add-hook 'isearch-mode-end-hook 'recenter-top-bottom) 

ten będzie wykonywał polecenia z recenter-top-bottom po zakończeniu każdego udanego szukania przyrostowego.

Edit: Mam badane trochę, a funkcje, które są wykonywane na wielokrotnych poszukiwań do tego samego łańcucha (to znaczy z kolejnym wejściem C-s lub C-r podczas aktywnego poszukiwania) wydają się być isearch-repeat-forward i/lub isearch-repeat-backward. Tak więc, jeśli chcesz, aby pojawiło się na każdym powtórzeniu, a także, trzeba doradzić wspomnianych funkcji w uzupełnieniu do zdefiniowania powyżej haka, tak:

(defadvice 
    isearch-repeat-forward 
    (after isearch-repeat-forward-recenter activate) 
    (recenter-top-bottom)) 

(defadvice 
    isearch-repeat-backward 
    (after isearch-repeat-backward-recenter activate) 
    (recenter-top-bottom)) 

(ad-activate 'isearch-repeat-forward) 
(ad-activate 'isearch-repeat-backward) 

Osobiście uważam, że uzyskany zachowanie się być bardzo irytujące i dezorientujące , ale de gustibus non est disputandum. Być może zarezerwowanie recenter-top-bottom do użytku w początkowym numerze isearch-mode-end-hook i użycie samej recenter w radzie funkcji repeat byłoby mniej nieprzyjemne.

Samo doradzanie isearch-forward jest równoznaczne z dodaniem haka, który pierwotnie zasugerowałem powyżej i najwyraźniej nie ma wpływu na powtarzające się wyszukiwania. Dodawanie haka jest prostsze i myślę, że bardziej idiomatyczne, więc prawdopodobnie powinno być preferowane w porównaniu z doradzaniem funkcji.

3

Dziękuję Nicolas i Greg.

Twoje sugestie wskazały mi właściwy kierunek. Jest to kod, aby osiągnąć to, co ja z prośbą o:

(defadvice 
    evil-search-forward 
    (after evil-search-forward-recenter activate) 
    (recenter)) 
(ad-activate 'evil-search-forward) 

(defadvice 
    evil-search-next 
    (after evil-search-next-recenter activate) 
    (recenter)) 
(ad-activate 'evil-search-next) 

(defadvice 
    evil-search-previous 
    (after evil-search-previous-recenter activate) 
    (recenter)) 
(ad-activate 'evil-search-previous) 

Objaśnienie:

Nie chciałem, aby dostać rzeczy bardziej skomplikowane, dodając, że używam zła (tryb vim w Emacs), więc pominąłem to w moim pytaniu.

Używam defadvice, aby wyszukiwać do przodu, aby przejść do następnego szukanego elementu i przejść do poprzedniego szukanego elementu.

Warto wspomnieć, że nie używałem funkcji (recenter-top-bottom).Zachowanie było szalone, ponieważ wyśrodkował pierwszy element poszukiwany na środku ekranu, wyśrodkowany na drugim, a trzeci na dole. Po prostu użyłem funkcji "recenter", aby wyśrodkować ją zawsze na środku ekranu.

Dla użytkowników nie jest zła kod będzie wyglądać następująco:

(defadvice 
    isearch-forward 
    (after isearch-forward-recenter activate) 
    (recenter)) 
(ad-activate 'isearch-forward) 

(defadvice 
    isearch-repeat-forward 
    (after isearch-repeat-forward-recenter activate) 
    (recenter)) 
(ad-activate 'isearch-repeat-forward) 

(defadvice 
    isearch-repeat-backward 
    (after isearch-repeat-backward-recenter activate) 
    (recenter)) 
(ad-activate 'isearch-repeat-backward) 

Cheers (nie testowane!)!