Выполнить скрипт прямо в vim / mvim / gvim - PullRequest
37 голосов
/ 02 июля 2010

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

Ответы [ 9 ]

68 голосов
/ 02 июля 2010

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

:! wc %

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

:! perl %
16 голосов
/ 02 сентября 2013

vim tutorial: Отображение ключей в Vim

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

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

отобразит Ctrl +P для записи файла и запуска его с помощью perl

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

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

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

map <C-p> :w<CR>:!perl %<CR> - это просто инструкция для сопоставления Ctrl + p с:

a) записать текущий файл :w

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

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

6 голосов
/ 02 июля 2010

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

например:.

:!python %
6 голосов
/ 02 июля 2010

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

:!./script.sh

4 голосов
/ 02 июля 2010

Звучит так, будто вы ищете !:

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

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

!proofread-script %

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

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

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

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

3 голосов
/ 03 октября 2015

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

3 голосов
/ 20 мая 2015

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

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

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

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

Далее a удобный служебный метод берет вывод и выводит его в новый буфер.

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

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

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""" 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
2 голосов
/ 21 марта 2018

Чтобы выполнить текущий исполняемый скрипт, используйте

:!./%

! выполняет команду оболочки,% - текущее имя файла и ./ добавляет текущий каталог перед.

0 голосов
/ 02 июля 2010

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

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

...