Làm set foldmethod=expr
và sử dụng 'foldexpr'
để đặt biểu thức tập lệnh vim sẽ xác định điểm bắt đầu gấp.
set foldmethod=expr
set foldexpr=get(split(getline(v:lnum-1)),0,'')!=get(split(getline(v:lnum)),0,'')?'>1':'='
Điều này có vẻ phức tạp hơn so với thực tế, bởi vì chúng ta không thể dễ dàng sử dụng khoảng trắng trong :set
, nhưng với khoảng trắng và dòng mới hoặc 2, nó trông giống như:
get(split(getline(v:lnum - 1)), 0, '') != get(split(getline(v:lnum)), 0, '')
\ ? '>1'
\ : '='
Tổng quat
Về cơ bản, điều này so sánh từ đầu tiên của mỗi dòng với dòng trước đó. Nếu các từ khác nhau thì dòng bắt đầu của nếp gấp >1
. Nếu không, nó giữ cùng một mức độ gấp , =
.
Vinh quang của chi tiết
set foldmethod=expr
để bảo Vim sử dụng biểu thức vim script để xác định các nếp gấp
'foldexpr'
tùy chọn giữ biểu thức tập lệnh vim
- Đánh giá điều kiện với một ternary trả về
>1
khi một nếp gấp sẽ bắt đầu và =
khi mức độ gấp sẽ tiếp tục
v:lnum
là dòng hiện tại 'foldexpr'
đang chạy để cập nhật các nếp gấp
- Lấy nội dung dòng hiện tại (
v:lnum
) và dòng trước ( v:lnum - 1
) thông quagetline()
- Tách từng dòng thành các từ thông qua
split()
- Sử dụng
get()
để có được chỉ mục đầu tiên của các từ mới chia
- Sử dụng một giá trị mặc định
''
trong trường hợp một dòng trống. ví dụget(words, 0, '')
- So sánh từ đầu tiên của dòng hiện tại với từ đầu tiên của dòng trước đó trong phần điều kiện của ternary
Lưu ý: phương pháp này có thể có một số vấn đề về hiệu suất với các tài liệu rất lớn
Để được trợ giúp thêm xem:
:h 'foldmethod'
:h 'foldexpr'
:h getline(
:h v:lnum
:h split(
:h get(