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



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



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

947   13  
vim

13 ответов:

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

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

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

вы также можете использовать визуальный режим (некоторые команды также можно использовать с опцией удаления) vipvap выберите пункт 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, ...), выделите текст курсором движение и нажмите d
  • исключить целый абзац со словами:dap

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

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

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

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

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

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

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

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

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

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

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

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

объяснение

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

более надежный решение:

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

объяснение

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

Comments

    Ничего не найдено.