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

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

Вы также можете использовать визуальный режим (некоторые команды также можно использовать с опцией удаления) 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                  

Ответ 4

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

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

:24,39d

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

:24,39y

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

:24,39s/find/replace/g

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

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

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

Если вы согласны с вашими пробелами или можете сразу рассмотреть абзацы, это должно сработать. Файл справки Vim содержит больше трюков для курсоров, если вам интересно.

Ответ 11

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

Ответ 12

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

Ответ 13

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

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

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

Объяснение

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

привязка клавиш

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

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

Объяснение

  • Отключить перенос поиска: :set nowrapscan
  • Верните ключ d (к следующим командам): :nnoremap D
  • Введите "linquise-visual" режим: V
  • Выделите до следующей пустой/пробельной строки или EOF: /^\s*$\\|\%$<CR>
  • Удалить: d