Vim: направляет выделенный текст в командную оболочку и получает вывод в информации / командной строке vim - PullRequest
50 голосов
/ 04 апреля 2010

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

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

Ответы [ 6 ]

99 голосов
/ 21 марта 2011

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

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

Вы можете отобразить его на простой ярлык визуального режима, например:

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

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

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

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

29 голосов
/ 08 апреля 2010

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

При вводе команды она будет отображаться внизу как:

:'<,'>!somecmd

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

17 голосов
/ 06 апреля 2010

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

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

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

4 голосов
/ 04 апреля 2010

Возможно, вам следует использовать что-то вроде

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

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

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

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

2 голосов
/ 10 августа 2014
Решение

@ 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()
1 голос
/ 10 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...