Если окно достаточно велико, здесь полезна относительная нумерация строк. Поместите курсор в верхнюю часть окна, найдите относительный номер последней удаляемой строки (скажем, n), добавьте одну, затем введите этот номер, затем введите dd. Например, если n = 50, то 51dd. В качестве альтернативы, используйте команду движения -50d<down arrow>
BallpointBen
«Найти относительный номер строки» - или, используйте, :set rnuи Vim сделает это мгновенно! Строка, на которой вы находитесь, по-прежнему будет иметь абсолютную нумерацию, но строки над и под курсором будут симметрично пронумерованы 1, 2, ... (и будут обновляться при перемещении курсора, событиях на уровне файлов и т. Д.)
Джон П.
Ответы:
287
Я не гуру вим, но в этих обстоятельствах я использую «визуальный режим». В командном режиме введите V(заглавная). Затем двигайтесь вверх / вниз, чтобы выделить блок, который вы хотите удалить (все обычные команды перемещения работают). Затем удалите его с помощью xили d.
Странный. Я знаю, что это работает для меня (TM) здесь, в Linux (vim 7.3.50) и с gVim в Windows. И, судя по другим ответам, работает на других людей. Может быть, какие-то настройки в вашей .vimrcзаставляют это действовать?
Мат
Хорошо, по какой - то причине я не понимал , что вы могли бы войти в режим визуального линии с использованием Shift- v... Я пытался использовать CTRLключ , а также. Так что это работает и, вероятно, самый удобный способ.
Джастин Этьер
7
Вы можете уточнить, что существует два визуальных режима - Visual Line ( CTRL- v) и Visual Block ( Shift- v).
Джастин Этье
2
Я делаю это много. Но я всегда считаю это обманом и неидеальной идеей.
Джим Митченер
9
На самом деле существует три визуальных режима: визуальный режим (на основе символов {v}), визуальный линейный режим (на основе строк {Sv}) и режим визуальных блоков (позволяет выбирать блоки {Cv})
Том Регнер,
293
Перейдите на стартовую строку и наберите ma(отметьте «а»). Затем перейдите к последней строке и введите d'a(удалить, чтобы пометить «а»).
Это удалит все строки от текущей до отмеченной (включительно). Он также совместим с vi, а также vim, на всякий случай , что среда не благословлен с последним.
Это долбанные камни! Ненавижу, как долго я просто что-то делаю (например, считаю строки), прежде чем искать лучшее решение. Спасибо!
ryanjdillon
1
действительно здорово, я всегда использую визуальный режим, чтобы удалить блок, но этот способ лучше +1
hish
4
Я обнаружил, что это более полезно, чем визуальный режим для удаления строк с разрешением более 500 тыс.
Майкл - Где Клэй Ширки,
Действительно практичный ответ. Я использую его для /var/mail/usernameмассового удаления писем на моем сервере из файла , оставляя последние письма без изменений. Я делаю отметку, затем я ввожу, например, 50000затем, ggчтобы перейти к строке 50.000, затем я удаляю все промежуточные строки. работает как шарм!
otmezger
1
@ Horta, я, вероятно, не буду использовать vimв качестве инструмента для редактирования гигабайтных файлов - я бы предпочел инструменты для обработки текста, такие как awkи его братья :-)
paxdiablo
46
Вы можете использовать визуальный режим также (некоторые команды могут использоваться с опцией удаления также)
, vipvapчтобы выбрать пункт, v2apчтобы выбрать один из двух параграфов
dapработы, d2apтакже. Вы можете удалить внутри блоков []какda[
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
Спасибо! dapочень легко запомнить, как «удалить абзац»
Тропилио
38
Здесь есть много лучших ответов, но для полноты я упомяну метод, который я использовал, прежде чем читать некоторые из замечательных ответов, упомянутых выше.
Предположим, вы хотите удалить из строк 24-39. Вы можете использовать команду ex
:24,39d
Вы также можете дергать линии, используя
:24,39y
И найти и заменить чуть более строк 24-39, используя
Если вы включите номера строк через, set numberвы можете просто dNNGудалить строку NN из текущей позиции. Таким образом, вы можете перейти к началу строки, которую хотите удалить, и просто d50Gпредположить, что это последняя строка, которую вы хотите удалить.
Спасибо за чаевые. К сожалению, я работаю с кодом здесь, и обычно требуется более детальный контроль, чем это.
Джастин Этьер,
1
Я тоже работаю с кодом и разделяю логические блоки пустой строкой. Этот совет только что сделал мой день. Теперь я могу удалить большие блоки логики с помощью трех нажатий клавиш.
miniml
это работает, потому что «d» означает удаление, «p» в этом контексте означает абзац
user98761
7
Есть несколько возможностей, что лучше всего зависит от текста, над которым вы работаете.
На ум приходят две возможности:
переключатель в визуальном режиме ( V, S-V, ...), выделите текст с движением курсора и нажмитеd
теперь я очень часто использую dap, когда я знаю об этом, и предпочитаю, чтобы он dis и dip, но он всегда удаляет блок и пустую строку, которая идет после блока, но это был способ удалить блок и пустую строку, которая предшествует этому?
Funkodebat
В середине текста с абзацами нет синтаксической разницы в результате, не так ли? Если есть, я предлагаю написать, что вы хотите, с примерами, в новом вопросе.
Том Регнер
6
Если весь блок виден на экране, вы можете использовать настройку относительного номера. Смотрите: помогите относительный номер. Доступно в 7.3
Я не осознавал, насколько это полезно: до тех пор, пока я не начал его использовать - это было полезно - отлично подходит как для 50dd, так и для навигации, 50j
rshdev
3
Вы можете поместить курсор в начало или конец блока и войти в визуальный режим (shift-v). Затем просто двигайтесь вверх или вниз, пока не будет выделен нужный блок. Наконец, скопируйте текст, нажав y, или обрежьте текст, нажав d.
может быть странно, но из этого я понял, как выбрать текст в некоторой желаемой средней точке строки и выбрать несколько строк ниже в одной и той же точке до конца каждой строки. Именно то, что я искал.
nanker
3
Наряду с другими движениями, которые уже упомянуты здесь, есть также /{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 есть дополнительные хитрости курсора, если вам интересно.
51dd
. В качестве альтернативы, используйте команду движения -50d<down arrow>
:set rnu
и Vim сделает это мгновенно! Строка, на которой вы находитесь, по-прежнему будет иметь абсолютную нумерацию, но строки над и под курсором будут симметрично пронумерованы 1, 2, ... (и будут обновляться при перемещении курсора, событиях на уровне файлов и т. Д.)Ответы:
Я не гуру вим, но в этих обстоятельствах я использую «визуальный режим». В командном режиме введите
V
(заглавная). Затем двигайтесь вверх / вниз, чтобы выделить блок, который вы хотите удалить (все обычные команды перемещения работают). Затем удалите его с помощьюx
илиd
.источник
.vimrc
заставляют это действовать?Shift
-v
... Я пытался использоватьCTRL
ключ , а также. Так что это работает и, вероятно, самый удобный способ.CTRL
-v
) и Visual Block (Shift
-v
).Перейдите на стартовую строку и наберите ma(отметьте «а»). Затем перейдите к последней строке и введите d'a(удалить, чтобы пометить «а»).
Это удалит все строки от текущей до отмеченной (включительно). Он также совместим с
vi
, а такжеvim
, на всякий случай , что среда не благословлен с последним.источник
/var/mail/username
массового удаления писем на моем сервере из файла , оставляя последние письма без изменений. Я делаю отметку, затем я ввожу, например,50000
затем,gg
чтобы перейти к строке 50.000, затем я удаляю все промежуточные строки. работает как шарм!vim
в качестве инструмента для редактирования гигабайтных файлов - я бы предпочел инструменты для обработки текста, такие какawk
и его братья :-)Вы можете использовать визуальный режим также (некоторые команды могут использоваться с опцией удаления также) , vip vapчтобы выбрать пункт, v2apчтобы выбрать один из двух параграфов dapработы, d2apтакже. Вы можете удалить внутри блоков
[
]
какda[Для справки: типы объектов. Из документации vim: раздел 4. http://vimdoc.sourceforge.net/htmldoc/visual.html
источник
dap
очень легко запомнить, как «удалить абзац»Здесь есть много лучших ответов, но для полноты я упомяну метод, который я использовал, прежде чем читать некоторые из замечательных ответов, упомянутых выше.
Предположим, вы хотите удалить из строк 24-39. Вы можете использовать команду ex
Вы также можете дергать линии, используя
И найти и заменить чуть более строк 24-39, используя
источник
Если вы включите номера строк через,
set number
вы можете простоdNNG
удалить строку NN из текущей позиции. Таким образом, вы можете перейти к началу строки, которую хотите удалить, и простоd50G
предположить, что это последняя строка, которую вы хотите удалить.источник
Это зависит от того, что это за большой блок . Может быть, вы просто хотите удалить абзац, в этом случае dipбудет делать.
источник
Есть несколько возможностей, что лучше всего зависит от текста, над которым вы работаете.
На ум приходят две возможности:
V
,S-V
, ...), выделите текст с движением курсора и нажмитеd
dap
источник
Если весь блок виден на экране, вы можете использовать настройку относительного номера. Смотрите: помогите относительный номер. Доступно в 7.3
источник
Вы можете поместить курсор в начало или конец блока и войти в визуальный режим (shift-v). Затем просто двигайтесь вверх или вниз, пока не будет выделен нужный блок. Наконец, скопируйте текст, нажав y, или обрежьте текст, нажав d.
источник
Наряду с другими движениями, которые уже упомянуты здесь, есть также
/{pattern}<CR>
движение, поэтому, если вы знаете, что хотите удалить строку, содержащую foo, вы можете это сделатьdV/foo<CR>
.V
здесь, чтобы заставить движение быть линейным, потому что по умолчанию/
это символьно.источник
Считать строки слишком утомительно для меня, но считать «абзацы» не так уж и плохо. «{» и «}» перемещают курсор на первую пустую строку перед и после курсора соответственно. Операции перемещения курсора могут быть объединены с удалением, и несколько других ответов использовали аналогичный подход (dd для строки, dG для конца документа и т. Д.)
Например:
Если ваш курсор начинается над блоком комментариев, «d}» удаляет блок комментариев, а «d2}» удаляет как блок комментария, так и блок кода. Если ваш курсор начинается ниже блока кода, «d {» удаляет код, а «d2 {» удаляет оба. Конечно, вы можете пропустить один блок, сначала переместив курсор: '{d {' или '} d}'.
Если вы согласны со своим пробелом или можете сразу посчитать абзацы, это должно сработать. В файле справки Vim есть дополнительные хитрости курсора, если вам интересно.
источник
Вы также можете ввести очень большое число, а затем нажать,
dd
если хотите удалить все строки под курсором.источник
dG
, который удаляет до конца документа, так как поG
умолчанию идет к последней строке.Удаление блока текста
Предполагая, что ваш курсор находится в начале блока:
объяснение
V
/^$<CR>
d
Связывание ключей
Более надежное решение:
объяснение
:set nowrapscan
D
ключ (для следующих команд)::nnoremap D
V
/^\s*$\\|\%$<CR>
d
источник