vim - Как удалить большой блок текста без подсчета строк? - PullRequest
189 голосов
/ 19 марта 2011

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

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

Ответы [ 13 ]

288 голосов
/ 19 марта 2011

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

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

280 голосов
/ 19 марта 2011

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

44 голосов
/ 19 марта 2011

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

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

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

:24,39d

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

:24,39y

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

:24,39s/find/replace/g
11 голосов
/ 20 марта 2011

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

10 голосов
/ 19 марта 2011

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

7 голосов
/ 19 марта 2011

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

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

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

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

3 голосов
/ 29 октября 2015

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

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

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

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

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

3 голосов
/ 19 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...