Bạn có thể tự động mở rộng Vim khi con trỏ chạm vào nó không?Có cách nào để mở rộng Vim tự động khi bạn đặt con trỏ lên đó không?
Trả lời
Xem tùy chọn foldopen
. Nó kiểm soát các nhóm lệnh nào sẽ dẫn đến mở màn hình đầu tiên nếu con trỏ được di chuyển vào một lần đóng.
Lưu ý rằng các chuyển động theo chiều dọc không mở được nếp gấp. Hơn nữa, không có cài đặt trong foldopen
để bật hành vi này. Khi hor
mục là được đặt trong tùy chọn foldopen
, để mở màn hình đầu tiên, bạn có thể sử dụng h
, l
hoặc lệnh chuyển động ngang khác. Trong trường hợp nếu điều quan trọng là tự động mở lần trên bất kỳ chuyển động con trỏ nào chạm vào nó, người ta có thể tiếp cận vấn đề này bằng cách ánh xạ lại một số tập con của lệnh chuyển động thẳng đứng như được hiển thị bên dưới.
nnoremap <silent> j :<c-u>call MoveUpDown('j', +1, 1)<cr>
nnoremap <silent> k :<c-u>call MoveUpDown('k', -1, 1)<cr>
nnoremap <silent> gj :<c-u>call MoveUpDown('gj', +1, 1)<cr>
nnoremap <silent> gk :<c-u>call MoveUpDown('gk', -1, 1)<cr>
nnoremap <silent> <c-d> :<c-u>call MoveUpDown("\<lt>c-d>", +1, '&l:scroll')<cr>
nnoremap <silent> <c-u> :<c-u>call MoveUpDown("\<lt>c-u>", -1, '&l:scroll')<cr>
nnoremap <silent> <c-f> :<c-u>call MoveUpDown("\<lt>c-f>", +1, 'winheight("%")')<cr>
nnoremap <silent> <c-b> :<c-u>call MoveUpDown("\<lt>c-b>", -1, 'winheight("%")')<cr>
function! MoveUpDown(cmd, dir, ndef)
let n = v:count == 0 ? eval(a:ndef) : v:count
let l = line('.') + a:dir * n
silent! execute l . 'foldopen!'
execute 'norm! ' . n . a:cmd
endfunction
Một giải pháp kém hơn, nhưng tiết kiệm hơn sẽ là mở một nếp gấp trên mỗi chuyển động của con trỏ .
autocmd CursorMoved,CursorMovedI * silent! foldopen
Thật không may, giải pháp này không phải là giải pháp chung. Sau khi gấp dưới con trỏ được mở, con trỏ được đặt trên hàng đầu tiên của nếp gấp đó. Nếu hành vi này là không mong muốn, người ta có thể thực hiện theo hướng dọc của một chuyển động và đặt con trỏ trên hàng cuối cùng của màn hình khi con trỏ đang di chuyển từ dưới lên.
autocmd CursorMoved,CursorMovedI * call OnCursorMove()
function! OnCursorMove()
let l = line('.')
silent! foldopen
if exists('b:last_line') && l < b:last_line
norm! ]z
endif
let b:last_line = l
endfunction
Tuy nhiên, một lần sẽ không được mở nếu chuyển động nhảy qua màn hình đầu tiên. Đối với ví dụ , 2j
trên dòng ngay trên màn hình đầu tiên sẽ đặt con trỏ trên dòng ngay sau lần đó, không phải dòng thứ hai trong đó.
Đặt lại giải pháp 'CursorMoved' từ các bản sửa đổi trước đó. –
:help fdo
và có thể :help fcl
có thể giúp bạn. Tôi có dòng này trong vimrc của tôi:
set foldopen=block,hor,insert,jump,mark,percent,quickfix,search,tag,undo
set foldopen=all
dường như để làm những gì bạn muốn. Bạn cũng có thể làm cho một autocommand cho di chuyển con trỏ:
au CursorMoved * call AutoOpen()
gọi một chức năng như:
function! AutoOpen()
if foldclosed(".") == line(".")
call feedkeys("zo")
endif
endfunction
Nếu bạn muốn điều này cũng làm việc trong chế độ chèn, sử dụng:
au CursorMoved,CursorMovedI * call AutoOpen()
Thật không may, phương pháp này có nhược điểm (xem câu trả lời của tôi). –
@ib: Tôi biết nó không hoàn hảo nhưng tôi không hiểu những hạn chế. Bạn có thể xây dựng? Cảm ơn. – Eelvex
Điều hiển nhiên (và đã được mô tả trong câu trả lời của tôi).Di chuyển con trỏ dòng bên cạnh một nếp gấp và di chuyển một dòng lên (với 'k', ví dụ). Các nếp gấp sẽ được mở ra và con trỏ sẽ xảy ra được trên dòng đầu tiên của lần đó, không phải trên một trong những cuối cùng vì nó phải được hợp lý (có nghĩa là ngữ nghĩa của dòng theo phong trào thẳng đứng dòng). Để thấy một hạn chế khác, đặt con trỏ trên dòng ngay trên một nếp gấp và gõ '2j'. Con trỏ sẽ nhảy qua toàn bộ nếp gấp, nó sẽ được di chuyển không phải là hai dòng xuống, nhưng như nhiều dòng như gấp có. –
- 1. Có thể tự động đặt mã hóa tệp UTF16 khi mở tệp thuộc loại đó không?
- 2. Vim vị trí con trỏ sau khi mở rộng thẻ html
- 3. Vim tập tin mở dưới con trỏ
- 4. Trong Vim, bạn có thể ngừng thay đổi màu của các ký tự khoảng trắng với 'đặt con trỏ' không?
- 5. Làm cách nào để bạn tự động đặt bố cục cho mẫu Jade để mở rộng trong Node.js/Express 3.0?
- 6. cách đặt con trỏ ở đầu tab `
- 7. Vị trí con trỏ trong chữ viết tắt VIM
- 8. Vim - lệnh chế độ cũ - có cách nào để di chuyển vị trí con trỏ không?
- 9. Cách tắt các phím Esc và con trỏ trong vim
- 10. Danh sách động tự động mở rộng
- 11. cách chèn $$ và đặt con trỏ giữa chúng ở chế độ tự động
- 12. Tự động mở NERDTree trong vim
- 13. Tự động mở rộng gấp khi đi đến một số dòng
- 14. Cách để Xcode không tự động mở các dự án đã mở trước đó
- 15. Có thể "mở rộng" IntelliJ sao cho tôi có thể mở tệp hiện tại trong VIM
- 16. Vim lưu sau đó tự động thực hiện?
- 17. Trong VS2010 có cách nào để sửa biểu tượng con trỏ khỏi bị kẹt trên con trỏ mà không cần khởi động lại trang không?
- 18. Có cách nào để tự động cài đặt .NET không?
- 19. Cách: gán con trỏ vim vào một dòng nhất định trong cửa sổ và có cuộn văn bản bên dưới vị trí con trỏ đó?
- 20. Làm cách nào để mở rộng cài đặt hoặc biến trong cụm từ thông dụng vim?
- 21. Làm cách nào để bạn mở rộng LINQ to SQL?
- 22. Luôn giữ con trỏ ở giữa Vim
- 23. Dán vào Vim mà không cần di chuyển con trỏ
- 24. VIM có thể giải nén tự động các tệp gzip với phần mở rộng tệp khác không?
- 25. Đặt con trỏ trong Highcharts
- 26. Có cách nào để mở rộng RichString của Scala không?
- 27. Con trỏ có xấu không?
- 28. Con trỏ Chuyển/Vị trí trong Vim
- 29. Con trỏ không hiển thị trong EditText khi không có văn bản ở đó
- 30. Mở rộng Vim (qua Python)?
Tại sao bạn chấp nhận câu trả lời của Eelvex chứ không phải của tôi? Không chỉ tôi đề xuất giải pháp này (và phiên bản thậm chí còn tao nhã hơn, 'au CursorMoved, CursorMovedI * sil! Foldo') * sớm hơn *, vì nó rõ ràng từ lịch sử sửa đổi, nhưng cũng phát triển cách giải quyết vấn đề một cách nhất quán hơn. –
Xin lỗi. Tôi không nhớ tại sao tôi lại làm thế. Đã sửa. – dan