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, на всякий случай , что среда не благословлен с последним.

paxdiablo
источник
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                  
M'vy
источник
1
да [, да {, да "все полезное для программистов
Рене Вуллер
1
Спасибо! dapочень легко запомнить, как «удалить абзац»
Тропилио
38

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

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

:24,39d

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

:24,39y

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

:24,39s/find/replace/g
daviewales
источник
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здесь, чтобы заставить движение быть линейным, потому что по умолчанию /это символьно.

ZYX
источник
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
Джон Надаль
источник