2011-01-17 33 views
5

Tôi bắt đầu sử dụng VIM để lập trình Python. Tôi đã gặp một số vấn đề, hy vọng ai đó có thể giúp tôi với vấn đề này.VIM + Python - lệnh "gd" không hoạt động đúng

Lệnh "gd" được cho là đưa bạn đến địa điểm đầu tiên mà một biến được xác định/sử dụng trong hàm hiện tại. Từ những gì tôi hiểu, nó giống như làm "[[" để đi đến đỉnh của hàm, sau đó thực hiện tìm kiếm tên biến.

Vấn đề là, khi tôi thử điều này trong các hàm Python, vim tìm thấy sự xuất hiện đầu tiên của biến trong toàn bộ tệp.

Bất kỳ suy nghĩ nào về lý do điều này xảy ra/cách tôi có thể khắc phục vấn đề này?

Trả lời

3

Tôi nghĩ rằng vấn đề là do cách mà Vim xử lý một hàm. Từ các tài liệu cho [[:

      *[[* 
[[   [count] sections backward or to the previous '{' in 
      the first column. |exclusive| 
      Note that |exclusive-linewise| often applies. 

Trừ khi một phần được bằng cách nào đó được xác định đặc biệt cho file python đâu đó (tôi không thuyết phục này có thể là họ đang nghĩa vụ phải được hai chữ nroff phần), điều này sẽ đảm nhận rằng cần có một dấu ngoặc mở trong cột đầu tiên, không liên quan đến các tệp python.

Tôi muốn đề nghị hỏi về danh sách gửi thư của Vim để xem có bất kỳ plugin hoặc công việc nào cho việc này hay không. Ngoài ra, bạn có thể xác định một ánh xạ như thế này:

nmap gd :let varname = '\<<C-R><C-W>\>'<CR>?\<def\><CR>/<C-R>=varname<CR><CR> 

Điều này có thể được thực hiện một cách thanh lịch hơn với chức năng, nhưng đây chỉ là một cách nhanh chóng hoạt động. Nó bản đồ gd đến một chức năng mà bộ biến 'varname' để giữ từ con trỏ đang bật, tìm kiếm lạc hậu cho def và sau đó tìm kiếm về phía trước cho biến:

:let varname =    " Variable setting 
    '\<      " String start and word boundary 
    <C-R><C-W>     " Ctrl-R, Ctrl-W: pull in the word under the cursor 
    \>'      " Word boundary and string end 
    <CR>      " Enter - finish this command 
    ?       " Search backwards for... 
    \<def\>     " def but not undefined etc (using word boundaries) 
    <CR>      " Enter - Perform search 
    /      " Now search forward 
    <C-R>=      " Pull in something from an expression 
    varname<CR>    " The expression is 'varname', so pull in the contents of varname 
    <CR>      " Enter - perform search 
+0

"[[" * làm * hoạt động trong các tệp Python để tìm kiếm một lớp/lớp trước đó. Từ những gì tôi có thể nói, nó được định nghĩa lại trong tệp "python.vim" trong ftplugin, để thực hiện một "Python_jump". Một (liên quan?) Vấn đề là, trong khi "[[" hoạt động tốt trong chế độ bình thường, nó không hoạt động tốt trong chế độ trực quan. Tôi đoán có chỉ là một lỗi ở đó, nhưng tôi vẫn giữ hy vọng rằng tôi chỉ thiếu một cái gì đó và là ngu ngốc. –

+0

Tôi đoán '[[' hoạt động trong các tệp Python do ánh xạ tùy chỉnh, nhưng 'gd' dựa trên việc cài đặt sẵn của' [['. – DrAl

2

Tôi không xác định lại varname trong Vim của tôi cấu hình, và nó hoạt động tốt, nhưng tôi có vim biên dịch với python. Có thể đây là vấn đề?

Bạn có cài đặt phiên bản VIM 7.x, được biên dịch bằng hỗ trợ Python không? Để kiểm tra điều này, hãy nhập :python print “hello, world” vào VIM. Nếu bạn thấy thông báo lỗi như E319: Sorry, the command is not available in this version, thì đã đến lúc nhận thông báo mới.

+0

Điều này thật tuyệt vời, tôi không biết bạn có thể gọi bất kỳ thông dịch viên nào từ dòng lệnh! Cảm ơn vì tiền hỗ trợ! Bạn cũng có thể kiểm tra những gì đã được biên dịch trong vim bằng cách gõ ': version' và kiểm tra cờ python có mặt. –

+0

Tôi không có hỗ trợ Python. Tôi đang sử dụng Windows và tôi chỉ sử dụng trình cài đặt cũ đơn giản mà tôi tìm thấy trên trang tải xuống vim. Làm thế nào để tôi nhận được một phiên bản với sự hỗ trợ của Python? –

+0

Tôi nghĩ cách đơn giản nhất là lấy cấu hình sẵn và đi kèm với vim tăng cường khác nhau từ kem. Có "Windows Vim trình cài đặt mà không có kem" (Tôi không thích bố trí kem và tất cả những thứ gui của nó - nó làm chậm tôi xuống, nhưng phiên bản vim mà đi với nó là tốt). http://cream.sourceforge.net/download.html –

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