2009-03-02 37 views
32

Tôi làm rất nhiều công cụ mô phỏng nhanh chóng của Python và tôi liên tục lưu (: w) và sau đó chạy (: !!). Tôi tự hỏi, có cách nào để kết hợp những hành động này không. Có thể là lệnh "lưu và chạy".VIM: Lưu và Chạy cùng một lúc?

Cảm ơn sự giúp đỡ của bạn.

+0

bạn có thể có một cái nhìn tại phản ứng của tôi? Tôi nghĩ nó trả lời đúng câu hỏi của bạn. –

Trả lời

25

Lựa chọn 1:

Viết một hàm tương tự như sau và đặt nó trong cài đặt khởi động của bạn:

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

Bạn thậm chí có thể lập bản đồ một combo chìa khóa để it-- tìm một tài liệu.


Lựa chọn 2 (tốt hơn):

Nhìn vào tài liệu cho Remapping tổ hợp phím - bạn có thể thực hiện nó thông qua một remap phím đơn giản. Các công trình sau đây, nhưng có "filename.py" được mã hóa cứng. Có lẽ bạn có thể đào sâu và tìm ra cách thay thế bằng tệp hiện tại?

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

Sau khi ánh xạ, bạn chỉ có thể nhấn F2 ở chế độ lệnh.

imap, vmap, v.v ... là ánh xạ ở các chế độ khác nhau. Ở trên chỉ áp dụng cho chế độ lệnh. Các mục sau cũng sẽ hoạt động ở chế độ chèn:

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

Mục 40.1 của hướng dẫn sử dụng VIM rất hữu ích.

+1

Đối với tên tệp, hãy xem các tùy chọn để mở rộng. Tôi nghĩ rằng mở rộng ("%: p") sẽ giúp bạn có được tên tập tin. –

+7

Chỉ cần kiểm tra. Hoạt động tuyệt vời. Thêm "bản đồ : w :!%: P " vào vimrc của bạn (không có dấu ngoặc kép). – bernie

5

Kết hợp lệnh có vẻ hoạt động thông qua ký tự |, vì vậy có lẽ giống như đặt bí danh :w|!your-command-here cho kết hợp khóa riêng biệt?

5

Ở đây bạn đi:

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

tiết kiệm & chạy (bạn phải được ở chế độ n mặc dù - chỉ cần thêm esc và một cho tôi chế độ)

+0

cho các tập lệnh python với tập bit x và '#!/Bin/bash/env python' làm dòng đầu tiên,' map : w :! .//01 'trong $ HOME/.vimrc hoạt động tốt. (bản đồ hoặc nmap, F1 hoặc những người khác). – lllluuukke

-12
  1. xem xét chuyển sang IDLE. F5 làm mọi thứ.

  2. Cân nhắc chuyển sang Komodo. Bạn có thể định nghĩa một lệnh để F5 thực hiện mọi thứ.

1

tôi đã nhận như sau từ những lời khuyên vim 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 

nhưng thay đổi mới để vnew trên dòng thứ ba, sau đó cho python tôi đã sau

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

đánh f9 tiết kiệm, chạy và đổ kết xuất vào bộ đệm đệm chia theo chiều dọc mới, để dễ dàng yanking/saving etc ... cũng nhấn cw vì vậy tôi chỉ phải nhấn h/c để đóng/di chuyển trở lại mã của tôi.

11

Sử dụng autowrite tùy chọn:

:set autowrite 

Viết nội dung của các tập tin, nếu nó đã được sửa đổi, trên mỗi: tiếp theo,: tua lại,: cuối cùng,: thứ nhất,: trước: stop ,: suspend,: tag, :!,: make, CTRL-] và CTRL-^command [...]

49

Được rồi, hình thức đơn giản nhất của những gì bạn đang tìm kiếm là lệnh ống. Nó cho phép bạn chạy nhiều lệnh cmdline trên cùng một dòng. Trong trường hợp của bạn, hai lệnh được viết `w` và thực thi tệp hiện tại`! %: p`. Nếu bạn có một lệnh cụ thể mà bạn chạy cho tệp hiện tại, lệnh thứ hai sẽ trở thành, ví dụ: `! python%: p`. Vì vậy, câu trả lời đơn giản nhất cho bạn sẽ trở thành:

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

Điều cuối cùng cần lưu ý là không phải tất cả các lệnh đều có thể bị xích. Theo Vim docs, lệnh nhất định chấp nhận một ống như một cuộc tranh cãi, và do đó phá vỡ các chuỗi ...

+0

Tất cả trong một lệnh. Đây là câu trả lời tôi sẽ tìm, không phải là kịch bản hay lập bản đồ. Tôi đã không nhận thức được '|' đang được sử dụng để chuỗi lệnh. Cám ơn! – dwerner

4

Một khả năng khác:

au BufWriteCmd *.py write | !! 

Mặc dù điều này sẽ run mỗi khi bạn lưu, mà có thể không được những gì bạn muốn.

0

Thử đặt nó trong Bash.

Trong trường hợp của một tập tin C gọi t.c, điều này rất thuận tiện:

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

Các và các biểu tượng (&&) đảm bảo rằng một thông báo lỗi phá vỡ chuỗi lệnh.

Đối với Python điều này có thể dễ dàng hơn:

vi t.py && python t.py 
2

Đây là những gì tôi đặt trong .vimrc tôi và hoạt động giống như một nét duyên dáng

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

Tất nhiên bạn cần phải chạy lệnh shell của bạn một lần trước điều này để nó biết lệnh nào cần thực hiện.

Ex:

:!node ./test.js 
2

Trong vim, bạn chỉ có thể chuyển hướng bất kỳ phạm vi của bộ đệm hiện tại của bạn với một lệnh bên ngoài (có thể là bash, python, hoặc bạn sở hữu kịch bản python).

# redirect whole buffer to python 
:%w !python 

giả đệm hiện tại của bạn chứa hai dòng như dưới đây,

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

sau đó :%w !python sẽ chạy nó, có thể là lưu hay không. và in cái gì đó như dưới đây về thiết bị đầu cuối của bạn,

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

Tất nhiên, bạn có thể làm một cái gì đó dai dẳng, ví dụ, một số keymap.

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

dòng đầu tiên chạy hiện tại, lựa chọn trực tiếp chạy thứ hai, thông qua trình thông dịch 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'). 

cho phạm vi cmdline, xem

:h cmdline-ranges 

không dưới một, mà liên quan đến lệnh bình thường, không cmdline một.

:h command-range 

lấy cảm hứng từ https://stackoverflow.com/a/19883963/3625404

+0

Thực ra, câu trả lời này cũng giống như câu trả lời của IDE. IDE hiện đại sẽ không lưu tệp trước khi 'chạy'. Tôi upvote này. – minion

Các vấn đề liên quan