2009-03-02 4 views
32

Я делаю много вещей для быстрой симуляции Python, и я постоянно сохраняю (: w), а затем бегу (: !!). Мне интересно, есть ли способ объединить эти действия. Может быть, команда «сохранить и запустить».VIM: Сохранение и запуск в одно и то же время?

Благодарим за помощь.

+0

Не могли бы вы взглянуть на мой ответ? Я думаю, что он правильно отвечает на ваш вопрос. –

ответ

25

Вариант 1:

Написать функцию, подобную этой, и поместить его в настройках запуска:

function myex() 
    execute ':w' 
    execute ':!!' 
endfunction 

Можно даже отобразить ключ комбо it-- смотреть документацию.


Вариант 2 (лучше):

Посмотрите на документацию для переназначения клавиш - вы можете быть в состоянии выполнить это с помощью простого ключа переназначить. Следующие работы, но имеет «filename.py» hardcoded. Возможно, вы можете вникнуть и выяснить, как заменить это на текущий файл?

:map <F2> <Esc>:w<CR>:!filename.py<CR> 

После сопоставления с ним вы можете просто нажать F2 в командном режиме.

imap, vmap и т. Д. - это отображения в разных режимах. Вышеуказанное относится только к командному режиму. Следующее должно работать и в режиме вставки:

:imap <F2> <Esc>:w<CR>:!filename.py<CR>a 

Раздел 40.1 руководства VIM очень полезен.

+1

Для имени файла см. Параметры для расширения. Я думаю, что расширение («%: p») даст вам имя файла. –

+7

Просто протестирован. Прекрасно работает. Добавить "map : w :!%: P " на ваш vimrc (без кавычек). – bernie

5

Комбинация команд, похоже, работает через символ |, так что, возможно, что-то вроде наложения псевдонимов :w|!your-command-here на отдельную комбинацию клавиш?

5

Здесь вы идете:

:nmap <F1> :w<cr>:!%<cr>

сохранить & запустить (вы должны быть в п режиме, хотя - просто добавьте ESC и а для режима я)

+0

для скриптов python с бит-бит и '#!/Bin/bash/env python' в качестве первой строки,' map : w :! ./% 'in $ HOME/.vimrc отлично работает. (карта или nmap, F1 или другие). – lllluuukke

-12
  1. Рассмотрим переход на IDLE. F5 делает все.

  2. Рассмотрите возможность перехода на Комодо. Вы можете определить команду, чтобы F5 делал все.

1

я получил следующее из VIM советы вики:

command! -complete=file -nargs=+ shell call s:runshellcommand(<q-args>) 
function! s:runshellcommand(cmdline) 
    botright vnew 
    setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap 
    call setline(1,a:cmdline) 
    call setline(2,substitute(a:cmdline,'.','=','g')) 
    execute 'silent $read !'.escape(a:cmdline,'%#') 
    setlocal nomodifiable 
    1 
endfunction 

но изменил новый для vnew на третьей линии, то для питона я следующее

map <F9> :w:Shell python %<cr><c-w> 

удара f9 сохраняет, запускает и выгружает вывод в новый вертикально разделенный буфер с нуля, для легкого поиска/сохранения и т. д. ... также попадает в cw, поэтому мне нужно только нажать h/c, чтобы закрыть его/вернуться обратно к моему коду.

11

Используйте autowrite вариант:

:set autowrite 

записать содержимое файла, если он был изменен, на каждой из них: в следующем,: перемотка назад,: последний,: первый,: предыдущий,: остановка ,: suspend,: tag, :!,: make, CTRL-] и CTRL-^command [...]

49

Хорошо, простейшая форма того, что вы ищете, это команда трубы. Он позволяет запускать несколько команд cmdline в одной строке. В вашем случае две команды записывают `w` и выполняют текущий файл`! %: P`. Если у вас есть определенная команда, которую вы запускаете для текущего файла, вторая команда становится, например. `! python%: p`. Итак, самый простой ответ на Ваш вопрос будет:

:w | ! %:p 
^^^ 
| | |--Execute current file 
| |--Chain two commands 
|--Save current file 

Последнее, что следует отметить, что не все команды могут быть соединены. Согласно Vim docs, некоторые команды принимают трубу в качестве аргумента, и, таким образом, разорвать цепь ...

+0

Все в одной команде. Это ответ, который я бы искал, а не сценарии или сопоставление. Я не знал, что '|' используется для цепочки команд. Спасибо! – dwerner

4

Другая возможность:

au BufWriteCmd *.py write | !! 

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

0

Попробуйте сделать это внутри Bash.

В случае файла C называется t.c, это очень удобно:

vi t.c && cc t.c -o t && ./t 

Пиктограммы (&&) убедитесь, что одно сообщение об ошибке разрывает цепочку команд.

Для Python это может быть еще проще:

vi t.py && python t.py 
2

Это то, что я положил в моем .vimrc и работает как шарм

nnoremap <leader>r :w<CR>:!!<CR> 

Конечно, вы должны запустить команду оболочки однажды это значит, что он знает, какую команду выполнить.

Ex:

:!node ./test.js 
2

В Vim, вы можете просто перенаправить любой диапазон текущего буфера внешней команды (будь то баш, питон, или у вас есть питон скрипт).

# redirect whole buffer to python 
:%w !python 

предположим, что ваш текущий буфер содержит две строки, как показано ниже,

import numpy as np 
print np.arange(12).reshape(3,4) 

затем :%w !python будет запустить его, будь он сохранен или нет. и напечатать что-то, как показано ниже на ваш терминале,

[[ 0 1 2 3] 
[ 4 5 6 7] 
[ 8 9 10 11]] 

Конечно, вы могли бы сделать что-то настойчивым, например, некоторую раскладку.

nnoremap <F8> :.w !python<CR> 
vnoremap <F8> :w !python<CR> 

первый запуск текущей строки, второй - визуальный выбор, через интерпретатор python.

#!! be careful, in vim ':w!python' and ':.w !python' are very different, the 
first write (create or overwrite) a file named 'python' with contents of 
current buffer, the second redirect the selected cmdline range (here dot ., 
which mean current line) to external command (here 'python'). 

для диапазона командная_строка см

:h cmdline-ranges 

не ниже один, который относительно нормальной команды, не командная_строка один.

:h command-range 

вдохновлен https://stackoverflow.com/a/19883963/3625404

+0

На самом деле, этот ответ больше похож на IDE. Современные IDE не будут сохранять файл перед «run». Я повышаю это. – minion