2010-07-02 3 views
34

TextMate имеет приятную функцию, которая позволяет выполнять скрипт из текущего контекста и отображает вывод в отдельном окне. Это позволяет вам писать и тестировать код на ходу. Я почти уверен, что есть аналогичная функция с MacVim/gVIM, но я не уверен, что это такое. В настоящее время я сохраняю свои буферы на диск, затем перехожу в командную строку и выполняю сценарий в этом отношении. Как улучшить этот рабочий процесс с помощью vim?Выполнение скрипта непосредственно в vim/mvim/gvim

+0

Что вы пытаетесь сделать, выполнить сценарий, который вы пишете, или выполнить скрипт на том материале, который вы пишете? – falstro

+0

выполните сценарий, который я пишу.Если сценарий говорит «ставит« привет мир », я просто хочу увидеть мир привет в macvim/gvim. – randombits

+1

Если вы пишете рубиновый скрипт, вы можете просто сделать::! ruby% 'для запуска скрипта, который вы сейчас пишете. – rampion

ответ

61

Вы можете сделать это в vim, используя команду !. Например, чтобы подсчитать количество слов в текущем файле вы можете сделать:

:! wc % 

% заменяется текущим именем. Чтобы запустить скрипт, который вы могли бы назвать интерпретатор на файл - например, если вы пишете на языке Perl скрипт:

:! perl % 
+2

