2012-06-15 8 views
8

Muchas gracias de antemano por su ayuda.Emacs: Combine iseach-forward y recenter-top-bottom

En Emacs, me gusta utilizar iseach-forward (C-s), pero me gustaría que las palabras resaltadas se centraran en el centro de la pantalla en lugar de en la parte inferior.

me encuentro haciendo esto continuamente:

foo

C-s-s C-C-C s s ... oh! ese es el 'foo' que estaba buscando! C-l

¿Hay alguna forma de centrar los resultados de búsqueda en el medio de la pantalla?

Saludos

Respuesta

1

Usted podría utilizar defadvice para funcionar recenter-top-bottom después isearch-forward.

5

mejor enfoque sería probablemente para añadir el siguiente gancho:

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

Esto ejecutará el comando recenter-top-bottom a la terminación de cada éxito la búsqueda incremental.

Edición: He investigado un poco, y las funciones que se ejecutan en repetidas búsquedas de la misma cadena (es decir, con la entrada sucesiva de C-s o C-r durante una búsqueda activa) parece ser isearch-repeat-forward y/o isearch-repeat-backward. Por lo tanto, si desea volver a centrar en cada repetición, así, es necesario asesorar a dichas funciones, además de definir el gancho anteriores del siguiente 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, creo que el comportamiento resultante sea extremadamente molesto y desconcertante , pero de gustibus non est disputandum. Tal vez reservar recenter-top-bottom para su uso en el isearch-mode-end-hook inicial y usar recenter solo en el asesoramiento a las funciones repeat sería menos desagradable.

Asesorar isearch-forward por sí mismo es equivalente a agregar el gancho que sugerí anteriormente y aparentemente no tiene ningún efecto en las búsquedas repetidas. Agregar el gancho es más simple y creo que es más idiomático, por lo que probablemente debería ser mejor que recomendar la función.

3

Gracias Nicolas y Greg.

Sus sugerencias me indicaron la dirección correcta. Este es el código para lograr lo que yo estaba pidiendo:

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

Explicación:

no quería hacer las cosas más complicadas y agregó que utilizo Mal (modo vim en Emacs), por lo que omití eso en mi pregunta.

Uso defadvice para buscar hacia delante, para pasar al siguiente elemento buscado y para mover al elemento buscado anterior.

Algo que vale la pena mencionar es que no usé la función (recenter-top-bottom).El comportamiento fue loco ya que centró el primer elemento buscado en el medio de la pantalla, centró el segundo en la parte superior y el tercero en la parte inferior. Acabo de utilizar la función 'recenter' para centrarla siempre en el medio de la pantalla.

Para los usuarios no mal el código sería el siguiente:

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

Saludos (no probado!)!