ВИМ: Сохранить и запустить одновременно? - PullRequest
40 голосов
/ 02 марта 2009

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

Спасибо за вашу помощь.

Ответы [ 12 ]

63 голосов
/ 06 марта 2009

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

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

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

27 голосов
/ 02 марта 2009

Вариант 1:

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

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

Вы могли бы даже сопоставить ему комбинацию клавиш - посмотрите документы.


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

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

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

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

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

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

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

12 голосов
/ 02 марта 2009

Используйте параметр autowrite :

:set autowrite

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

5 голосов
/ 02 марта 2009

Вот, пожалуйста:

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

сохранить и запустить (хотя вы должны быть в режиме n - просто добавьте esc и a для режима i)

5 голосов
/ 02 марта 2009

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

4 голосов
/ 29 июня 2011

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

au BufWriteCmd *.py write | !!

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

2 голосов
/ 12 октября 2016

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

# 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').

диапазон cmdline, см.

:h cmdline-ranges

не ниже единицы, относящейся к обычной команде, а не cmdline one.

:h command-range

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

2 голосов
/ 31 августа 2016

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

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

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

Ex:

:!node ./test.js
1 голос
/ 02 марта 2009

Я получил следующее из vim tips viki:

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 в третьей строке, тогда для python у меня есть следующее

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

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

0 голосов
/ 15 декабря 2018

Это будет работать в режиме вставки тоже ...

" F5 => Save & Run python3 "
nnoremap <F5> :w <CR> :!sh -c 'python3 %' <CR>
inoremap <F5> <Esc> :w <CR> :!sh -c 'python3 %' <CR>

Я все время использую его для проверки того, что слишком долго для перепечатки в интерпретаторе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...