Также сохраните сценарий перед запуском: ': w | python% '([несколько коммандов] (http://unix.stackexchange.com/questions/144568/how-do-i-write-a-command-in-vim-to-run-multiple-commands)) И для повторения последней команды ':': – Dominik

+3

И [повторить последнюю команду ':'] (http://vim.wikia.com/wiki/Repeat_last_colon_command): * Введите '@@' или * Тип ' : 'и использовать курсор вверх @jts: Возможно, вы это добавите. – Dominik

+0

Если вы редактируете файл, у которого уже установлены * execute * разрешения, выполните ':! ./% 'будет использовать строку * shebang *, чтобы определить, как запускать и выполнять файл. –

4

Это звучит, как вы ищете !:

:!{cmd} Выполнить {cmd} с оболочка.

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

!proofread-script % 

Вы также можете использовать ! с диапазоном, чтобы использовать команду в качестве фильтра:

!{motion}{filter} " from normal mode 
:{range}!{filter} " from command mode 

(В первом случае, как и во многих других команд, когда вы набираете движение, он будет проходить мимо вас в командный режим, превращая движение в диапазоне, например, :.,.+2!)

И, наконец, если вам действительно не нужно передавать входные данные из вашего файла, но вы хотите получить результат в своем файле, это, по сути, тривиальный фильтр, а самый быстрый способ сделать это - !!{cmd}. Это заменит текущую строку на выход команды.

5

Вы можете запустить его прямо из Vim:

:!./script.sh

6

сохранить файл и вызывать сценарий с помощью интерпретатора

например .:

:!python % 
+0

Это хорошо, но как я могу заставить его работать в отдельном окне? – qed

0

Ну это зависит от вашего OS - на самом деле я не тестировал его на M $ Window $ - но Conque - один из лучших плагинов вокруг: http://code.google.com/p/conque/

На самом деле, это может быть лучше, но работает. Вы можете вставить окно оболочки в окно «vim».

+0

Это не запасы, конечно, но, вероятно, не оправдывает нисходящие потоки - это хороший плагин, как только вы его запустили, и можете превратить VIm в своего рода сценарий IDE, что является одним из логических способов интерпретации ОП. – ruffin

16

ВИМ учебник: Mapping keys in Vim

Вы можете отобразить ключи так Perl выполняет текущий сценарий, как предложено выше JTS.

map <C-p> :w<CR>:!perl %<CR> 

сопоставляются Ctrl + P, чтобы записать файл и запустить его с помощью Perl

imap <C-p> <Esc>:w<CR>:!perl %<CR> 

позволяет вызвать то же самое в режиме вставки.

У вас должен быть файл .vimrc (_vimrc для Windows) в вашей папке vim/home. В нем содержатся инструкции о том, как вести себя vim.

map <C-p> :w<CR>:!perl %<CR> просто инструкция для отображения Ctrl + P, чтобы:

а) ток записи файла :w

б) команда запуска (Perl) с помощью% (в настоящее время открытия файла) в качестве параметра :!perl %

<CR> после каждой команды означает «возврат каретки»: инструкция для выполнения определенной команды. imap делает то же самое, что и map, но прослушивает Ctrl + p в режиме вставки.

+2

Ваш ответ очень хороший. Можете ли вы еще больше объяснить свои детали, чтобы сделать его более полным и принести пользу сообществу? – Bichoy

+2

Надеюсь, что я не сделал ответ более запутанным, тогда это было – camelotus

3

Поместите this small snippet в свой .vimrc, чтобы выполнить текущий файл с одним нажатием клавиши (например, F5) и отобразить результат в новом буфере с разделенной панелью.

:! все в порядке, но вам нужно переключиться на терминал, чтобы увидеть результат.

Хотя вы можете сделать это с помощью ctrl-z и вернуть vim обратно с fg, это все равно означает, что вам нужно много переключать контекст.

Как это работает snippet, сначала угадывая исполняемый файл на основе filetype, а затем запуская его с текущим файлом в качестве аргумента.

Следующий a handy utility method принимает выходные данные и отправляет их в новый буфер.

Это не идеально, но очень быстро для обычных рабочих процессов.

Вот фрагмент скопирован ниже:

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 
"""""""""""""""""""""""""" RUN CURRENT FILE """"""""""""""""""""""""""""" 
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 
" Execute current file 
nnoremap <F5> :call ExecuteFile()<CR> 

" Will attempt to execute the current file based on the `&filetype` 
" You need to manually map the filetypes you use most commonly to the 
" correct shell command. 
function! ExecuteFile() 
    let filetype_to_command = { 
    \ 'javascript': 'node', 
    \ 'coffee': 'coffee', 
    \ 'python': 'python', 
    \ 'html': 'open', 
    \ 'sh': 'sh' 
    \ } 
    let cmd = get(filetype_to_command, &filetype, &filetype) 
    call RunShellCommand(cmd." %s") 
endfunction 

" Enter any shell command and have the output appear in a new buffer 
" For example, to word count the current file: 
" 
" :Shell wc %s 
" 
" Thanks to: http://vim.wikia.com/wiki/Display_output_of_shell_commands_in_new_window 
command! -complete=shellcmd -nargs=+ Shell call RunShellCommand(<q-args>) 
function! RunShellCommand(cmdline) 
    echo a:cmdline 
    let expanded_cmdline = a:cmdline 
    for part in split(a:cmdline, ' ') 
    if part[0] =~ '\v[%#<]' 
     let expanded_part = fnameescape(expand(part)) 
     let expanded_cmdline = substitute(expanded_cmdline, part, expanded_part, '') 
    endif 
    endfor 
    botright new 
    setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap 
    call setline(1, 'You entered: ' . a:cmdline) 
    call setline(2, 'Expanded Form: ' .expanded_cmdline) 
    call setline(3,substitute(getline(2),'.','=','g')) 
    execute '$read !'. expanded_cmdline 
    setlocal nomodifiable 
    1 
endfunction 
+0

Спасибо за этот ответ. Это делает его безболезненным, чтобы изучить скрипты bash изнутри Vim. Я изменил строку 511: '\ 'sh': 'sh'' в [фрагменте, на который вы ссылались] (https://github.com/emorikawa/dotfiles/blob/44b25821891a6873dab10364728bc7df99450b7c/vim/vimrc#L496-L542) на' \ 'sh': 'bash' '. Я пытался узнать об этой строке '<<<' и не получал ожидаемых результатов. Оказывается, что bash и not sh поддерживает здесь-строку '<<<', поэтому я изменил оболочку для sh скриптов. – DMfll

2

Все предложения здесь просто продемонстрировали :!{cmd} %, который проходит текущий буфер в ЦМД оболочки. Но есть и другой вариант. :write !{cmd} Например, действие команды :write !sh состоит в том, что каждая строка текущего буфера выполняется в оболочке.
Часто полезно, например, если вы добавили пару строк в буфер и хотите сразу увидеть результат выполнения, не сохраняя сначала буфер.
Также можно выполнить некоторый диапазон, а не всего содержимого буфера:
:[range]write !{cmd}

Смежные вопросы