Vim: Передайте выделенный текст по каналу, чтобы окружить cmd и получить вывод на информации/командной строке энергии

Я хочу передать выделенный текст по каналу к оболочке, управляют и получают короткий вывод от этой команды оболочки на информации/командной строке энергии?

Что я действительно пытаюсь сделать: Передайте выделенный текст по каналу к команде оболочки pastebin-типа, и я хочу получить вывод оболочки cmd (который является ссылкой http на pastebin). Действительно ли это возможно?

52
задан ikwyl6 4 April 2010 в 08:04
поделиться

4 ответа

Я бы сделал это так:

Поместите эту функцию в вашем 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

Примечание: : <','> - это селекторы диапазона, для их создания просто выберите соответствующие строки в визуальном режиме и затем перейдите в командный режим (нажав клавишу с двоеточием)

17
ответ дан 7 November 2019 в 09:02
поделиться

Может быть, стоит использовать что-то вроде

:echo system('echo '.shellescape(@").' | YourCommand')

. Начиная с какой-то версии vim-7.4, лучше использовать

:echo system('YourCommand', getreg('"', 1, 1))

. По сути, это единственный способ сохранить нулевые байты нетронутыми, если они присутствуют в файле. Передача @ " тем или иным способом преобразует байты NUL в NL (новая строка).

4
ответ дан 7 November 2019 в 09:02
поделиться

Другой ответ:

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. Используйте его так же, как функцию матиаса.

1
ответ дан 7 November 2019 в 09:02
поделиться

Просто выделите строки, используя визуальную строку select shift-v, нажмите:! и введите команду, которой вы хотите отправить команды. Полученный результат заменит выбранный вами текст.

Когда вы вводите свою команду, она отображается внизу как:

:'<,'>!somecmd

'<,'> указывает, что диапазон, который вы визуально выбрали, будет передан команде, указанной после!

31
ответ дан 7 November 2019 в 09:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: