vim - Как удалить большой блок текста без подсчета строк?


193

В vim я часто удаляю (или копирую) большие блоки текста. Можно посчитать строки текста и сказать (например), 50ddчтобы удалить 50 строк.

Но как удалить этот большой блок текста, не зная, сколько строк удалить?


1
Если окно достаточно велико, здесь полезна относительная нумерация строк. Поместите курсор в верхнюю часть окна, найдите относительный номер последней удаляемой строки (скажем, n), добавьте одну, затем введите этот номер, затем введите dd. Например, если n = 50, то 51dd. В качестве альтернативы, используйте команду движения -50d<down arrow>
BallpointBen

«Найти относительный номер строки» - или, используйте, :set rnuи Vim сделает это мгновенно! Строка, на которой вы находитесь, по-прежнему будет иметь абсолютную нумерацию, но строки над и под курсором будут симметрично пронумерованы 1, 2, ... (и будут обновляться при перемещении курсора, событиях на уровне файлов и т. Д.)
Джон П.

Ответы:


287

Я не гуру вим, но в этих обстоятельствах я использую «визуальный режим». В командном режиме введите V(заглавная). Затем двигайтесь вверх / вниз, чтобы выделить блок, который вы хотите удалить (все обычные команды перемещения работают). Затем удалите его с помощью xили d.


2
Странный. Я знаю, что это работает для меня (TM) здесь, в Linux (vim 7.3.50) и с gVim в Windows. И, судя по другим ответам, работает на других людей. Может быть, какие-то настройки в вашей .vimrcзаставляют это действовать?
Мат

Хорошо, по какой - то причине я не понимал , что вы могли бы войти в режим визуального линии с использованием Shift- v... Я пытался использовать CTRLключ , а также. Так что это работает и, вероятно, самый удобный способ.
Джастин Этьер

7
Вы можете уточнить, что существует два визуальных режима - Visual Line ( CTRL- v) и Visual Block ( Shift- v).
Джастин Этье

2
Я делаю это много. Но я всегда считаю это обманом и неидеальной идеей.
Джим Митченер

9
На самом деле существует три визуальных режима: визуальный режим (на основе символов {v}), визуальный линейный режим (на основе строк {Sv}) и режим визуальных блоков (позволяет выбирать блоки {Cv})
Том Регнер,

293

Перейдите на стартовую строку и наберите ma(отметьте «а»). Затем перейдите к последней строке и введите d'a(удалить, чтобы пометить «а»).

Это удалит все строки от текущей до отмеченной (включительно). Он также совместим с vi, а также vim, на всякий случай , что среда не благословлен с последним.


3
Это долбанные камни! Ненавижу, как долго я просто что-то делаю (например, считаю строки), прежде чем искать лучшее решение. Спасибо!
ryanjdillon

1
действительно здорово, я всегда использую визуальный режим, чтобы удалить блок, но этот способ лучше +1
hish

4
Я обнаружил, что это более полезно, чем визуальный режим для удаления строк с разрешением более 500 тыс.
Майкл - Где Клэй Ширки,

Действительно практичный ответ. Я использую его для /var/mail/usernameмассового удаления писем на моем сервере из файла , оставляя последние письма без изменений. Я делаю отметку, затем я ввожу, например, 50000затем, ggчтобы перейти к строке 50.000, затем я удаляю все промежуточные строки. работает как шарм!
otmezger

1
@ Horta, я, вероятно, не буду использовать vimв качестве инструмента для редактирования гигабайтных файлов - я бы предпочел инструменты для обработки текста, такие как awkи его братья :-)
paxdiablo

46

