2009-02-01 31 views
51

Tôi lãng phí rất nhiều thời gian giữa Vim và Python. Tôi tìm thấy nó quá chậm để tự sao chép-dán từ Python để Vim và ngược lại. Ví dụ bị hỏng tốt là:Làm thế nào bạn có thể sử dụng Python trong Vim?

%! Python for i in xrange (25); in 6 * i \ n

Làm cách nào bạn có thể thực hiện các chỉnh sửa đó trong Vim? [Solved]

[Làm rõ] tôi cần điều cần Vim, như trình tự in, arithmetics ... - những điều tôi không thể làm trong Vim.

Ai đó có thể xây dựng điểm này [?]: "kịch bản của bạn có thể đọc từ stdin để vận hành trực tiếp trên dây chuyền cho (.,%, ...)."

[Tiếp tục Làm rõ]

Nếu tôi muốn in 'hello' cho dòng 4,5, 6 và 7, những gì là sai:

: 4-7 python -c "in 'hello'"

Dấu chấm. sửa đổi dòng hiện tại. Tôi có thể in trên nhiều dòng 7, 32 và 99:

: 7,32,99 python -c "in 'hello'"

Rõ ràng không làm việc. Làm sao?

+1

Đây có phải là câu hỏi không? –

+0

Bạn có thể vui lòng giải thích thêm, bạn đang cố gắng làm gì? – Alex

Trả lời

164

Trong bất kỳ cửa sổ vim của bạn, gõ một cái gì đó như thế này:

for x in range(1,10): 
    print '-> %d' % x 

Nhìn bề ngoài chọn cả hai đường đó (V để bắt đầu chế độ hình ảnh), và gõ như sau:

:!python 

Vì bạn nhấn ':' trong chế độ hình ảnh, mà sẽ kết thúc tìm kiếm như:

:'<,'>!python 

Hit nhập và lựa chọn được thay thế bằng đầu ra của các câu lệnh print. Bạn có thể dễ dàng biến nó thành một ánh xạ:

:vnoremap <f5> :!python<CR> 
+12

Tôi đã sử dụng vim và python trong nhiều năm và đề xuất này chỉ thổi tâm trí của tôi. Không biết tại sao điều đó không bao giờ xảy ra với tôi. – rhettg

+0

Điều này thực sự tuyệt vời. –

+3

Thực ra tôi đã không nhận ra rằng nó có thể được thực hiện dễ dàng cho đến khi HL hỏi câu hỏi của mình và tôi phải tìm ra câu trả lời ... –

5

Từ ví dụ của bạn, có vẻ như bạn muốn thực thi một tập lệnh Python và có đầu ra của tập lệnh xuất hiện trong bộ đệm Vim hiện tại. Nếu đó là đúng, thì bạn có thể làm như sau tại cửa sổ dòng lệnh trong Vim:

%!python -c "for i in xrange(25): print 6*i" 

Các -c tùy chọn để python cung cấp cho nó một kịch bản để chạy. Tuy nhiên, bạn có thể thấy kỹ thuật này chỉ hữu ích trong các trường hợp rất ngắn, bởi vì không giống như một số ngôn ngữ khác, Python không cho vay tốt để viết các chương trình hoàn chỉnh trên cùng một dòng.

1

Tôi nghĩ bạn không chỉ thiếu cờ -c. Ví dụ:

:.!python -c "print 'hello'" 

Bạn không nên dùng tập lệnh mà bạn cung cấp làm bộ lọc trên lựa chọn dòng. Tức là, tập lệnh của bạn có thể đọc từ stdin để hoạt động trực tiếp trên các dòng được cung cấp (., %, ...). Bất cứ điều gì nhiều hơn các nhiệm vụ đơn giản nhất, tuy nhiên, và bạn nên tốt hơn đặt các lệnh python vào một tập lệnh của riêng nó.

6

Ai đó có thể xây dựng điểm này: "kịch bản của bạn có thể đọc từ stdin để vận hành trực tiếp trên đường nhất định (.,%, ...)"

Sử dụng phổ biến là sắp xếp các dòng văn bản bằng cách sử dụng lệnh 'sắp xếp' có sẵn trong trình bao của bạn. Ví dụ, bạn có thể sắp xếp toàn bộ tập tin sử dụng lệnh này:

:%!sort 

Hoặc, bạn có thể loại chỉ là một vài dòng bằng cách chọn chúng trong chế độ hình ảnh và sau đó gõ:

:!sort 

Bạn có thể sắp xếp dây chuyền 5-10 sử dụng lệnh này:

:5,10!sort 

bạn có thể viết kịch bản dòng lệnh của riêng bạn (giả sử bạn biết làm thế nào để làm điều đó) mà đảo ngược dòng văn bản. Nó hoạt động như thế này:

bash$ myreverse 'hello world!' 
!dlrow olleh 

Bạn có thể áp dụng nó vào một trong các file đang mở trong vim trong cách chính xác mà bạn đã dùng sort:

:%!myreverse  <- all lines in your file are reversed 
+0

:%! Myreverse không hoạt động với tôi trong Vim. Nó cho đầu ra:/bin/bash: myreverse: lệnh không tìm thấy –

