Có cách nào để vô hiệu hóa Foldexpr trong quá trình tự động hoàn thành không?


7

Tôi đã nhận thấy rằng phương pháp gấp của vim ảnh hưởng đến hiệu quả của tự động hoàn thành, ví dụ như C-Nchậm và cực kỳ C-X Lchậm trong các tệp có kích thước trung bình với foldexprs tương đối đắt tiền .

Tôi không thể thấy giá trị khi tham khảo Foldexpr trong khi chạy qua tự động hoàn thành, vì vậy tôi muốn tắt tính năng này bằng cách nào đó để tôi có thể tự động hoàn tất có thể sử dụng lại.

Bất kỳ đề xuất?


EDIT: Trường hợp thử nghiệm

Một trường hợp thử nghiệm: Không có plugin; và chỉ điều này, phải là hàm Foldexpr tối thiểu nhất có thể (và hoàn toàn vô dụng, ngoại trừ việc đếm các yêu cầu) trong .vimrc:

let g:c = 0 
function! Myfoldexpr() 
   let g:c = 1 + g:c 
   return '0' 
endfunction

Bây giờ bắt đầu vim với một tài liệu trống. Chúng tôi sẽ sao chép 100 dòng tệp trợ giúp riêng của Vim và sau đó chạy dòng tự động hoàn thành, chọn đề xuất thứ 10, sau đó xem số lần gọi của Foldexpr.

:help
y100j:q
P:set foldexpr=Myfoldexpr()
:set fdm=expr
O<C-X><C-L><C-L><C-L><C-L><C-L><C-L><C-L><C-L><C-L><C-L><Esc>
:echo g:c
2088

Bây giờ, đó là một tệp 100 dòng, với các dòng tương đối ngắn và Foldexpr được gọi là 2088 lần (mặc dù 100 trong số này được thực hiện khi lần đầu tiên thiết lập Foldexpr). Foldexpr hiệu quả rõ ràng là tốt, nhưng các lập trình viên yêu cầu rất nhiều Foldexpr của chúng tôi, vì vậy chúng nhất thiết không tầm thường, và khi thời gian thực hiện của chúng được nhân lên vài nghìn, nó khiến bạn chọn giữa tự động hoàn thành hoặc thụt lề cho năng suất. Tham lam / lười biếng Tôi muốn có thể sử dụng cả hai! Ngoài việc cố gắng viết lại một số plugin gấp dựa trên Foldexpr được thiết lập khá tốt (Tôi đã thử viết lại php-Folding và sau nhiều ngày cố gắng tối ưu hóa nó thành trạng thái khả thi, tôi đã từ bỏ Foldexpr cho php), có lẽ có một cách để sử dụng ánh xạ để bật fdm=manualtrước khi tự động hoàn thành hoặc một số như vậy?


Bạn đã xem xét đăng lên danh sách vim_dev?
lcd047

Tôi sẽ đăng bất cứ điều gì hữu ích trở lại đây, nhưng đây là bài đăng danh sách
vim_dev

Tôi nghĩ rằng trường hợp thử nghiệm của bạn là sai. Nếu tôi tạo một tệp thử nghiệm và thêm một số văn bản (chỉ cần thực hiện iHello<Esc>, g:cbiến cũng được tăng lên 20, sau đó thực oWorld<Esc>hiện nó 38... Vì vậy, số lượng đánh giá foldexprdường như không liên quan đến việc sử dụng hoàn thành ... Hãy thử tải Vim với một vimrc tối thiểu tập tin và xem nếu sự cố vẫn xảy ra, đó có thể là một cài đặt khác hoặc một plugin.
Martin Tournoij

"Tôi không thể thấy giá trị khi tham khảo Foldexpr trong khi chạy qua tự động hoàn thành" , tốt, bạn đang chèn văn bản; vì vậy Vim cần tính lại những dòng nào cần gấp.
Martin Tournoij

Trường hợp kiểm tra là cố tình ngu ngốc, trở lại =. Nhưng chỉ từ thứ tự cường độ bạn có thể thấy một cái gì đó đang lên. Ở bình luận thứ 2, Vâng, nhưng tôi nghĩ rằng nó nên làm điều đó khi kết thúc một ứng cử viên chèn (giống như nó làm p), tôi nghĩ những gì nó đang làm là làm điều đó cho mỗi nhân vật của ứng cử viên chèn.
artfulrobot

Câu trả lời:


4

Tôi đã gặp vấn đề một lúc trước với cú pháp gập PHP trong đó việc gõ {sẽ can thiệp vào các lần gấp tiếp theo cho đến khi tôi gõ lần đóng tương ứng }. Tôi đã tìm thấy một đề xuất ở đâu đó (tôi nghĩ rằng đó là trên Vim Wiki) để tạm thời đặt nếp gấp thành thủ công trong khi ở chế độ chèn. Tôi không biết liệu đây có phải là một đề xuất đủ để đưa ra câu trả lời thay vì nhận xét hay không, nhưng mã trong các bình luận không được khuyến khích và có thể bạn có thể điều chỉnh nó cho hoàn cảnh của mình. Đây là hai dòng có liên quan từ .vimrc của tôi.

autocmd InsertEnter * if !exists('w:last_fdm') | let w:last_fdm=&foldmethod | setlocal foldmethod=manual | endif
autocmd InsertLeave,WinLeave * if exists('w:last_fdm') | let &l:foldmethod=w:last_fdm | unlet w:last_fdm | endif

2

có lẽ có một cách để sử dụng ánh xạ để bật fdm=manualtrước khi tự động hoàn thành hoặc một số như vậy?

Vâng, điều này làm điều đó:

inoremap <C-x> <Esc>:setlocal foldmethod=manual<CR>a<C-x>
autocmd CompleteDone * :setlocal foldmethod=expr
autocmd InsertLeave * :setlocal foldmethod=expr

Chúng tôi remap <C-x>để thiết lập đầu tiên foldmethodđến manualtrước khi gọi <C-x>, và với sự CompleteDoneInsertLeaveautocommands chúng tôi thiết lập lại nó để expr.

Tôi đã thử nghiệm điều này bằng cách nhấn <C-l>11 lần; g:cgiá trị của tôi :

  • Sau khi khởi động Vim: 202
  • Với bản hack này: 408
  • Nếu không có hack này: 2130

Như tôi đã nói trong các ý kiến: không nên yêu cầu hack này. Bạn đã đề cập đến "tương đối đắt tiền foldexpr", tôi nghi ngờ rằng đây là vấn đề thực sự ; Tất nhiên tôi không thể chắc chắn, vì bạn đã không đăng bài của mình foldexpr, nhưng tôi nghĩ rằng đáng để hỏi một câu hỏi mới về điều này ( "Làm thế nào tôi có thể làm cho Foldexpr này nhanh hơn?" ).


Cảm ơn, sẽ thử điều này. Đối với Foldexpr cụ thể, xem github.com/tmhedberg/SimpylFold cho python và github.com/swekaj/php- Foldexpr.vim cho php. Nhưng vâng, cả hai chúng tôi đồng ý rằng đó là một câu hỏi khác!
artfulrobot

@artfulrobot Python foldexprcũng khá chậm đối với tôi ... Tôi không chắc điều này có thể được cải thiện trong trường hợp cụ thể này, vì vậy cách giải quyết này có thể là tốt nhất ở đây: - / Không chắc tại sao cần có Foldexpr PHP? Không thể tệp cú pháp làm điều đó (điều này thường nhanh hơn)
Martin Tournoij
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.