Как я могу сохранить каждое совпадение в отдельном файле с Vim - PullRequest
0 голосов
/ 11 октября 2010

Я хотел бы сохранить вывод g/pattern1/,/pattern2/ в файл (для каждого совпадения - отдельный файл).

, например

def
.......
end

def
.......
end

вы получите файл для каждого "def ... end".

Пробовал с помощью tempname () примерно так:

g/pattern1/,/pattern2/exe 'w ' . tempname(), но это не удается без допустимого диапазона для exe

также пытался

g/pattern1/,/pattern2/w `tempname()`

для оценки tempname (), но это не удалось с ошибкой «слишком много имен файлов».

Чего мне не хватает? Это можно сделать с помощью глобальных и других команд, или вам понадобится vimscript для этого?

Ответы [ 2 ]

1 голос
/ 11 октября 2010
g/pattern1/,/pattern2/execute "w ".fnameescape(tempname())<CR>

Используйте execute всякий раз, когда вы хотите вставить переменную в командную строку, если это отображение. Если это не так, попробуйте использовать

g/pattern1/,/pattern2/w <C-r>=fn<Tab>e<Tab>te<Tab>)<CR><CR>

Здесь fn<Tab> с wildmode=longest,list:full расширится до fname, fnamee<Tab> увеличится до fnameescape(, te<Tab> расширится до tempname(), так что это короткий способ ввода <C-r>=fnameescape(tempname())<CR>. Вы можете опустить fnameescape, если уверены, что tempname не вернет имя файла со специальными символами.

И обратите внимание, что обратные галочки не будут выполнять функцию vimscript, они выполняют команду оболочки, поэтому &#x60;tempname()&#x60; пытается вызвать tempname() в оболочке и заменить имя файла результатом этого вызова. Согласно справке, вы должны были написать &#x60;=tempname()&#x60;.

0 голосов
/ 11 октября 2010

Попробуйте :g/pattern1/normal! :.,/pattern2/w `tempname()`^M с ^M, введенным как CTRL-V, затем ENTER

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