Как удалить первые несколько n символов в каждой строке?


15

Я недавно спросил:

Как добавить префикс к каждой строке?

Итак, перейдите из кода ниже:

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

Кодировать как:

Hello
There
I am some code

Теперь, как мне удалить n символов из строки?


ИМХО это так же, как ваш предыдущий вопрос.
A_P

Ответы:


28

Это даже проще! Опять же, используйте команды прямоугольника . Переместитесь в один угол прямоугольника, который хотите удалить, нажмите, C-SPCчтобы установить метку. Переместитесь в другой угол прямоугольника и нажмите C-x r d( delete-rectangle). Например, перейдите к первой строке, по которой вы хотите действовать, нажмите C-aили, homeчтобы перейти к началу строки, перейдите к последней строке, по которой вы хотите действовать, чтобы перейти в правый нижний угол, а затем удалить.C-u number C-fC-x r d

Если в последней строке меньше нужного количества символов, может быть удобнее использовать нижний левый и верхний правый углы. Кроме того, вы можете вставить ненужные символы (это полезно, если первая и последняя строки короче).

Вы можете использовать, C-x r kчтобы убить прямоугольник, что позволит вам дергать ( C-x r y) его позже (переместитесь в верхний левый угол места, где вы хотите вставить его).

Вы также можете использовать C-x r t( string-rectangle) и ввести пустую строку.

Команды прямоугольника основаны на положениях столбцов. Если вы хотите удалить n символов, а не n столбцов (что имеет значение для многостолбцовых символов, таких как вкладки), вы можете использовать замену регулярного выражения : заменить ^.\{42\}ничем, чтобы удалить первые 42 символа каждой строки.


3
вместо того, чтобы пытаться запомнить все команды прямоугольника, вы также можете использовать Cx spc вместо C-spc, который превращает ваш регион в прямоугольник, и все просто работает.
Малабарба

1
@Malabarba Только с Emacs 24, хотя. (Пишем это на машине с Emacs 23. Их все еще очень много.)
Жиль, "ТАК ... перестань быть злым"

2
Мои соболезнования ... :-(
Малабарба

У меня это работало только в GNU Emacs 23.4.1 (x86_64-pc-linux-gnu, GTK + версия 2.24.21) 2013-10-25 на душистом перце, модифицированном Debian
davidrmcharles

4

Еще одна возможность: мне действительно нравится использовать несколько курсоров для подобных задач. Доступный package.elчерез MELPA, он стал неотъемлемой частью моего emacs. Я бы просто выбрал I said(и, возможно, включил разрыв строки перед ним), использовал M-x mc/mark-all-like-thisи был бы на моем пути. Если вы хотите более детальный контроль, вы можете использовать mc/mark-next-like-thisили mc/mark-next-lines.

Мои сочетания клавиш:

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

Обязательные Emacs Rocks! эпизод: http://emacsrocks.com/e13.html


3

Если вы cua-modeвключили, то:

  • C-a перейти к началу строки,
  • C-RET начать прямоугольник,
  • Затем двигайтесь с помощью клавиш со стрелками или любой команды emacs C-f
  • DEL удалить выделение

Я предпочитаю cua-modeспособ работы, по сравнению со стандартным прямоугольником Emacs, где эквивалент будет:

  • C-a перейти к началу строки,
  • C-SPC начать прямоугольник,
  • Затем двигайтесь с помощью клавиш со стрелками или любой команды emacs C-f
  • C-x r d удалить выделение

cua-modeСохраняет три нажатия клавиш по сравнению со стандартным Emacs прямоугольника.


3

Для полноты: удаление первых 3 символов из каждой строки (формально: из точки или в регионе) может быть выполнено путем замены регулярного выражения ^...(или, в более общем ^.\{3\}случае:) пустой строкой.

Объяснение: в регулярном выражении ^означает «начало строки», .означает «любой символ» и \{n\}означает « n повторений вещи до».

Это дает дополнительное преимущество !, заключающееся в том, что он интерактивный (если не нажимать , что делает query-regexp-replaceзамену всего без дальнейших вопросов).


1
Почему отрицательные?
mbork

0

И еще одна возможность:

F3C-aC-3C-dC-nF4

записывает макрос клавиатуры, говоря в основном: «перейти к началу строки, удалить три символа и перейти к следующей строке». Затем вы можете воспроизвести его до конца буфера C-uF4или C-xC-krприменить его к строкам в области. У этого есть один недостаток: он сломается, когда любая строка содержит менее 3 символов.


-1

Если это всего лишь строка, вы можете выполнить zz-to-char с помощью Mz, предполагая, что символ не повторяется между точкой и той, которую вы хотите удалить до. В некоторых случаях это быстрее, чем создание региона.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.