Có cách nào để sử dụng nhiều phương pháp gấp vim cùng một lúc không?


14

Tôi đã foldmethod=indentthiết lập ~/.vimrcvà nói chung là phù hợp với tôi và tôi muốn giữ nó.

Tuy nhiên, có một vài tệp tôi có mà tôi chỉnh sửa thường xuyên (và thuộc quyền kiểm soát độc quyền của tôi), trong đó tôi muốn thêm vào một hệ thống dựa trên điểm đánh dấu, đặc biệt là khi tôi mở tệp một phần lớn tôi hiếm khi nhìn vào (đã được 'phân định' bằng cách thụt lề) được gấp lại. Có vẻ như foldmethod=markersẽ cho phép tôi làm điều đó (Tôi không bận tâm đến nhận xét kỳ lạ trong tệp để chỉ ra các 'nếp gấp trước' này nếu cần), nhưng tôi vẫn muốn foldmethod=indentđặt để tôi có thể sử dụng zc, zov.v. gấp hoặc mở ra các phần bằng cách thụt lề. Theo như tôi có thể nói tôi không thể đặt Foldmethod thành nhiều giá trị.

Có cách nào khác để tôi có thể đạt được điều này (lý tưởng nhất là sử dụng nội dung nào đó được nhúng trong tệp) không?


Tôi cũng đang cố gắng để có được cả hai phương pháp đánh dấu và thụt lề làm việc cùng một lúc. Tôi cũng tin rằng sử dụng biểu thức gấp là lựa chọn tốt nhất. Bạn đã tìm thấy một biểu thức để phù hợp với cả thụt lề và đánh dấu?
Jp_

1
@Jp_ không, 'không sợ.
Andrew Ferrier

Câu trả lời:


10

Mỗi cửa sổ có thể có giá trị cục bộ riêng của nó 'foldmethod'; những gì bạn thiết lập ~/.vimrcchỉ là mặc định toàn cầu. Có nhiều cách để đặt một giá trị cục bộ khác nhau cho một bộ đệm cụ thể :

  1. Thủ công với :setlocal foldmethod=marker
  2. Đối với một kiểu tệp cụ thể (ví dụ: tệp Java): :autocmd FileType java setlocal foldmethod=marker(hoặc trong ~/.vim/after/ftplugin/java.vim)
  3. Đối với (các) tệp cụ thể: :autocmd BufRead /path/to/file setlocal foldmethod=marker
  4. Bên trong tệp thông qua một modeline (vì dù sao bạn cũng phải thêm các điểm đánh dấu, tôi thích điều này hơn):

/* vim: set fdm=manual : */

Vẫn có thể chỉ có một phương thức gấp trong một cửa sổ duy nhất. Nếu bạn muốn sử dụng các chiến lược khác nhau, bạn phải chọn một phương pháp linh hoạt hơn (ví dụ expr) và thực hiện lại (các) phương thức "khác" trong đó (ví dụ: bằng cách 'foldexpr'xem xét thụt lề của bạn ). Hoặc bạn sử dụng hai phần tách cửa sổ cho cùng một bộ đệm và đặt các nếp gấp khác nhau cho mỗi phần tách.

Vì đó có thể không phải là những gì bạn muốn nghe, bạn có thể hack một cái gì đó cùng với một :autocmd CursorMovedcông tắc chuyển đổi nếp gấp dựa trên dòng hiện tại:

" Use markers when in the first 100 lines, else use indent.
:autocmd CursorMoved,CursorMovedI <buffer> let &l:foldmethod = (line('.') <= 100 ? 'manual' : 'indent')

1
Cảm ơn. Vì vậy, điều này cho tôi biết tôi có thể đặt Foldmethod thành điểm đánh dấu bên trong bộ đệm đó. Nhưng những gì tôi đang tìm kiếm là một cái gì đó vẫn cho phép tôi sử dụng nếp gấp thụt lề, trong khi có một số phần ( được phân định bởi một vết lõm) được gấp trước. Nếu tôi làm (4) ở trên, zc, zo, và vân vân sẽ không còn hoạt động như mong đợi trong bộ đệm đó. Tôi đã làm rõ câu hỏi của mình.
Andrew Ferrier

Câu hỏi của bạn không rõ ràng trong khía cạnh đó, cảm ơn bạn đã làm rõ. Tôi đã sửa đổi câu trả lời của mình.
Ingo Karkat

Vâng, xin lỗi nếu tôi không rõ ràng. Foldexpr nghe có vẻ là cách tiếp cận tốt nhất nhưng cũng phức tạp. Tôi sẽ thử nó mặc dù. +1 cho con trỏ.
Andrew Ferrier

Cảm ơn một lần nữa. Tôi đã cố gắng viết Foldexpr và mở một Q liên quan ở đây có thể được quan tâm: superuser.com/questions/560167/ mẹo
Andrew Ferrier

@IngoKarkat: Trong đoạn đầu tiên bên dưới dòng bạn đã viết rằng chỉ có thể có một phương thức gấp cho mỗi bộ đệm . Tôi tin rằng nên được trên mỗi cửa sổ .
garyjohn
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.