2013-06-02 26 views
9

Đối với các ngôn ngữ có số {} để biểu thị các khối, vim có khóa toàn năng %. Điều chuyển động tương đương cho mã python là gì? Hoặc ít nhất để di chuyển đến dòng tiếp theo/trước đó với cùng một thụt lề.Tương đương% chuyển động cho các tệp Python

+0

Tại sao không chỉ tải xuống plugin python? – jamylak

+0

* Hoặc ít nhất để di chuyển đến dòng tiếp theo/trước đó với cùng một thụt lề * - bạn có thể giải thích ý bạn với điều này không? – timss

Trả lời

4

Các vim wiki đề nghị cam kết ràng buộc như:

nnoremap <M-,> k:call search('^'. matchstr(getline(line('.')+1), '\(\s*\)') .'\S', 'b')<CR>^ 
nnoremap <M-.> :call search('^'. matchstr(getline(line('.')), '\(\s*\)') .'\S')<CR>^ 

Cũng như cung cấp một giải pháp toàn diện hơn:

" Jump to the next or previous line that has the same level or a lower 
" level of indentation than the current line. 
" 
" exclusive (bool): true: Motion is exclusive 
" false: Motion is inclusive 
" fwd (bool): true: Go to next line 
" false: Go to previous line 
" lowerlevel (bool): true: Go to line with lower indentation level 
" false: Go to line with the same indentation level 
" skipblanks (bool): true: Skip blank lines 
" false: Don't skip blank lines 
function! NextIndent(exclusive, fwd, lowerlevel, skipblanks) 
    let line = line('.') 
    let column = col('.') 
    let lastline = line('$') 
    let indent = indent(line) 
    let stepvalue = a:fwd ? 1 : -1 
    while (line > 0 && line <= lastline) 
    let line = line + stepvalue 
    if (! a:lowerlevel && indent(line) == indent || 
      \ a:lowerlevel && indent(line) < indent) 
     if (! a:skipblanks || strlen(getline(line)) > 0) 
     if (a:exclusive) 
      let line = line - stepvalue 
     endif 
     exe line 
     exe "normal " column . "|" 
     return 
     endif 
    endif 
    endwhile 
endfunction 

" Moving back and forth between lines of same or lower indentation. 
nnoremap <silent> [l :call NextIndent(0, 0, 0, 1)<CR> 
nnoremap <silent> ]l :call NextIndent(0, 1, 0, 1)<CR> 
nnoremap <silent> [L :call NextIndent(0, 0, 1, 1)<CR> 
nnoremap <silent> ]L :call NextIndent(0, 1, 1, 1)<CR> 
vnoremap <silent> [l <Esc>:call NextIndent(0, 0, 0, 1)<CR>m'gv'' 
vnoremap <silent> ]l <Esc>:call NextIndent(0, 1, 0, 1)<CR>m'gv'' 
vnoremap <silent> [L <Esc>:call NextIndent(0, 0, 1, 1)<CR>m'gv'' 
vnoremap <silent> ]L <Esc>:call NextIndent(0, 1, 1, 1)<CR>m'gv'' 
onoremap <silent> [l :call NextIndent(0, 0, 0, 1)<CR> 
onoremap <silent> ]l :call NextIndent(0, 1, 0, 1)<CR> 
onoremap <silent> [L :call NextIndent(1, 0, 1, 1)<CR> 
onoremap <silent> ]L :call NextIndent(1, 1, 1, 1)<CR> 

nào sử dụng:

  • [l]l nhảy đến trước hoặc dòng tiếp theo với cùng mức thụt đầu dòng như hiện tại hàng.
  • [L]L chuyển đến dòng trước đó hoặc dòng tiếp theo với mức thụt đầu dòng thấp hơn dòng hiện tại.
0

Bạn luôn có thể sử dụng ý kiến ​​để chèn {} (sẽ không làm được điều này nếu những người khác chia sẻ):

class Game(object): # { 
    def __init__(self, num, end): # { 
     pass 
    # } 
# } 
+9

Ugh, tôi hy vọng tôi không bao giờ gặp phải một kiểu mã hóa như vậy. – timss

+0

Chỉ nhận được phiếu bầu không có bình luận. Tôi hiểu phong cách mã hóa không dễ chịu. Tôi đã nói rằng tôi sẽ không làm điều này nếu chia sẻ mã. Kiểu mã hóa cho phép chuyển động '%' trong vim. – cforbish

3

Vim có {} chuyển động để di chuyển giữa các "đoạn" và p văn bản tương ứng -object (vip, dap).

Các ftplugin Python mặc định cũng (lại) định nghĩa [[]] để di chuyển đến lớp tiếp theo và trước và ]m[m chuyển sang phương pháp tiếp theo và trước đó.

indent-objectrất cũng hữu ích cho Python.

+0

tha thứ cho tôi, nhưng đối tượng thụt lề là gì? Liên kết xin vui lòng? – Ayman

+0

Xin lỗi, tôi đã có URL trong khay nhớ tạm của tôi nhưng tôi quên đặt nó vào câu trả lời. Nó rất dễ tìm, mặc dù. – romainl

+0

Khá mát mẻ nhưng thụt lề-đối tượng không hoạt động ở chế độ bình thường. Có cách nào để buộc nó hoạt động ở chế độ bình thường không? –