В vim мне часто приходится удалять (или копировать) большие блоки текста. Можно подсчитать строки текста и сказать (например) 50dd, чтобы удалить 50 строк.
Но как бы удалить этот большой блок текста, не зная, сколько строк удалить?
В vim мне часто приходится удалять (или копировать) большие блоки текста. Можно подсчитать строки текста и сказать (например) 50dd, чтобы удалить 50 строк.
Но как бы удалить этот большой блок текста, не зная, сколько строк удалить?
Я не вим-гуру, но то, что я использую в этом случае, - это "визуальный режим". В командном режиме введите V (capital). Затем переместите вверх/вниз, чтобы выделить блок, который вы хотите удалить (все обычные команды перемещения работают). Затем удалите его с помощью x или d.
Перейдите в стартовую строку и введите m a (отметьте "a" ). Затем перейдите к последней строке и введите d ' a (удалить, чтобы отметить "a" ).
Это приведет к удалению всех строк от текущего до отмеченного (включительно). Он также совместим с vi, а также vim, во избежание того, что ваша среда не будет благословлена последним.
Вы также можете использовать визуальный режим (некоторые команды также можно использовать с опцией удаления)
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                  
Здесь есть много лучших ответов, но для полноты я упомянул метод, который я использовал, прежде чем читать некоторые из замечательных ответов, упомянутых выше.
Предположим, вы хотите удалить строки 24-39. Вы можете использовать команду ex
:24,39d
Вы также можете вытягивать линии, используя
:24,39y
И найдите и замените только строки 24-39, используя
:24,39s/find/replace/g
Если вы включаете номера строк с помощью set number, вы можете просто dNNG, который будет удалять строку NN из текущей позиции. Таким образом, вы можете перейти к началу строки, которую хотите удалить, и просто d50G, считая, что это последняя строка, которую вы хотите удалить.
Это зависит от того, что такое большой блок. Возможно, вы просто хотите удалить абзац, в каком случае будет выполняться a dip.
Существует несколько возможностей, что лучше всего зависит от текста, над которым вы работаете.
Приходят на ум две возможности:
V, S-V,
...), выберите текст с помощью курсора
перемещение и нажмите ddapЕсли весь экран виден на экране, вы можете использовать настройку relativenumber. См.: help relativedumber. Доступно в 7.3
Вы можете поместить курсор в начало или конец блока и ввести визуальный режим (shift-v). Затем просто перемещайтесь вверх или вниз, пока не будет выделен нужный блок. Наконец, скопируйте текст, нажав y или отрежьте текст, нажав d.
Подсчет строк слишком утомительный для меня, но подсчет "абзацев" не так уж плох. '{' и '}' переместите курсор в первую пустую строку до и после курсора, соответственно. Операции перемещения курсора можно объединить с удалением, а несколько других ответов использовали аналогичный подход (dd для строки, dG для конца документа и т.д.),
Например:
/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */
Lorem *ipsum(void) {
  return dolor(sit, amet);
}
Если ваш курсор начинается над блоком комментариев, 'd}' удаляет блок комментариев, а 'd2}' удаляет как блок комментариев, так и блок кода. Если ваш курсор начинается ниже блока кода, 'd {' удаляет код, а 'd2 {' удаляет оба. Конечно, вы можете пропустить один блок, сначала перемещая курсор: '{d {' или '} d}'.
Если вы согласны с вашими пробелами или можете сразу рассмотреть абзацы, это должно сработать. Файл справки Vim содержит больше трюков для курсоров, если вам интересно.
Наряду с другими движениями, которые уже упомянуты здесь, существует также движение /{pattern}<CR>, поэтому, если вы знаете, что хотите удалить строку, содержащую foo, вы можете сделать dV/foo<CR>. V здесь, чтобы заставить движение быть линейным, потому что по умолчанию / является символьным.
Вы также можете ввести очень большое число, а затем нажмите dd, если вы хотите удалить все строки под курсором.
Предполагая, что ваш курсор находится в начале блока:
V/^$<CR>d (where <CR> is the enter/return key)
V/^$<CR>dБолее надежное решение:
:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d
:set nowrapscand (к следующим командам):  :nnoremap DV/^\s*$\\|\%$<CR>d