Как выполнить файл, который я редактирую в Vi (m)
Как выполнить файл, который я редактирую в Vi (m), и получить результат в окне разделения (например, в SciTE)?
Конечно, я мог бы выполнить его так:
:!scriptname
Но возможно ли избежать написания имени script и как получить вывод в разделительном окне, а не только в нижней части экрана?
Ответы
Ответ 1
Существует команда make
. Он запускает команду, установленную в опции makeprg
. Используйте %
в качестве заполнителя для текущего имени файла. Например, если вы редактировали python script:
:set makeprg=python\ %
Да, вам нужно избежать пространства. После этого вы можете просто запустить:
:make
Если вы хотите, вы можете установить параметр autowrite
, и он автоматически сохранит перед запуском makeprg
:
:set autowrite
Это решает часть выполнения. Не знаю, какой способ получить этот вывод в разделенном окне, который не включает перенаправление в файл.
Ответ 2
Чтобы получить доступ к текущему имени файла буфера, используйте %
. Чтобы получить его в переменной, вы можете использовать функцию expand()
. Чтобы открыть новое окно с новым буфером, используйте :new
или :vnew
. Чтобы передать вывод из команды в текущий буфер, используйте :.!
. Объединяя все это:
:let f=expand("%")|vnew|execute '.!ruby "' . f . '"'
очевидно, заменяя ruby
любой командой, которую вы хотите. Я использовал execute
, чтобы я мог окружать имя файла кавычками, поэтому он будет работать, если в нем есть пробелы.
Ответ 3
Vim имеет команду !
( "bang" ), которая выполняет команду оболочки непосредственно из окна VIM. Кроме того, он позволяет запускать последовательность команд, связанных с трубой, и читать stdout.
Например:
! node %
эквивалентно открытию окна командной строки и запуска команд:
cd my_current_directory
node my_current_file
Подробнее см. "Советы Vim: работа с внешними командами" .
Ответ 4
У меня есть ярлык для этого в моем 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, затем создает новую вкладку, считывает файл и удаляет его.
Разрушение:
: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
Ответ 5
Для Shell script Я использовал
:set makeprg=%
:make
Ответ 6
Я использую несколько более интрузивный механизм через карты:
map ;e :w<CR>:exe ":!python " . getreg("%") . "" <CR>
Просто делает это, поэтому мне не нужно спасать, а затем иди. Просто идите.
Ответ 7
Вы можете использовать vim plugin 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, а также документация и т.д.
Теперь вы можете протестировать его, открыв свой (любой язык script, который корректно работает С#! интерпретатором) в 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 Startup Engineering, где профессор Паладжи использует Emacs, и мне не нравится Emacs.
Ответ 8
На основании ответов @SethKriticos и @Cyril теперь я использую следующее:
function! Setup_ExecNDisplay()
execute "w"
execute "silent !chmod +x %:p"
let n=expand('%:t')
execute "silent !%:p 2>&1 | tee ~/.vim/output_".n
" I prefer vsplit
"execute "split ~/.vim/output_".n
execute "vsplit ~/.vim/output_".n
execute "redraw!"
set autoread
endfunction
function! ExecNDisplay()
execute "w"
let n=expand('%:t')
execute "silent !%:p 2>&1 | tee ~/.vim/output_".n
" I use set autoread
"execute "1 . 'wincmd e'"
endfunction
:nmap <F9> :call Setup_ExecNDisplay()<CR>
:nmap <F2> :call ExecNDisplay()<CR>
Используйте F9 для настройки нового окна и F2 для выполнения ваших script и tee в выходной файл.
Я также добавил имя script в имя выходного файла, чтобы вы могли использовать его для нескольких сценариев одновременно.
Ответ 9
@xorpaul
Я искал этот script (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>
ТНХ
Ответ 10
В .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
в качестве примера вы снова запустите ту же команду, эта функция не будет создавать новое окно снова, она отобразит результат в предыдущем (том же) разделенном окне.