Как инвертировать выделение в vim?


12

После выбора диапазона строк с помощью Vкоманды я хотел бы удалить каждую строку файла, которая НЕ выбрана, поэтому есть ли способ инвертировать выделение - выбрать каждую строку, которая не выделена?

Например как

:g!/FOO/d

удаляет каждую строку, которая НЕ содержит FOO .

Если бы я имел в виду диапазон и хотел бы использовать его инверсию:

'a,'b

Мне нужно будет использовать два диапазона:

1,'a-1

и

'b+1,$

Я подозреваю, что это не может быть сделано за один шаг - но это было бы хорошо!


так вы хотите операцию в стиле "обрезка"?
шарлатан-кихот

Ответы:


7

Сначала создайте следующее отображение (например, привязанное к <F4>ключу)

map <F4> :<C-U>1,'<-1:delete<CR>:'>+1,$:delete<CR>

затем, после выбора диапазона в визуальном режиме, просто нажмите, <F4>чтобы вызвать соответствующую команду. Команду легко объяснить по частям:

  • " :" Войдите в режим командной строки.
  • " <C-U>" Удалить все символы между позицией курсора и началом строки.
  • 1,'<-1Msgstr " " Укажите диапазон от первой строки файла до строки перед началом текущего выбора.
  • « :delete<CR>» Удалить (ранее указанный диапазон строк).
  • :'>+1,$:delete<CR>Msgstr " " Удалить строки в диапазоне " '>+1,$", то есть от строки после конца выделения до конца файла.

2
просто чтобы объяснить это: 1, '<- 1 - диапазон от строки 1 до начала выбора. '> + 1, $ - диапазон от 1 строки после выбора до конца ...
akira

Есть ли способ сделать это с помощью только одной команды «удалить»?
Кевин Панко

1
@Kevin Panko: вам нужно объединить диапазоны в одно выражение. Я посмотрел на документы, и я не думаю, что синтаксис диапазона поддерживает такую ​​вещь. vimdoc.sourceforge.net/htmldoc/cmdline.html#cmdline-ranges ,,, vim.wikia.com/wiki/Ranges
шарлатан-кихот

15
  1. выберите свой текст
  2. "*yggdG"*p что значит ...

    "*y    " yank it to the selection register
    ggdG   " delete everything
    "*p    " and paste the selection again 
    

9
ygg "_dGP то же самое, но короче.
Кевин Панко

1
в конце концов, вы получите тот же текст, правда :)
Акира

Я хотел бы просто сослаться на ответы Акиры и Кевина Панко (я не могу добавлять комментарии). «[o] pposite [d] elete в (v) обычном режиме vmap od ygg» _dGP
Марцин Рогацки

Плагины, такие как github.com/maxbrunsfeld/vim-yankstack, упрощают этот подход. Вам не нужно сильно беспокоиться о том, что ваш янк-регистр сработал при удалении.
Джек О'Коннор

как это можно добавить как раскладку клавиатуры .vimrc? Я попробовал несколько попыток, но пока не получил. Мои попытки были map <F4> n"*yggdG"*p иnmap <F4> "*yggdG"*p
Брэд Паркс

7

Просто для потомков:

:v/\%V/d

Это делает обратную глобальную строку, которая не является частью выделения. Обратите внимание, что: v является линейной конструкцией, поэтому любая строка, содержащая выбор, будь то выбор строки, потока или блока, будет избавлена ​​от удаления.


1

поскольку «инвертирование» означает в основном создание «множественных выборок» (область до и после исходного выбора), я снова провел поиск vimscripts http://www.vim.org/scripts/script.php?script_id=953 . попробуй это.

 There are a number of operations to very
 easily manipulate selections such as modifying 
 the regions (add/delete/inverte/clear), hiding, 
 refreshing, saving and restoring etc."
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.