Vim: Выбирает текст в оболочку cmd и получает вывод на vim info/command line

Я хочу передать выделенный текст команде оболочки и получить однострочный вывод этой команды оболочки в файле vim info/command line?

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

Ответы

Ответ 1

Я бы сделал это следующим образом:

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

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

Ответ 2

Для многострочной версии вы можете сделать это после выбора текста:

:'<,'>:w !command<CR>

Вы можете сопоставить его с простым графическим ярлыком в следующем виде:

xnoremap <leader>c <esc>:'<,'>:w !command<CR>

Нажмите клавишу ведущего ключа + c в визуальном режиме, чтобы отправить выделенный текст в stdin команды. Команда stdout команды будет напечатана ниже строки состояния vim.

Пример реального мира с CoffeeScript:

https://github.com/epeli/vimconfig/commit/4047839c4e1c294ec7e15682f68563a0dbf0ee6d

Ответ 3

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

Когда вы вводите команду, она появится внизу:

:'<,'>!somecmd

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

Ответ 4

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

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

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

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

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

Ответ 5

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

function Pastebin() range
    let [email protected]"
    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. Используйте его так же, как функция matias.

Ответ 6

Решение @matias не работает хорошо для меня, потому что кажется, что shellescape будет добавлять \ к каждой строке.

Поэтому я использую sed, чтобы выполнить это, и он отлично работает!

"dump selected lines
function! DumpLines() range
  echo system('sed -n '.a:firstline.','.a:lastline.'p '.expand('%'))
endfunction

com! -range=% -nargs=0 Dump :<line1>,<line2>call DumpLines()