Сохранить и запустить одновременно в Vim

Я занимаюсь быстрым моделированием Python и постоянно сохраняю (: w), а затем запускаю (: !!). Есть ли способ совместить эти действия?

Может быть, команда «сохранить и запустить».

Ответов (12)

Решение

Опция 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 очень полезен.

Ну вот:

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

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

Я получил следующее из вики-страницы советов по 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

Но я изменил new на vnew в третьей строке, а затем для Python у меня есть следующее:

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

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

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

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

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

Пример:

:!node ./test.js

В 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, and the second redirects the selected cmdline range (here dot .,
which mean current line) to external command (here 'python').

Для диапазона cmdline см.

:h cmdline-ranges

Не тот, что ниже, который касается обычной команды, а не cmdline.

:h command-range

Это было вдохновлено строкой Execute current в Bash из Vim .

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

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

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

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

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

vi t.py && python t.py

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

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

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

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

  1. Рассмотрите возможность перехода на IDLE . F5все делает.

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

Используйте опцию автозаписи :

:set autowrite

Запишите содержимое файла, если оно было изменено, для каждого: next,: rewind,: last,: first,: previous,: stop,: suspend,: tag, :! ,: make, CTRL-] и CTRL- ^ команда [...]

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

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

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

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

au BufWriteCmd *.py write | !!

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