Comment supprimer les n premiers caractères de chaque ligne?

15

J'ai récemment demandé:

Comment ajouter un préfixe à chaque ligne?

Allez donc du code ci-dessous:

I said Hello
I said There
I said I am some code

Pour coder comme:

Hello
There
I am some code

Maintenant, comment supprimer n nombre de caractères d'une ligne?

Luke Shimkus
la source
À mon humble avis, c'est la même chose que votre question précédente.
A_P

Réponses:

28

C'est encore plus simple! Encore une fois, utilisez des commandes rectangulaires . Déplacez-vous dans un coin du rectangle que vous souhaitez supprimer, appuyez sur C-SPCpour définir la marque. Passez à l'autre coin du rectangle et appuyez sur C-x r d( delete-rectangle). Par exemple, passez à la première ligne sur laquelle vous souhaitez agir, appuyez sur C-aou homepour aller au début de la ligne, descendez jusqu'à la dernière ligne sur laquelle vous souhaitez agir, pour vous déplacer dans le coin inférieur droit, puis supprimez.C-u number C-fC-x r d

Si la dernière ligne contient moins que le nombre de caractères souhaité, il peut être plus pratique d'utiliser à la place les coins inférieur gauche et supérieur droit. Alternativement, vous pouvez insérer des caractères indésirables (cela est utile si la première ligne et la dernière ligne sont plus courtes).

Vous pouvez utiliser C-x r kpour tuer le rectangle, ce qui vous permet de le tirer ( C-x r y) plus tard (déplacez-vous dans le coin supérieur gauche de l'endroit où vous souhaitez l'insérer).

Vous pouvez également utiliser C-x r t( string-rectangle) et saisir une chaîne vide.

Les commandes rectangulaires sont basées sur les positions des colonnes. Si vous souhaitez supprimer n caractères, plutôt que n colonnes (ce qui fait la différence avec les caractères multi-colonnes tels que les tabulations), vous pouvez utiliser le remplacement d'expressions régulières : remplacez ^.\{42\}par rien pour supprimer les 42 premiers caractères de chaque ligne.

Gilles 'SO- arrête d'être méchant'
la source
3
au lieu d'essayer de mémoriser toutes les commandes de rectangle, vous pouvez également utiliser Cx spc, au lieu de C-spc, qui transforme votre région en rectangle et tout fonctionne.
Malabarba
1
@Malabarba Seulement depuis Emacs 24 cependant. (Écrire ceci sur une machine avec Emacs 23. Ils sont toujours très présents.)
Gilles 'SO- arrête d'être méchant'
2
Mes condoléances ... :-(
Malabarba
Cela vient de fonctionner pour moi sur GNU Emacs 23.4.1 (x86_64-pc-linux-gnu, GTK + Version 2.24.21) du 2013-10-25 sur allspice, modifié par Debian
davidrmcharles
4

Autre possibilité: j'aime vraiment utiliser plusieurs curseurs pour des tâches comme celle-ci. Disponible en package.elvia MELPA, il est devenu un élément indispensable de mes emacs. Je voudrais simplement sélectionner I said(et éventuellement inclure le saut de ligne avant), utiliser M-x mc/mark-all-like-thiset être en route. Si vous souhaitez un contrôle plus fin, vous pouvez utiliser mc/mark-next-like-thisou mc/mark-next-lines.

Mes raccourcis clavier:

(use-package multiple-cursors
  :bind (("C->"   . mc/mark-next-like-this)
         ("C-M->" . mc/mark-all-like-this-dwim)))

Les Roches Emacs obligatoires! épisode: http://emacsrocks.com/e13.html

Sean Allred
la source
3

Si vous l'avez cua-modeactivé, alors:

  • C-a passer au début de la ligne,
  • C-RET pour commencer le rectangle,
  • Ensuite, déplacez-vous avec les touches fléchées ou toute commande de déplacement emacs comme C-f
  • DEL pour supprimer la sélection

Je préfère la cua-modefaçon de travailler, par rapport au rectangle standard Emacs où l'équivalent serait:

  • C-a passer au début de la ligne,
  • C-SPC pour commencer le rectangle,
  • Ensuite, déplacez-vous avec les touches fléchées ou toute commande de déplacement emacs comme C-f
  • C-x r d pour supprimer la sélection

Le cua-modeenregistre trois pressions de touche par rapport au rectangle Emacs standard.

thdox
la source
3

Par souci d'exhaustivité: la suppression des 3 premiers caractères de chaque ligne (formellement: à partir du point ou dans la région) peut être effectuée en remplaçant regexp ^...(ou plus généralement:) ^.\{3\}par une chaîne vide.

Explication: dans regexen, ^signifie "début de ligne", .signifie "n'importe quel caractère" et \{n\}signifie " n répétitions de la chose précédente".

Cela a un avantage supplémentaire d'être interactif (sauf si l'on appuie !, ce qui fait query-regexp-replacetout remplacer désormais sans plus de questions).

mbork
la source
1
Pourquoi les downvotes?
mbork
0

Et encore une possibilité:

F3C-aC-3C-dC-nF4

enregistre une macro de clavier, disant en gros "passer au début de la ligne, supprimer trois caractères et passer à la ligne suivante". Ensuite, vous pouvez le rejouer jusqu'à la fin du tampon par C-uF4, ou l' C-xC-krappliquer aux lignes de la région. Cela a un inconvénient: il se cassera lorsqu'une ligne contient moins de 3 caractères.

mbork
la source
-1

S'il ne s'agit que d'une ligne, vous pouvez zapper sur char avec Mz en supposant que ce caractère n'est pas répété entre le point et celui que vous souhaitez supprimer. Dans certains cas, cela est plus rapide que la création d'une région.

Willyfrog
la source