Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Вариант 1:

Напишите функцию, аналогичную этой, и поместите ее в свои настройки запуска:

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

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


Вариант 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 очень полезен.

Ответ 2

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

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

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

Ответ 3

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

:set autowrite

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

au BufWriteCmd *.py write | !!

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

Ответ 7

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

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

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

Пример:

:!node ./test.js

Ответ 8

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

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

:h command-range

вдохновлен fooobar.com/questions/136788/...

Ответ 9

Я получил следующее из wim tips wiki:

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, чтобы закрыть его/вернуться обратно к моему код.

Ответ 10

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

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

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

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

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

vi t.py && python t.py

Ответ 11

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

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

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

Ответ 12

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

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