Я хочу передать выделенный текст по каналу к оболочке, управляют и получают короткий вывод от этой команды оболочки на информации/командной строке энергии?
Что я действительно пытаюсь сделать: Передайте выделенный текст по каналу к команде оболочки pastebin-типа, и я хочу получить вывод оболочки cmd (который является ссылкой http на pastebin). Действительно ли это возможно?
Я бы сделал это так:
Поместите эту функцию в вашем vimrc:
function Test() range
echo system('echo '.shellescape(join(getline(a:firstline, a:lastline), "\n")).'| pbcopy')
endfunction
Это позволит вам вызвать эту функцию, выполнив:
:'<,'>call Test()
Затем вы также можете отобразить это следующим образом (прямо под объявлением функции в вашем vimrc):
com -range=% -nargs=0 Test :<line1>,<line2>call Test()
Таким образом, вы можете вызвать функцию, выполняющую это:
:'<,'>Test
Примечание: : <','>
- это селекторы диапазона, для их создания просто выберите соответствующие строки в визуальном режиме и затем перейдите в командный режим (нажав клавишу с двоеточием)
Может быть, стоит использовать что-то вроде
:echo system('echo '.shellescape(@").' | YourCommand')
. Начиная с какой-то версии vim-7.4, лучше использовать
:echo system('YourCommand', getreg('"', 1, 1))
. По сути, это единственный способ сохранить нулевые байты нетронутыми, если они присутствуют в файле. Передача @ "
тем или иным способом преобразует байты NUL в NL (новая строка).
Другой ответ:
function Pastebin() range
let savedreg=@"
silent execute a:firstline.",".a:lastline."yank"
python import vim, subprocess
python p=subprocess.Popen(["pastebin"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
python p.stdin.write(vim.eval('@"'))
let @"=savedreg
python p.stdin.close()
python retstatus=p.poll()
python print p.stdout.read()
endfunction
Требуется поддержка Python. Используйте его так же, как функцию матиаса.
Просто выделите строки, используя визуальную строку select shift-v, нажмите:! и введите команду, которой вы хотите отправить команды. Полученный результат заменит выбранный вами текст.
Когда вы вводите свою команду, она отображается внизу как:
:'<,'>!somecmd
'<,'> указывает, что диапазон, который вы визуально выбрали, будет передан команде, указанной после!