Cách được đề xuất để sử dụng Vim gấp cho mã Python là gì


112

Tôi quan tâm đến việc bật mã gấp trong Vim cho mã Python. Tôi đã nhận thấy nhiều cách để làm như vậy.

Có ai có cách ưu tiên để thực hiện việc gấp mã Python trong Vim không? I E,

  • Bạn có một plugin Vim cụ thể mà bạn sử dụng và thích không?
  • Bạn có sử dụng cách gấp thủ công hay bạn đặt điểm đánh dấu trong nhận xét?
  • Bất kỳ cách nào khác được đề xuất để thực hiện gấp mã cho Python trong Vim?

Câu trả lời:


117

Cá nhân tôi không thể thuyết phục mình xả mã của mình với các điểm đánh dấu. Tôi đã trở nên khá quen thuộc (và hiệu quả) với việc sử dụng tính năng gấp thụt lề. Cùng với việc lập bản đồ thanh dấu cách (xem bên dưới) để mở / đóng các nếp gấp và các lệnh zR và zM, tôi đang ở nhà. Hoàn hảo cho Python!

set foldmethod=indent
nnoremap <space> za
vnoremap <space> zf

81
: đặt foldmethod = thụt lề trước. Tôi đã tìm kiếm chỉ vì điều này và tình cờ nhận được câu trả lời của bạn, rất tuyệt! :)
tmadsen

47
Bạn tôi cũng thích set foldnestmax=2, theo cách này, các phương thức của các lớp được gấp lại, nhưng các câu lệnh bên trong thì không.
Denilson Sá Maia,

9
Tôi không chắc tại sao ánh xạ thứ hai lại nằm trong câu trả lời này cho zf. Nó không được sử dụng nếu đang sử dụng tính năng gấp thụt lề. Tuy nhiên, nếu bạn đang gấp thủ công, việc lập bản đồ sẽ rất hợp lý. za, tuy nhiên, có vẻ là cách tốt nhất để mở / đóng các nếp gấp một cách nhanh chóng. Tôi cũng khuyên bạn nên sử dụng điều hướng gấp (zk, zj).
Derek Litz

Bản đồ vnoremap rất tốt cho việc lập bản đồ thủ công. Trong ftplugin của bạn, hãy thêm set foldmethod = indent cho Python. Sau đó, trong .vimrc của bạn, hãy đặt foldmethod = manual. Bây giờ, bạn có thể gấp cả Python và phi Python với bản đồ spacebar
Lionel

26

Tôi sử dụng tệp cú pháp này cho Python. Nó đặt phương thức gấp thành cú pháp và gấp tất cả các lớp và hàm, ngoài ra không có gì khác.


làm thế nào để gấp sau khi mở ra? Tôi không thể tìm thấy lối tắt! tnx
Moj

Đã thử tệp cú pháp này và nó hoạt động hợp lý để làm nổi bật. Nhưng nó hoàn toàn không có tác dụng gì đối với việc gập nguội, khi tôi sử dụng 'zM' thì không có gì xảy ra, khi tôi sử dụng 'za' trong một lớp, tôi nhận được E490 (Không tìm thấy gấp). Có chuyện gì vậy?
Dani Gehtdichnixan

+1. Lúc đầu thử, mã python (lớp, phương thức) hoạt động tuyệt vời đối với tôi. Sử dụng câu trả lời của Walter ( stackoverflow.com/a/360634/605356 ) để ánh xạ thanh không gian để gấp các lệnh, nhưng giải pháp đó gần như không hoạt động (đối với tôi) như giải pháp này. Cảm ơn @Tomas đã tham khảo.
Johnny Utahh

@DaniGehtdichnixan, có lẽ bạn cần: AnsiEsc - hãy xem xét điều đó và tôi nghĩ bạn sẽ tìm ra giải pháp
serup 29/12/16

10

Tuy nhiên, một plugin khác để gấp mã Python. Khá đơn giản, xử lý docstrings và trên GitHub:

SimpylFold

Thưởng thức!


Điều này hoạt động tốt nhất. Tôi đã ngừng suy nghĩ về việc gấp mã vì nó chưa bao giờ khiến bạn đau đầu.
iankit

@iankit đôi khi tôi muốn nó cũng sẽ gấp if, forwhilekhối, làm bạn không?
iago-lito 'cân nhắc rời khỏi

hmm điều đó có thể không hữu ích lắm, tôi nghĩ. Nếu anh ta gấp các khối này lại thì không rõ nội dung là gì khi ở trạng thái gấp. Tuy nhiên với các phương thức và các khối được đặt tên khác, tên nói lên tất cả. Tôi có thể đoán được khối gấp khúc đang làm gì bằng cách nhìn vào tên của nó.
iankit

@iankit Tôi không biết .. Tôi muốn thử. Tại sao không thử ? ^ ^
iago-lito 'đang cân nhắc rời khỏi

7