+1

@Masi: Ý tưởng là, nếu bạn đã viết một lệnh 'myreverse', đó là cách bạn sẽ thực thi nó. –

0

Nếu tôi muốn in 'Hello' cho các dòng 4,5, 6 và 7, có gì sai:

Nếu bạn muốn làm điều gì đó ở các vị trí được chọn ngẫu nhiên trong tệp, bạn nên ghi lại tổ hợp phím và phát lại chúng . Chuyển đến dòng đầu tiên bạn muốn thay đổi và nhấn qz để bắt đầu ghi vào đăng ký z. Thực hiện bất kỳ chỉnh sửa nào bạn muốn cho dòng đó và nhấn lại q khi bạn hoàn tất. Chuyển đến dòng tiếp theo bạn muốn thay đổi và nhấn @z để phát lại macro.

0

Nếu bạn muốn làm một số cuộc gọi python mà không soạn thảo vim với thông dịch viên python (mà sẽ cho phép bạn viết các plug-in bằng Python, và nó cũng cần thiết cho omnicomplete anyway), bạn có thể thử như thế này:

:.!python -c "import os; print os.getcwd()" 

Điều đó sẽ cho bạn biết bạn đang ở đâu trong ổ đĩa (đường dẫn hiện tại).

Bây giờ chúng ta hãy số một vài dòng, bắt đầu từ một tập tin rỗng vì vậy chúng tôi có thể xem kết quả một cách dễ dàng:

:.!python -c "for i in range(1,101): print i" 

(số vim dòng từ 1 không phải 0) Bây giờ chúng ta có chỉ số của mỗi dòng trong mỗi dòng lên đến dòng 100.

Bây giờ hãy đặt một tập lệnh nhỏ trong đường dẫn hiện tại của bạn (như được hiển thị ở trên) và chạy nó, xem cách nó hoạt động. Hãy sao chép dán một trong những ngớ ngẩn này. Trên thực tế, bạn sẽ thấy hữu ích nhất khi thực hiện tập lệnh để xuất một dòng trên mỗi dòng, nhưng bạn không phải thực hiện điều đó vì tập lệnh này hiển thị:

Vì vậy, bạn có thể gọi, ví dụ: "what.py"):

: 10,20 python what.py

(Lưu ý rằng hoàn tab của tên tập tin hoạt động, vì vậy bạn có thể xác minh nó thực sự trong đường dẫn)

Như bạn có thể thấy, mọi dòng được đưa vào kịch bản như đầu vào tiêu chuẩn. Đầu tiên nó xuất ra "hi", ở cuối "bye" và ở giữa, cho mỗi dòng bạn xuất "điều này là:" cộng với dòng. Bằng cách này bạn có thể xử lý từng dòng một. Lưu ý rằng bạn có thể thực hiện nhiều công việc phức tạp hơn là xử lý từng dòng, bạn thực sự có thể xem xét các dòng trước đó. Đối với những thứ như vậy, tôi muốn nhập sys và làm như sau:

import sys 

print "hello" 

for i in sys.stdin.readlines(): 
    i = i.rstrip("\n") # you can also prevent print from doing \n instead 
    print "here lyeth",i 

print "see you" 

Hy vọng điều đó sẽ hữu ích.

+0

Tôi đoán rằng điều này có thể được thực hiện ngắn hơn. Tôi không có phương pháp làm việc lâu dài. –

0

Tôi nghĩ điều bạn thực sự muốn được giải thích là here.

1

Bạn có thể thực thi mã, đọc các đầu ra trên các con trỏ và kết thúc bằng u, giả sử bạn đang thực thi mã python. Đơn giản và nhanh chóng.

:r !python % 

u 

Tôi thích nó qua bản đồ và chọn chế độ trực quan, như với too-much-php, bởi vì nó giữ cơ sở đơn giản!

+0

tuy nhiên điều này là không thể nếu bạn đang sử dụng một bộ đệm tmp - bạn phải lưu nó đầu tiên, sau đó nó hoạt động - bất kỳ cơ hội bạn biết làm thế nào để làm cho công việc này cho một bộ đệm tempory? – serup

0

Trên Windows, nếu bạn đang chỉnh sửa kịch bản python, chỉ cần làm:

!start python my... 

và nhấn tab để đạp xe dọc theo tên tập tin có sẵn, cho đến khi bạn tìm thấy trận đấu của bạn:

!start python myscript.py 

Nó sẽ chạy trong một cửa sổ cmd mới.Cá nhân tôi thích làm !start cmd và từ đó chạy Python, vì nó dễ dàng hơn để gỡ lỗi từ các thông báo lỗi cuối cùng.

1

nếu bạn đã viết kịch bản python của bạn trong một mới [No Name] đệm, sau đó bạn có thể sử dụng như sau:

:0,$!python 

khi bạn có một bộ đệm không có tên thì bạn không thể sử dụng '%', do đó sự cần thiết cho 0, $ có nghĩa là tất cả các dòng trong bộ đệm bắt đầu bằng dòng 0 cho đến dòng cuối cùng

đầu ra sẽ được ghi vào bộ đệm và không may không phải ở cuối

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