Як інвертувати виділення в vim?


12

Після вибору діапазону рядків з V Команда, я хотів би видалити кожен рядок файлу, який НЕ вибрано, так це спосіб інвертувати виділення - вибрати кожен рядок, який не вибрано?

Любіть як

:g!/FOO/d

видаляє кожен рядок, який виконує НЕ містити FOO .

Якщо я мав на увазі діапазон і хотів би використовувати його зворотний:

'a,'b

Мені потрібно використовувати два діапазони:

1,'a-1

і

'b+1,$

Я підозрюю, що це не можна зробити за один крок - але було б добре!


так що ви хочете операцію "обрізати"?
quack quixote

Відповіді:


7

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

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

потім, після вибору діапазону у візуальному режимі, просто натисніть <F4> для запуску асоційованої команди. Команду можна легко пояснити:

  • " : "Введіть режим командного рядка."
  • " <C-U> Msgstr "Видалити всі символи між позицією курсора і початком рядка. \ T
  • " 1,'<-1 "Вкажіть діапазон від першого рядка до рядка перед початком поточного вибору.
  • " :delete<CR> "Видалити (раніше вказаний діапазон рядків).
  • " :'>+1,$:delete<CR> "Видалити рядки в діапазоні" '>+1,$ від лінії після закінчення виділення до кінця файлу.

2
просто щоб пояснити це: 1, '& lt; - 1 - це діапазон від рядка 1 до початку вибору. '& gt; + 1, $ - діапазон від 1 рядка після вибору до кінця ...
akira

Чи є спосіб зробити це за допомогою лише однієї команди "видалити"?
Kevin Panko

1
@Kevin Panko: потрібно об'єднати діапазони в один вираз. Я подивився на документи і я не думаю, що діапазон синтаксису підтримує таку річ. vimdoc.sourceforge.net/htmldoc/cmdline.html#cmdline-ranges ,,, vim.wikia.com/wiki/Ranges
quack quixote

15
  1. виберіть текст
  2. "*yggdG"*p що означає ...

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

9
ygg "_dGP є однаковим, але коротшим.
Kevin Panko

1
врешті-решт ви отримаєте той самий текст, правда :)
akira

Я хотів би просто звернутися до akira і Кевін Panko відповіді (я не можу додати коментарі). "[o] pposite [d] elete в (v) isual режимі vmap від ygg" _dGP
Marcin Rogacki

Плагіни люблять github.com/maxbrunsfeld/vim-yankstack полегшити цей підхід. Вам не доведеться хвилюватися стільки про ваш реєстр, що набирає голову, так і видаляти.
Jack O'Connor

як це можна додати як відображення клавіатури .vimrc ? Я спробував кілька спроб, але ще не отримав. Мої спроби були map <F4> n"*yggdG"*p і nmap <F4> "*yggdG"*p
Brad Parks

6

Просто для нащадків:

: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.