web-dev-qa-db-fra.com

Emacs: comment supprimer du texte sans kill ring?

Je voudrais simplement supprimer du texte pour pouvoir en extraire un autre à la place. Comment puis je faire ça? C-w coupe le texte sélectionné pour tuer l'anneau et je me retrouve sans le texte que je voulais tirer.

De plus, est-il possible de tirer directement du texte à la place d'un texte sans même appuyer sur des boutons pour le tuer?

78
mannicken

J'écris M-x delete-region assez souvent, mais vous pouvez le lier à une clé.

Avec Supprimer le mode de sélection dans les versions plus récentes d'Emacs, vous n'avez pas besoin de taper une commande, commencez simplement à taper:

Par défaut, l'insertion de texte se produit normalement même si la marque est active. Par exemple, la saisie de a insère le caractère "a", puis désactive la marque. Le mode Supprimer la sélection, un mode mineur, modifie ce comportement: si vous activez ce mode, l'insertion de texte alors que la marque est active entraîne la suppression du texte dans la région en premier. En outre, les commandes qui suppriment normalement un seul caractère, telles que C-d ou DEL, supprimera la région entière à la place. Pour activer ou désactiver le mode Supprimer la sélection, tapez M-x delete-selection-mode.

46
ashawley

Vous pouvez utiliser M-y après C-y pour insérer l'élément précédent du kill ring, ou utilisez le package Browse-kill-ring .

Quant à la deuxième question, voir DeleteSelectionMode .

36
Eugene Morozov

J'ai eu le même problème. La chose la plus proche que j'ai jusqu'à présent est de créer une petite fonction qui est essentiellement:

(defun ruthlessly-kill-line ()
  "Deletes a line, but does not put it in the kill-ring. (kinda)"
  (interactive)
  (move-beginning-of-line 1)
  (kill-line 1)
  (setq kill-ring (cdr kill-ring)))
20
Haakon Løtveit

Tiré du EmacsWiki :

L'équivalent de ‘kill-line’ (‘C-k’) mais sans effets secondaires du kill-ring:

(delete-region (point) (line-end-position))
10
John J. Camilleri

M-x eval-expression (setq kill-ring (cdr kill-ring)) - supprime le dernier élément du kill-ring

5
Evgeny

Pour votre deuxième question, alternativement à DeleteSelectionMode vous pouvez activer Mode CUA qui vous offre en plus un mode de sélection de rectangle agréable activé par C-Return. Le mode CUA fait partie d'emacs depuis 22.1.

4
danielpoe

J'ai trouvé une réponse à cela.

Posté en premier ici .