Вы можете использовать визуальный режим также (некоторые команды могут использоваться с опцией удаления также) , vip vapчтобы выбрать пункт, v2apчтобы выбрать один из двух параграфов dapработы, d2apтакже. Вы можете удалить внутри блоков [ ]какda[

Для справки: типы объектов. Из документации vim: раздел 4. http://vimdoc.sourceforge.net/htmldoc/visual.html

4. Operating on the Visual area             *visual-operators*

...    
The objects that can be used are:
aw  a word (with white space)           
iw  inner word                  
aW  a WORD (with white space)           
iW  inner WORD                  
as  a sentence (with white space)           
is  inner sentence                  
ap  a paragraph (with white space)          
ip  inner paragraph                 
ab  a () block (with parenthesis)           
ib  inner () block                  
aB  a {} block (with braces)            
iB  inner {} block                  
a<  a <> block (with <>)                
i<  inner <> block                  
a[  a [] block (with [])                
i[  inner [] block                  

1
да [, да {, да "все полезное для программистов
Рене Вуллер

1
Спасибо! dapочень легко запомнить, как «удалить абзац»
Тропилио

38

Здесь есть много лучших ответов, но для полноты я упомяну метод, который я использовал, прежде чем читать некоторые из замечательных ответов, упомянутых выше.

Предположим, вы хотите удалить из строк 24-39. Вы можете использовать команду ex

:24,39d

Вы также можете дергать линии, используя

:24,39y

И найти и заменить чуть более строк 24-39, используя

:24,39s/find/replace/g

11

Если вы включите номера строк через, set numberвы можете просто dNNGудалить строку NN из текущей позиции. Таким образом, вы можете перейти к началу строки, которую хотите удалить, и просто d50Gпредположить, что это последняя строка, которую вы хотите удалить.


10

Это зависит от того, что это за большой блок . Может быть, вы просто хотите удалить абзац, в этом случае dipбудет делать.


Спасибо за чаевые. К сожалению, я работаю с кодом здесь, и обычно требуется более детальный контроль, чем это.
Джастин Этьер,

1
Я тоже работаю с кодом и разделяю логические блоки пустой строкой. Этот совет только что сделал мой день. Теперь я могу удалить большие блоки логики с помощью трех нажатий клавиш.
miniml

это работает, потому что «d» означает удаление, «p» в этом контексте означает абзац
user98761

7

Есть несколько возможностей, что лучше всего зависит от текста, над которым вы работаете.

На ум приходят две возможности:

  • переключатель в визуальном режиме ( V, S-V, ...), выделите текст с движением курсора и нажмитеd
  • удалить весь абзац с помощью: dap

теперь я очень часто использую dap, когда я знаю об этом, и предпочитаю, чтобы он dis и dip, но он всегда удаляет блок и пустую строку, которая идет после блока, но это был способ удалить блок и пустую строку, которая предшествует этому?
Funkodebat

В середине текста с абзацами нет синтаксической разницы в результате, не так ли? Если есть, я предлагаю написать, что вы хотите, с примерами, в новом вопросе.
Том Регнер

6

Если весь блок виден на экране, вы можете использовать настройку относительного номера. Смотрите: помогите относительный номер. Доступно в 7.3


Я не осознавал, насколько это полезно: до тех пор, пока я не начал его использовать - это было полезно - отлично подходит как для 50dd, так и для навигации, 50j
rshdev

3

Вы можете поместить курсор в начало или конец блока и войти в визуальный режим (shift-v). Затем просто двигайтесь вверх или вниз, пока не будет выделен нужный блок. Наконец, скопируйте текст, нажав y, или обрежьте текст, нажав d.


может быть странно, но из этого я понял, как выбрать текст в некоторой желаемой средней точке строки и выбрать несколько строк ниже в одной и той же точке до конца каждой строки. Именно то, что я искал.
nanker

3

Наряду с другими движениями, которые уже упомянуты здесь, есть также /{pattern}<CR>движение, поэтому, если вы знаете, что хотите удалить строку, содержащую foo, вы можете это сделать dV/foo<CR>. Vздесь, чтобы заставить движение быть линейным, потому что по умолчанию /это символьно.


3

Считать строки слишком утомительно для меня, но считать «абзацы» не так уж и плохо. «{» и «}» перемещают курсор на первую пустую строку перед и после курсора соответственно. Операции перемещения курсора могут быть объединены с удалением, и несколько других ответов использовали аналогичный подход (dd для строки, dG для конца документа и т. Д.)
Например:

/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */

Lorem *ipsum(void) {
  return dolor(sit, amet);
}

Если ваш курсор начинается над блоком комментариев, «d}» удаляет блок комментариев, а «d2}» удаляет как блок комментария, так и блок кода. Если ваш курсор начинается ниже блока кода, «d {» удаляет код, а «d2 {» удаляет оба. Конечно, вы можете пропустить один блок, сначала переместив курсор: '{d {' или '} d}'.

Если вы согласны со своим пробелом или можете сразу посчитать абзацы, это должно сработать. В файле справки Vim есть дополнительные хитрости курсора, если вам интересно.


1

Вы также можете ввести очень большое число, а затем нажать, ddесли хотите удалить все строки под курсором.


Это может быть даже проще в использовании dG, который удаляет до конца документа, так как по Gумолчанию идет к последней строке.
andyg0808

1

Удаление блока текста

Предполагая, что ваш курсор находится в начале блока:

V/^$<CR>d (where <CR> is the enter/return key)

объяснение

  • Войдите в «визуально-визуальный» режим: V
  • Выделите до следующей пустой строки: /^$<CR>
  • Удалить: d

Связывание ключей

Более надежное решение:

:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d

объяснение

  • Отключить обтекание поиска: :set nowrapscan
  • Переопределите Dключ (для следующих команд)::nnoremap D
  • Войдите в «визуально-визуальный» режим: V
  • Выделите до следующей пустой строки / пробела или EOF: /^\s*$\\|\%$<CR>
  • Удалить: d
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.