2008-10-14 34 views
37

Utilizo emacs para ver y editar código y otros archivos de texto. Quería saber si hay una forma de buscar hacia adelante o hacia atrás el texto que está marcado en el búfer actual. Similar a lo que puedo hacer en el bloc de notas o el tablero de palabras. Al igual que en ¿Puedo marcar algo de texto en el búfer y hacer un C-s o C-r y poder buscar con el texto marcado sin escribir realmente el texto de búsqueda completo?Búsqueda de texto marcado (seleccionado) en Emacs

Gracias,

Rohit

Respuesta

30

Sí. M-W (para obtener una copia del texto seleccionado) C-s <RET> C-y <RET>. Luego repita C-s según sea necesario. Del mismo modo para C-r.

+0

Me alegro de poder ayudar. A propósito, la sección relevante del manual es "20.1 Conceptos básicos de la búsqueda incremental". Ch idm emacs g Basic Isearch http://www.manpagez.com/info/emacs/emacs_95.php –

+0

Así es como ya lo hice ... Estoy algo sorprendido de que no haya un solo comando incorporado para esto. – fbmd

+8

Esto no explica cómo buscar el texto marcado. Esto explica cómo buscar texto copiado. – Jackson

81

@Alex lo clava.

Otra opción que uso con frecuencia es C-s C-w para buscar la palabra después de la marca actual. Al presionar C-w, se incrementa repetidamente la búsqueda con palabras adicionales (por ejemplo, C-s C-w C-w C-w busca las 3 palabras después de la marca actual).

De manera similar, C-s C-y busca el resto de la línea después de la marca actual y C-s C-M-y busca el carácter después de la marca. Estos son repetibles de la misma manera.

+1

Una sugerencia útil de hecho. – Rohit

+0

Del mismo modo, 'C-r C-w' busca hacia atrás (" r "= inverso) para la palabra después de la marca. Y 'C-r C-w C-w' busca hacia atrás las dos palabras después de la marca. – dougkramer

+2

Esta debería ser la respuesta aceptada. –

6

La secuencia de teclas más corta de hacer esto es M - wC - sM - y.

+0

Vale la pena señalar que esto busca la minúscula de la palabra, incluso si está resaltando todo el texto en mayúscula. – maxywb

+0

Esto es una pulsación de tecla, no un comando, lo que significa que no tiene sentido en ningún entorno que pase por alto eso. Nos envía a una búsqueda inútil para descubrir a qué comando estás tratando de referirte. –

12

Estoy utilizando el siguiente, que no tiene el problema de tener que escribir más de una Cs sucesivos para encontrar posteriores ocurrencias:

(defun search-selection (beg end) 
     "search for selected text" 
     (interactive "r") 
     (kill-ring-save beg end) 
     (isearch-mode t nil nil nil) 
     (isearch-yank-pop) 
    ) 
    (define-key global-map (kbd "<C-f3>") 'search-selection) 

La desventaja del código anterior es que el texto seleccionado se copia el estiramiento El siguiente código no tiene este problema:

(defun search-selection (beg end) 
     "search for selected text" 
     (interactive "r") 
     (let (
      (selection (buffer-substring-no-properties beg end)) 
      ) 
     (deactivate-mark) 
     (isearch-mode t nil nil nil) 
     (isearch-yank-string selection) 
    ) 
    ) 
    (define-key global-map (kbd "<C-f3>") 'search-selection) 
2

Las respuestas anteriores (incluida la aceptada) son demasiado engorrosas en mi humilde opinión. Encontré la siguiente información y me gusta mucho mejor:

"Ctrl + s Ctrl + w". Esto buscará la palabra actual, pero primero debe mover el cursor al principio de la palabra .

http://xah-forum.blogspot.com/2009/08/search-word-under-cursor-in-emacs.html

+0

Bueno, eso es exactamente lo que @ chris-conway señaló en https://stackoverflow.com/a/203026/316232. – nephewtom

3

Otras respuestas describen cómo buscar texto copiado, o cómo buscar la palabra en el punto. Pero ninguno de ellos describe cómo "buscar con el texto marcado".

Agregando la siguiente gancho lo hará de manera que el texto actualmente seleccionado es el texto utilizado para un isearch:

(defun jrh-isearch-with-region() 
    "Use region as the isearch text." 
    (when mark-active 
    (let ((region (funcall region-extract-function nil))) 
     (deactivate-mark) 
     (isearch-push-state) 
     (isearch-yank-string region)))) 

(add-hook 'isearch-mode-hook #'jrh-isearch-with-region) 

Consejo: Este pares muy bien con expand-region.

3

Hay una gran función para esto: isearch-forward-symbol-at-point.Resalta todas las ocurrencias de la palabra donde se ubica su punto, sin necesidad de colocar el punto al comienzo de la palabra. Luego puede pasar a la siguiente o anterior con C-s o C-r.

Tenga en cuenta que es una coincidencia exacta: si la usa en hi no coincidirá con chill por ejemplo.

I mapeado si a command-f (mac OSX): (global-set-key (kbd "s-f") 'isearch-forward-symbol-at-point) en el archivo init.

+0

Esto hace (casi) precisamente lo que la pregunta pide. La única diferencia es que 'isearch-forward-symbol-at-point' selecciona automáticamente el texto en el punto. Esto puede ser problemático si lo que usted considera una palabra difiere de lo que Emacs considera una palabra. Todavía útil, sin embargo. El enlace predeterminado en GNU Emacs 24.5.1 es 'M-s .'. –

Cuestiones relacionadas