Jak usunąć kilka pierwszych n znaków z każdej linii?

15

Niedawno zapytałem:

Jak dodać prefiks do każdej linii?

Więc idź od kodu poniżej:

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

Aby zakodować:

Hello
There
I am some code

Jak usunąć n liczby znaków z linii?

Luke Shimkus
źródło
IMHO to to samo co poprzednie pytanie.
A_P

Odpowiedzi:

28

To jeszcze łatwiejsze! Ponownie użyj poleceń prostokątnych . Przejdź do jednego rogu prostokąta, który chcesz usunąć, naciśnij, C-SPCaby ustawić znak. Przejdź do drugiego rogu prostokąta i naciśnij C-x r d( delete-rectangle). Na przykład przejdź do pierwszej linii, na której chcesz działać, naciśnij C-alub, homeaby przejść do początku linii, przejdź do ostatniej linii, na której chcesz działać, aby przejść do prawego dolnego rogu, a następnie usuń.C-u number C-fC-x r d

Jeśli ostatni wiersz zawiera mniej niż pożądaną liczbę znaków, wygodniej może być zamiast tego użyć lewego dolnego i prawego górnego rogu. Alternatywnie możesz wstawić niepotrzebne znaki (jest to przydatne, jeśli zarówno pierwszy wiersz, jak i ostatni wiersz są krótsze).

Możesz użyć C-x r kdo zabicia prostokąta, który pozwala ci go szarpać ( C-x r y) później (przejdź do lewego górnego rogu miejsca, w którym chcesz go wstawić).

Możesz także użyć C-x r t( string-rectangle) i wprowadzić pusty ciąg.

Polecenia prostokąta są oparte na pozycjach kolumn. Jeśli chcesz usunąć n znaków zamiast n kolumn (co robi różnicę w przypadku znaków wielokolumnowych, takich jak tabulatory), możesz użyć zamiany wyrażeń regularnych : zamień ^.\{42\}na nic, aby usunąć pierwsze 42 znaki każdej linii.

Gilles „SO- przestań być zły”
źródło
3
zamiast próbować zapamiętać wszystkie polecenia prostokąta, możesz również użyć Cx spc, zamiast C-spc, który zamienia region w prostokąt i wszystko po prostu działa.
Malabarba
1
@Malabarba Tylko od czasu Emacsa 24. (Pisze to na maszynie z Emacsem 23. Nadal jest ich bardzo dużo.)
Gilles „SO- przestań być zły”
2
Moje kondolencje ... :-(
Malabarba
To właśnie działało dla mnie na GNU Emacs 23.4.1 (x86_64-pc-linux-gnu, GTK + wersja 2.24.21) z 2013-10-25 na ziele angielskie, zmodyfikowane przez Debian
davidrmcharles
4

Inna możliwość: naprawdę lubię używać wielu kursorów do takich zadań. Dostępny w package.elMELPA, stał się nieodłączną częścią moich emacs. Po prostu wybrałbym I said(i ewentualnie dołączałbym przed nim podział linii), użyłem M-x mc/mark-all-like-thisi byłem na mojej drodze. Jeśli chcesz uzyskać bardziej szczegółową kontrolę, możesz użyć mc/mark-next-like-thislub mc/mark-next-lines.

Moje skróty klawiszowe:

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

Obowiązkowe Emacs Rocks! odcinek: http://emacsrocks.com/e13.html

Sean Allred
źródło
3

Jeśli cua-modewłączyłeś, to:

  • C-a przejść na początek linii,
  • C-RET aby rozpocząć prostokąt,
  • Następnie poruszaj za pomocą klawiszy strzałek lub dowolnego polecenia emacs move, takiego jak C-f
  • DEL aby usunąć wybór

Wolę cua-modesposób pracy, niż standardowy prostokąt Emacsa, gdzie odpowiednikiem byłoby:

  • C-a przejść na początek linii,
  • C-SPC aby rozpocząć prostokąt,
  • Następnie poruszaj za pomocą klawiszy strzałek lub dowolnego polecenia emacs move, takiego jak C-f
  • C-x r d aby usunąć wybór

cua-modeOszczędza trzech naciśnięć klawiszy w porównaniu do standardowej Emacs prostokąta.

Thdox
źródło
3

W trosce o kompletność: usunięcie pierwszych 3 znaków z każdej linii (formalnie: od punktu lub w regionie) można wykonać przez zastąpienie wyrażenia regularnego ^...(lub bardziej ogólnie :) ^.\{3\}pustym ciągiem.

Objaśnienie: w wyrażeniu regularnym ^oznacza „początek linii”, .oznacza „dowolny znak” i \{n\}n powtórzeń rzeczy przed”.

Ma to dodatkową zaletę bycia interaktywnym (chyba że się naciska !, co powoduje, że query-regexp-replaceodtąd wszystko zastępuje się bez dalszych pytań).

Mbork
źródło
1
Dlaczego opinie negatywne?
mbork,
0

I jeszcze jedna możliwość:

F3C-aC-3C-dC-nF4

rejestruje makro klawiatury, mówiąc w zasadzie „przejdź do początku linii, usuń trzy znaki i przejdź do następnej linii”. Następnie możesz odtworzyć go do końca bufora przez C-uF4lub C-xC-krzastosować do linii w regionie. Ma to jedną wadę: pęknie, gdy jakaś linia ma mniej niż 3 znaki.

Mbork
źródło
-1

Jeśli jest to tylko linia, którą możesz przełączyć na char z Mz, zakładając, że znak nie jest powtarzany między punktem a tym, który chcesz usunąć. W niektórych przypadkach jest to szybsze niż tworzenie regionu.

Willyfrog
źródło