выполнить команду для нескольких строк в VIM - PullRequest
8 голосов
/ 20 июля 2011

Часто используемая функция VIM для меня - это фильтрация файла (или выделения текста) с помощью внешней команды и замена выбора на результат, например:

:'<,>'!sort

, поэтому

c
b
a

будет отсортировано и приведет к

a
b
c

Также возможно заменить текущую строку возвращаемым значением внешней команды, например:

:,!ls | wc -l

будетвведите количество файлов в текущем каталоге (в моем случае, например:)

41

Но есть ли способ передать строку в команду для оболочки?Например, это может быть содержимое моего визуального выбора:

line_x
line_y
line_z

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

my_bash_command line_x -c -e -f
my_bash_command line_y -c -e -f
my_bash_command line_z -c -e -f

Каков наилучший способ сделать это?

Ответы [ 3 ]

10 голосов
/ 20 июля 2011

Я предлагаю вам использовать xargs -L1

Пример:

:%!xargs -L1 wc -l

В основном xargs [cmd] запустит следующие [cmd] с несколькими параметрами из нескольких строк.Но с аргументом -L1 для каждой строки будет выполняться команда [cmd].

Если вам необходимо задать определенный порядок аргументов для вашей команды, вы можете использовать xargs '* -Iвозможность предоставить шаблон для замены списком аргументов.

Пример:

:%!xargs -L1 -I {} rake {} --trace

Если вы чувствуете очень предприимчивых, вы можете просто выполнить код прямо так:

:%!bash
2 голосов
/ 20 июля 2011
echo map(getline("'<", "'>"), 'system(v:val)[:-2]')

:h map()
:h system()
" [:-2] ~> chomp

Вы можете использовать функции вставки строки вместо :echo, если хотите (:put, setline() и т. Д.).

1 голос
/ 20 июля 2011

Макрос, вероятно, самый простой способ. Поместите курсор в начало первой строки и запишите, что делаете это для одной строки. Затем вы можете запустить макрос по многим строкам. Например, это передаст arg в echo и заменит результаты в строку с аргументом. Введите их курсором где-то в первой строке команд.

qa0y$:r!echo <C-r>"<Enter>kddjq

Эта строка записывает макрос в регистр a (qa), перемещается в начало строки (0), копирует всю строку (y $), переходит в режим командной строки (:), считывает результат выполнения команда в строке ниже вашей (r! echo ....), Cr с последующим «вставляет ваш текст в команду: r, k возвращает вас к исходной строке, dd удаляет строку, j перемещает вас к Следующая строка (должна содержать вашу следующую команду), а затем остановил запись (q).

Теперь вы можете запускать макрос в каждой строке, нажимая @a (после выполнения этого один раз @@ повторяет последний запущенный макрос) или нажимая число раз, когда вы хотите запустить макрос 5 @ a. Или еще лучше выделите строки и нажмите: норма! @ А

Это выглядит много, когда вы печатаете, но когда вы привыкаете к макросам, они экономят время. В основном вы делаете то, что хотите, в первой строке, а затем vim повторяет ваши нажатия клавиш снова и снова. Нужно немного потренироваться, чтобы увидеть проблему как набор повторяющихся задач, но разве это не то, что мы умеем делать в любом случае:)

...