Sélection (c'est-à-dire en tant que région) de la correspondance actuelle dans la recherche incrémentielle

9

Lors de la recherche d'une chaîne avec C-s, je veux pouvoir appuyer sur une touche pour quitter le mode de recherche tout en conservant la sélection de la correspondance. De cette façon, je peux immédiatement commencer à taper et remplacer la dernière correspondance.

Par exemple, disons que j'ai le document suivant:

The quick brown fox jumps over the lazy dog.

Si je recherche "paresseux", emacs sélectionnera ce mot comme ça (les crochets sont la sélection, le pipe est le curseur):

The quick brown fox jumps over the [lazy|] dog.

Maintenant, si j'appuie return, emacs conservera la position de mon curseur, mais il désélectionnera "paresseux":

The quick brown fox jumps over the lazy| dog.

Au lieu de cela, je veux un raccourci qui quittera le mode de recherche mais conservera la sélection de correspondance actuelle, comme dans le deuxième état ci-dessus.

Ben
la source
N'est- M-x query-replacece pas ce que vous cherchez?
Nsukami _
1
@Nsukami_ Je ne sais pas toujours ce que je veux que ma requête soit ou même ce que je veux la remplacer avant de lancer une recherche. Il est beaucoup plus facile de simplement taper C-set de taper ce que je pense que je veux rechercher, puis de changer la requête avec retour arrière à zéro sur la chose que je veux changer. Ensuite, je joue avec quoi exactement je veux le remplacer. M-%est trop «formel».
Ben
La solution est pratique pour moi, comme lorsque je recherche un mot pour le tuer, puis le tire à un autre endroit. query-replacene résout pas cela.
GergelyPolonkai

Réponses:

7

Voici une approche:

(defun isearch-exit-mark-match ()
  "Exit isearch and mark the current match."
  (interactive)
  (isearch-exit)
  (push-mark isearch-other-end)
  (activate-mark))

(define-key isearch-mode-map (kbd "<C-return>") #'isearch-exit-mark-match)

Cela lie une clé différente (C-return) pour quitter la recherche en cours et laisser également la dernière correspondance sélectionnée. Cela fonctionnera isearch-forward-regexpégalement, ce qui est pratique.

glucas
la source
1
J'obtiens "La définition de la fonction du symbole est vide: clé de liaison." D'où bind-keyvient-il?
Ben
1
Désolé, bind-keyvient d'une autre bibliothèque. J'ai changé la réponse pour utiliser la define-keyfonction intégrée à la place.
glucas
4

La bibliothèque Isearch + vous permet de le faire facilement et même de l'activer / le désactiver à la volée.

  • L'option non nulle isearchp-set-region-flagdéfinit automatiquement la région (sélection) autour de la dernière cible de recherche lorsque vous quittez isearch.

  • Commande isearchp-toggle-set-region, liée à l' M-s M-SPCoption isearch bascule isearchp-set-region-flag.

  • La commande set-region-around-search-targetdéfinit manuellement la région autour de la dernière cible de recherche. (Donc, même si l'option n'est pas définie, afin que vous n'obteniez pas de sélection automatique, vous pouvez le faire manuellement.)


Library Replace + vous permet de faire la même chose pour query-replaceetc. Il place la région autour (c.-à-d. Sélectionne) la dernière occurrence de remplacement. Il utilise la même option,, isearchp-set-region-flagpour contrôler cela, et la commande set-region-around-search-targeta le même effet.

A dessiné
la source