;; Ctrl-K with no kill
(defun delete-line-no-kill ()
  (interactive)
  (delete-region
   (point)
   (save-excursion (move-end-of-line 1) (point)))
 (delete-char 1)
)
(global-set-key (kbd "C-k") 'delete-line-no-kill)
3
Ole

Techniquement, les autres réponses sont fausses sur la première partie.

Voici ma mise en œuvre et ma motivation:

(defun delete-Word (arg)
  "Delete characters backward until encountering the beginning of a Word.
With argument ARG, do this that many times."
  (interactive "p")
  (delete-region (point) (progn (backward-Word arg) (point))))

J'ai adapté le code ici à partir de "kill-Word" dans simple.el. J'ai changé kill-region avec delete-region et forward-Word pour backward-Word. De cette façon, cela n'affecte VRAIMENT PAS le kill-ring, contrairement aux autres situations où, en dehors d'emacs, j'ai remarqué que le kill-ring a été influencé.

2
PascalVKooten
(defun copy-to-register-z (p1 p2)
  "Copy text selection to register named “z”."
  (interactive "r")
  (copy-to-register ?z p1 p2))
(defun replace-register-content-z (p1 p2)
  "Replace register named “z”'s content."
  (interactive "r")
  (delete-region p1 p2)
  (insert-register ?z))
(global-set-key (kbd "C-c c") 'copy-to-register-z)
(global-set-key (kbd "C-c v") 'replace-register-content-z)
1
ZBeginner

La plupart des fonctions kill utilisent kill-region pour effectuer le travail réel de suppression du texte. J'utilise une macro LISP pour créer des fonctions de suppression à partir de fonctions de suppression.

(defmacro jpk/delete-instead-of-kill (&rest body)
  "Replaces `kill-region' with `delete-region' in BODY."
  `(cl-letf (((symbol-function 'kill-region)
              (lambda (beg end &optional yank-handler)
                (delete-region beg end))))
     ,@body))

(defun jpk/delete-Word (arg)
  "Like `kill-Word', but does not save to the `kill-ring'."
  (interactive "*p")
  (jpk/delete-instead-of-kill (kill-Word arg)))
1
jpkotta

Ma réponse à la première question: marquez le texte dans emacs (en utilisant la souris ou définissez la marque C-SPC) et appuyez sur le bouton "<- Retour arrière" du clavier au lieu de C-w. De cette façon, vous pouvez toujours coller du texte dans le presse-papiers du système, sans vous soucier que le presse-papiers a été remplacé par du texte tué par C-w

Contexte de cette réponse: parfois, lorsque j'ai reçu du texte en dehors d'emacs que je veux utiliser pour remplacer une région dans emacs, j'ai souvent fait une erreur en copiant d'abord ce texte dans le presse-papiers du système (c'est-à-dire sous Windows Ctrl + C), puis faire un C-w dans emacs pour "supprimer" la région de texte que je souhaite remplacer, en espérant qu'une version ultérieure M-w pourrait récupérer mon texte dans le presse-papiers de kill-ring. Malheureusement, le presse-papiers serait simplement remplacé par du texte tué par C-w, et le message d'origine dans le presse-papiers ne s'afficherait jamais dans le kill-ring.

Pour la 2e question, oui, vous pouvez toujours marquer le texte dans emacs d'abord, puis directement C-y

1
Kevin Zhu

Ajoutez un équivalent de suppression des clés kill-region et kill-line C-w et C-k comme suit. Lié aux touches C-v et C-z.

 ;; Un raccourci clavier pour supprimer la région donne un bon "équivalent CUT Ctrl-x de Windows". 
 ;; Quelle liaison à utiliser est difficile à choisir. 
 ;; utiliser C-v "Windows PASTE Ctrl-v" est une option assez subversive. 
 ;; C-v = faire défiler vers le haut dans emacs que je n'ai pas utilisé. 
 (Global-set-key (kbd "C-v") 'delete-region) 
 
 ;; Pour avoir également une alternative "Windows CUT" à Ck (kill-line), cela peut être fait: 
 (Defun delete-line () "delete line, take it out of kill ring. Bind this func to Cz" 
 (interactif) 
 (setq last-command 'delete-line) 
 (kill-line) 
 (setq kill-ring (cdr kill-ring)) 
 (setq kill-ring-yank-pointer kill-ring) 
 (setq last-command 'delete-line) 
) 
 (global-set-key (kbd "Cz") 'ligne de suppression) 
 ;; sans réglage de la dernière commande 2+ C-zs gâchent le kill-ring 
1
James Coleman

comment supprimer du texte sans kill ring?

les delete-region la fonction supprimera la région sélectionnée sans l'ajouter au kill ring

De plus, est-il possible de tirer du texte directement au lieu d'un texte sans même appuyer sur des boutons pour le tuer?

Je pense que vous demandez comment remplacer le texte dans une région sélectionnée par quelque chose que vous avez déjà mis sur le kill ring.

Réglage (delete-selection-mode 1) vous permettra de copier/coller sur une région sélectionnée. Il vous permet également de simplement taper et remplacer une région sélectionnée.

Sur la version 25.1.1 sur OS X, j'ai également dû ajouter (setq select-enable-primary nil) pour l'empêcher de copier la région sélectionnée sur le kill ring

0
kevincasey

Voici une version de kill-region qui ne force pas les valeurs dans le kill-ring.

(defun kill-or-delete-region (beg end prefix)
  "Delete the region, storing it in the kill-ring.
If a prefix argument is given, don't change the kill-ring."
  (interactive "r\nP")
  (if prefix
      (delete-region beg end)
    (kill-region beg end)))

(global-set-key (kbd "C-w") 'kill-or-delete-region)

Cela vous permet de faire C-w comme avant, mais C-u C-w supprime maintenant le texte sans changer le kill-ring.

0
Wilfred Hughes