2012-06-15 10 views
8

Grazie in anticipo per l'aiuto.Emacs: Combina iseach-forward e recenter-top-bottom

In Emacs, mi piace usare iseach-forward (C-s), ma mi piacerebbe sempre di più se le parole della fonte evidenziata fossero centrate nel centro dello schermo anziché in fondo.

mi ritrovo a fare questo in modo continuo:

C-s foo C-s C-s C-s ... oh! questo è il "foo" che stavo cercando! C-l

C'è un modo per centrare i risultati della ricerca al centro dello schermo?

Acclamazioni

risposta

1

Si potrebbe utilizzare per eseguire defadvicerecenter-top-bottom dopo isearch-forward.

5

miglior approccio sarebbe probabilmente per aggiungere la seguente gancio:

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

Questo eseguirà il comando recenter-top-bottom al completamento di ogni ricerca incrementale di successo.

Edit: ho studiato un po ', e le funzioni che vengono eseguite sulla ricerca utilizzate per la stessa stringa (cioè, con successivo ingresso C-s o C-r durante una ricerca attiva) sembrano essere isearch-repeat-forward e/o isearch-repeat-backward. Quindi, se si vuole centrare nuovamente su ogni ripetizione pure, è necessario consigliare dette funzioni oltre a definire il gancio sopra, in questo modo:

(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) 

Personalmente, trovo il comportamento risultante di essere estremamente fastidioso e disorientante , ma de gustibus non est disputandum. Forse riservare recenter-top-bottom per l'utilizzo nello isearch-mode-end-hook iniziale e utilizzare le funzioni repeat utilizzando il comando meno antipatico.

La consulenza di isearch-forward è di per sé equivalente all'aggiunta del gancio originariamente suggerito sopra e apparentemente non ha alcun effetto sulle ricerche ripetute. Aggiungere il gancio è più semplice e penso che sia più idiomatico, quindi probabilmente dovrebbe essere preferibile rispetto a consigliare la funzione.

3

Grazie Nicolas e Greg.

I tuoi suggerimenti mi hanno indirizzato verso la giusta direzione. Questo è il codice per compiere ciò che mi è stato chiesto di:

(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) 

Spiegazione:

non volevo fare le cose più complicate aggiungendo che uso il Male (modalità vim in Emacs), così ho ometto quello nella mia domanda.

Uso defadvice per cercare in avanti, per passare alla voce successiva ricercata e per passare alla voce precedente ricercata.

Qualcosa che vale la pena menzionare è che non ho usato la funzione (recenter-top-bottom).Il comportamento era pazzesco poiché centrava il primo oggetto cercato al centro dello schermo, centrato il secondo verso l'alto e il terzo verso il basso. Ho appena usato la funzione 'recenter' per centrarla sempre al centro dello schermo.

Per gli utenti non male il codice sarebbe simile a questa:

(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 (Non testato!)!