Выбор линии в VIM - PullRequest
3 голосов
/ 21 апреля 2009

Как выбрать все строки, которые не содержат слова "привет" в VIM? Мне нужно, чтобы оно было выдернуто, а затем сохранено в файл. Как мне это сделать? Я ищу что-то вроде:

: v /! (Привет)> файл

Ответы [ 10 ]

11 голосов
/ 21 апреля 2009
:g!/hello/ yank A

Строки теперь хранятся в регистре a, чтобы вставить их, выполните "ap

Edit: Может быть сокращено до

:g!/hello/y A

Для тех, кому интересно, что это значит для vim:

: g = глобальный поиск
! = отрицание логического теста, следующего за
/ hello / = регулярное выражение для соответствия "hello"
y = команда для выполнения на каждой совпавшей строке, в этом случае «yank»
A = зарегистрировать аргумент для команды "yank". В этом случае регистр 'a', но в форме заглавных букв, означает добавление к регистру, а не замену.

9 голосов
/ 21 апреля 2009

Если в вашей системе grep, вы можете использовать эту команду:

:!grep -v hello % > file
6 голосов
/ 21 апреля 2009

Альтернатива, о которой я не упоминал, - это редирект.

Так что для вашего случая это будет

:redir > file
:g!/hello/
:redir END

Смотрите также

:help redir
:help verbosefile
5 голосов
/ 21 апреля 2009

Я обычно делаю это с некоторым изменением

:g/hello/d

т.е. удалите все, что содержит "привет", затем выберите, дергайте или что-то еще, что нужно сделать, и, наконец, вернитесь назад, нажав кнопку. Я считаю, что это менее затратно для ума, чем создание каналов командной строки.

4 голосов
/ 21 апреля 2009

FGM ответ был почти там

: v выберет строки, которые НЕ соответствуют

поэтому следующие строки добавят строки, не содержащие «hello», в файл с именем eee, создав его при необходимости.

:v/hello/ . w!>>eee
1 голос
/ 04 августа 2009

Довольно прямо;

:v/hello/ |redir >> file
1 голос
/ 21 апреля 2009

Выберите и напишите в новый файл:

:g/hello/ . w!>> file 
0 голосов
/ 30 июля 2009

Пример визуального выбора и копирования: Предположим, вы хотите отделить деталь:

  1. визуально выберите его и нажмите ":"

  2. , затем используйте команду:

    : '<,'>! > ../new_file_in_a_subdirectory

Ошибка: цвета будут скопированы в файл, и на самом деле это не копирование, а вырезание и вставка.

0 голосов
/ 30 июля 2009

Практический пример с фрагментом Blixtor: Отправка по электронной почте друзьям, потерянным с ": verbosefile".

I. откройте руководство ": e / tmp / new_file" и ": h verbosefile", затем давайте скопируем подсказку blixtor:

:redir > /tmp/verbosefile_instructions
:g/verbosefile/
:redir END

II. подтвердите, что вы следуете стандартным правилам, касающимся длины ваших писем, и отправьте стандартные приветствия:

:match ErrorMsg /\%>73v.\+/
:so /bin/greetings.vim

III. Отправить файл с Mutt.

0 голосов
/ 21 апреля 2009

После команды Vim

:let @a='' | g!/hello/normal "Ayy

у вас будут все строки, у которых нет 'hello' в регистре 'a'. Вы можете вставить его значение командой "ap normal" или поместить это значение в системный буфер обмена с помощью

:let @*=@a

И затем вы можете использовать «Ctrl + V» в Windows или «Cmd + V» в Mac OS или «средний щелчок мыши» в Linux, чтобы вставить текст.

Краткое описание магии:

@ a - это переменная Vim, связанная со значением, хранящимся в регистре 'a'.
"ap , " bp , "cp , .. - это комбинация клавиш в нормальном режиме Vim для вставки значения из определенного регистра.
@ * - это переменная Vim, связанная с системным буфером обмена.
let @ * = @ a помещает значение из регистра 'a' в системный буфер обмена.

Добавьте это в ваш .vimrc или создайте файл без директории плагина.

function s:copy_unmathced_lines(pattern)
   let result_lines = []

   for line in getline(1, '$')
      if line !~ a:pattern
         call add(result_lines, line)
      endif
   endfor

   let @* = join(result_lines, "\n")
endfunction

command -nargs=1 CopyUnmatchedLines call s:copy_unmathced_lines(<q-args>)

Вариант использования прост:

CopyUnmatchedLines hello

, а затем просто используйте команду вставки в любом редакторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...