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()