Как выполнить файл, который я редактирую в Vi (m) - PullRequest
92 голосов
/ 05 июня 2009

Как выполнить файл, который я редактирую, в Vi (m) и получить вывод в разделенном окне (как в SciTE)?

Конечно, я мог бы выполнить это так:

:!scriptname

Но возможно ли избежать написания имени сценария и как получить вывод в разделенном окне вместо нижней части экрана?

Ответы [ 11 ]

107 голосов
/ 05 июня 2009

Есть команда make. Он запускает команду, заданную в опции makeprg. Используйте % в качестве заполнителя для текущего имени файла. Например, если вы редактировали скрипт Python:

:set makeprg=python\ %

Да, вам нужно сбежать из космоса. После этого вы можете просто запустить:

:make

При желании вы можете установить опцию autowrite, и она автоматически сохранится перед запуском makeprg:

:set autowrite

Это решает часть выполнения. Не знаю, как получить этот вывод в разделенное окно, которое не включает перенаправление в файл.

28 голосов
/ 05 июня 2009

Чтобы получить доступ к имени файла текущего буфера, используйте %. Чтобы получить его в переменную, вы можете использовать функцию expand(). Чтобы открыть новое окно с новым буфером, используйте :new или :vnew. Чтобы передать вывод команды из текущего буфера, используйте :.!. Собираем все вместе:

:let f=expand("%")|vnew|execute '.!ruby "' . f . '"'

очевидно заменяет ruby любой командой, которую вы хотите. Я использовал execute, чтобы заключить имя файла в кавычки, чтобы оно работало, если имя файла содержит пробелы.

21 голосов
/ 15 июля 2012

Vim имеет команду ! ("bang"), которая выполняет команду оболочки непосредственно из окна VIM. Кроме того, он позволяет запускать последовательность команд, связанных с конвейером и считывать стандартный вывод.

Например:

! node %

эквивалентно открытию окна командной строки и запуску команд:

cd my_current_directory 
node my_current_file

Подробнее см. "Советы Vim: Работа с внешними командами" .

11 голосов
/ 30 ноября 2012

У меня есть ярлык для этого в моем vimrc:

nmap <F6> :w<CR>:silent !chmod 755 %<CR>:silent !./% > .tmp.xyz<CR>
     \ :tabnew<CR>:r .tmp.xyz<CR>:silent !rm .tmp.xyz<CR>:redraw!<CR>

Это записывает текущий буфер, делает текущий файл исполняемым (только для Unix), выполняет его (только для Unix) и перенаправляет вывод в .tmp.xyz, затем создает новую вкладку, читает файл и затем удаляет его. 1004 *

Разбивка:

:w<CR>                             write current buffer
:silent !chmod 755 %<CR>           make file executable
:silent !./% > .tmp.xyz<CR>        execute file, redirect output
:tabnew<CR>                        new tab
:r .tmp.xyz<CR>                    read file in new tab
:silent !rm .tmp.xyz<CR>           remove file
:redraw!<CR>                       in terminal mode, vim get scrambled
                                   this fixes it
4 голосов
/ 19 октября 2010

Для сценария Shell я использовал

:set makeprg=%

:make
1 голос
/ 25 июня 2018

Vim 8 имеет встроенный интерактивный терминал. Чтобы запустить текущий скрипт bash в разделенной панели:

:terminal bash %

или для краткости

:ter bash %

% расширяется до текущего имени файла.

С :help terminal:

The terminal feature is optional, use this to check if your Vim has it:
    echo has('terminal')
If the result is "1" you have it.
1 голос
/ 07 июля 2013

Вы можете использовать плагин vim bexec . Насколько мне известно, последняя версия - 0.5.

Тогда:

$ mkdir -p ~/.vim/plugin
$ mv bexec-0.5.vba ~/.vim/plugin
$ vim ~/.vim/plugin/bexec-0.5.vba

Внутри самого vim при редактировании файла .vba выполните:

:so %

Появится некоторый вывод, сообщающий, что bexec.vim был написан, а также документация и т. Д.

Теперь вы можете проверить его, открыв (независимо от того, какой языковой скрипт с интерпретатором #! Работает правильно) в vim и запустить

:Bexec 

Примечание: я хотел, чтобы разделение было вертикальным, а не горизонтальным, поэтому я сделал:

$ grep -i -n split ~/.vim/plugin/bexec.vim | grep -i hor
102:    let bexec_splitdir = "hor" " hor|ver
261:        exec {"ver":"vsp", "hor":"sp"}[g:bexec_splitdir]

и изменил значение с "hor" на "ver" ..

Я знаю, что это старый вопрос, но я надеюсь, что это может кому-то помочь. Я работал над тем же вопросом, проходя курс Coursera по разработке стартапов, где профессор Palaji использует Emacs, а мне не нравится Emacs ..

1 голос
/ 17 июня 2009

Я использую немного более навязчивый механизм для карт:

map ;e :w<CR>:exe ":!python " . getreg("%") . "" <CR>

Просто сделай так, чтобы мне не нужно было сохранять, а затем иди. Просто иди.

0 голосов
/ 21 июня 2016

В вашем .vimrc вы можете вставить эту функцию

function! s:ExecuteInShell(command)
  let command = join(map(split(a:command), 'expand(v:val)'))
  let winnr = bufwinnr('^' . command . '$')
  silent! execute ':w'
  silent! execute  winnr < 0 ? 'vnew ' . fnameescape(command) : winnr . 'wincmd w'
  setlocal buftype=nowrite bufhidden=wipe nobuflisted noswapfile nowrap number
  silent! execute 'silent %!'. command
  silent! redraw
  silent! execute 'au BufUnload <buffer> execute bufwinnr(' . bufnr('#') . ') . ''wincmd w'''
  silent! execute 'nnoremap <silent> <buffer> <LocalLeader>r :call <SID>ExecuteInShell(''' . command . ''')<CR>'
  silent! execute 'wincmd w'
  " echo 'Shell command ' . command . ' executed.'
endfunction
command! -complete=shellcmd -nargs=+ Shell call s:ExecuteInShell(<q-args>)
cabbrev shell Shell

После этого в vim запустите команду :shell python ~/p.py в качестве примера. И вы получите вывод в разбитом окне. + После изменений в p.py, например, вы снова запустите ту же команду, эта функция больше не будет создавать новое окно, она отобразит результат в предыдущем (том же) разбитом окне.

0 голосов
/ 10 октября 2014

@ xorpaul

Я долго искал этот скрипт (python / Windows). Поскольку в Windows нет «тройника», я изменил его на:

function! Setup_ExecNDisplay()
  execute "w"
  let n=expand('%:t')
  execute "silent ! python % > d:\\temp\\output_".n ." 2>&1"
  execute "vsplit d:\\temp\\output_".n
  execute "redraw!"
  set autoread
endfunction

function! ExecNDisplay()
  execute "w"
  let n=expand('%:t')
  execute "silent ! python % > d:\\temp\\output_".n . " 2>&1"
endfunction

:nmap <F9> :call Setup_ExecNDisplay()<CR>
:nmap <F2> :call ExecNDisplay()<CR>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...