Python rất phù hợp để gấp khi thụt lề, bit để viết mã của riêng tôi. Tôi sử dụng các điểm đánh dấu vì chúng có thể bẻ khóa tài liệu theo cách bạn muốn và có thể dùng như một loại mục lục. Tôi có cái này trong vimrc của mình để lật giữa hai cái khi tôi đang xem mã của ai đó.

#Toggle fold methods \fo
let g:FoldMethod = 0
map <leader>fo :call ToggleFold()<cr>
fun! ToggleFold()
    if g:FoldMethod == 0
        exe 'set foldmethod=indent'
        let g:FoldMethod = 1
    else
        exe 'set foldmethod=marker'
        let g:FoldMethod = 0
    endif
endfun
#Add markers (trigger on class Foo line)
nnoremap ,f2 ^wywO#<c-r>0 {{{2<esc>
nnoremap ,f3 ^wywO#<c-r>0 {{{3<esc> 
nnoremap ,f4 ^wywO#<c-r>0 {{{4<esc>
nnoremap ,f1 ^wywO#<c-r>0 {{{1<esc>


5

Tôi thực sự thích python_ifoldplugin .


1
Thật không may, plugin này sử dụng nhiều thời gian xử lý hơn tôi muốn (ngay cả với một phiên bản) vì tôi muốn giữ tốc độ vim của mình. Bất cứ một đề nghị nào khác?
Paul D. Eden

11
Câu trả lời này thực sự cần một mô tả.
sixtyfootersdude


3

Đối với tôi, cách gấp lý tưởng là chỉ gấp khối classdef, gấp thụt vào là quá nhiều so với sở thích của tôi. Tôi nghĩ rằng một giải pháp thanh lịch là sử dụng hệ thống cú pháp như thế này một đề cập bởi Tomas. Tuy nhiên, tệp này nhằm thay thế tệp cú pháp gốc và nó có thể kết thúc cũ hơn tệp gốc (tức là tập lệnh đó không đề cập đến cú pháp Python 3).

Giải pháp của tôi là đặt vào ~/.vim/syntaxthư mục một tệp có tên python.vimchỉ với các dòng quan trọng (lấy từ tập lệnh trên):

syn match   pythonDefStatement  /^\s*\%(def\|class\)/
       \ nextgroup=pythonFunction skipwhite
syn region  pythonFunctionFold  start="^\z(\s*\)\%(def\|class\)\>"
       \ end="\ze\%(\s*\n\)\+\%(\z1\s\)\@!." fold transparent

hi link pythonDefStatement Statement

Sau đó, chỉ cần kích hoạt gấp với :set foldmethod=syntax.


1
Tôi thích giải pháp này. Nhưng nó không khớp với 'n nếp gấp classdefs nếu chúng đứng ở đầu dòng. Vì tôi hầu như không thể đọc biểu thức, tôi gặp khó khăn khi cố gắng điều chỉnh nó để phù hợp ^def^class. Đây là tò mò mặc dù kể từ \s*nên đối phó tốt với điều này ..
Iago-Lito 'xem xét lại


2

Trong .vimrc:

set foldmethod=indent
set shiftwidth=4

Sau đó, zMđể che tất cả zRđể mở rộng tất cả. Tôi cũng nói thêm:

nnoremap <space> za
vnoremap <space> zf
map z1  :set foldlevel=0<CR><Esc>
map z2  :set foldlevel=1<CR><Esc>
map z3  :set foldlevel=2<CR><Esc>
map z4  :set foldlevel=3<CR><Esc>
map z5  :set foldlevel=4<CR><Esc>
map z6  :set foldlevel=5<CR><Esc>
map z7  :set foldlevel=6<CR><Esc>
map z8  :set foldlevel=7<CR><Esc>
map z9  :set foldlevel=8<CR><Esc>

Vì vậy, bạn có thể z1và liên z2kết từng chút một.


2

Tôi thực sự thích tập lệnh vim nhỏ này mà tôi đã viết cho .vimrc. Nó ánh xạ alt+1để gấp cấp độ thụt lề đầu tiên của python (định nghĩa lớp và chức năng), alt+2gấp cấp độ thứ hai (các phương thức lớp) và alt+0mở ra mọi thứ. Nó đảm bảo rằng nó chỉ gấp một cấp và không gấp bất kỳ cấp phụ nào được lồng vào nhau. Bạn vẫn có thể sử dụng zađể chuyển đổi gấp cho khối hiện tại. Lưu ý rằng trong ^[0, ^[altcho thiết bị đầu cuối của tôi. Không có nhiều kinh nghiệm về kịch bản vim vì vậy hãy thoải mái góp ý về chức năng :)

" Python folding
nnoremap ^[0 zR<CR>
nnoremap ^[1 :call Fold(0)<CR>
nnoremap ^[2 :call Fold(1)<CR>
function Fold(level)
    :let b:max = a:level + 1
    :set foldmethod=indent
    :execute 'set foldnestmax='.b:max
    :execute 'set foldlevel='.a:level
endfunction

1
Để sử dụng các phím thay thế trên máy Mac: stackoverflow.com/questions/7501092/can-i-map-alt-key-in-vim
Mike Bannister
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.