Как выполнить файл, который я редактирую в Vi(m)
Как выполнить файл, который я редактирую в Vi (m) и получить вывод в разделенном окне (например, в SciTE)?
конечно, я мог бы выполнить ее так:
:!scriptname
но возможно ли избежать написания имени сценария и как получить вывод в разделенном окне вместо нижней части экрана?
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
Я использую немного более навязчивый механизм через карты:
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