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



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



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



:!scriptname


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

624   11  

11 ответов:

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

:set makeprg=python\ %

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

:make

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

:set autowrite

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

чтобы получить доступ к имени файла текущего буфера, используйте %. Чтобы получить его в переменную, вы можете использовать

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

например:

! node %

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

cd my_current_directory 
node my_current_file

посмотреть "советы Vim: работа с внешними командами" для сведения.

у меня есть ярлык для этого в моем 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) и перенаправляет вывод .ПТМ.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

для сценария оболочки я использовал

:set makeprg=%

:make

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

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

просто делает это так, что мне не нужно экономить, а затем идти. Просто пойти.

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

затем:

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

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

:so %

некоторые выходные данные будут отображаться, давая вам знать, что bexec.ВИМ понаписал, а также документации и т. д..

теперь вы можете проверить его, открыв свой (любой языковой скрипт, который имеет #! переводчик работает правильно) в 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, где профессор Паладжи использует Emacs, и мне не нравится Emacs..

на основе ответов @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 для выполнения сценария и tee в выходной файл.

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

в своем .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 в качестве примера вы снова запустите ту же команду, эта функция не будет снова создавать новое окно, она отобразит результат в предыдущем(том же) разделенном окне.

@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>

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.

Comments

    Ничего не найдено.