В 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
,
...), выберите текст с помощью курсора
перемещение и нажмите d
dap
Если весь экран виден на экране, вы можете использовать настройку 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 nowrapscan
d
(к следующим командам): :nnoremap D
V
/^\s*$\\|\%$<CR>
d