Có cách nào để che giấu qua các dòng?


8

Đây là trường hợp sử dụng của tôi:

Tôi có rất nhiều mã mà do thực thi kiểu, chúng tôi viết dòng mới sau và trước mỗi dấu ngoặc mở và đóng (tương ứng).

Thí dụ:

function func(args) {

    statement 1;
    statement 2;

    if (condition) {

        statement 3; 

    }

}

Mặc dù điều này rất hay và dễ đọc, tôi thực sự coi đây là một sự lãng phí không gian đáng để khám phá, nhưng các đồng đội của tôi không đồng ý với tôi. Về cơ bản đây là cách chúng tôi kiểm tra mã của chúng tôi và đó là điều đó.

Tôi đã nghĩ rằng có lẽ tôi có thể sử dụng các tính năng Vim để giúp tôi lưu màn hình bất động sản, trong khi vẫn cho phép tôi viết mã theo cách dài dòng. Tôi không ngại gõ nó ra, tôi chỉ muốn sử dụng không gian hiệu quả hơn. Tôi hình dung có lẽ tôi có thể để Vim tự động thu gọn các dòng trống vô cớ.

Tôi thấy hơi khó khăn khi thiết lập điều này bằng cách sử dụng các quy tắc cú pháp bởi vì bất cứ điều gì tôi viết dường như mâu thuẫn với các quy tắc cú pháp hiện có, nhưng điều tôi quyết định làm như một nỗ lực đầu tiên là viết các quy tắc này sẽ không va chạm:

syntax match aaaaaaaaa "\vabcd" conceal cchar=A
syntax match bbbbbbbbb "\vef\ngh" conceal cchar=B

Quy tắc thứ hai ở đây gần với những gì tôi muốn, đối với trường hợp khung mở là một dạng như /\v\{(\n\s*){2,}: khớp với một khung mở với bất kỳ số nào lớn hơn hoặc bằng 2 của một dòng mới theo sau chỉ có khoảng trắng.

Điều gì xảy ra bên trong vim tuy nhiên là như sau:

  1. Nếu tôi gõ abcdvào một dòng, nó sẽ được che giấu Anhư mong đợi.

  2. Nếu tôi gõ eftrên một dòng và ghtrên dòng tiếp theo, thì cả hai dòng đều bị che giấu B.

Tôi thực sự thực sự hy vọng hai dòng ef\nghsẽ được giấu thành một dòng duy nhất để tôi có thể tiết kiệm một số không gian bộ đệm dọc theo cách này.

Nhưng tôi thấy bây giờ có lẽ đó là một vấn đề chi tiết triển khai Vim. Sụp đổ các dòng là một vấn đề cho việc gấp mã để giải quyết, có lẽ chỉ nằm ngoài phạm vi khi có liên quan đến việc che giấu.

Vì vậy, tôi tự hỏi nếu vẫn còn một số cách để làm những gì tôi muốn làm. Có thể sử dụng dấu gấp bằng cách nào đó? Vấn đề là tôi chỉ cần gấp khoảng trắng.


3
Như tôi nhớ bạn không thể làm điều đó, và thậm chí nếu bạn có thể, bạn sẽ yêu cầu rất nhiều rắc rối bằng cách thực hiện nó. Làm thế nào về việc sử dụng một máy in đẹp để chuyển đổi giữa phong cách của bạn và "chính thức". Nếu bạn đang sử dụng, gitbạn thậm chí có thể sử dụng móc để thực hiện các thay đổi được áp dụng trong suốt.
Sato Katsura

2
Không thực sự có thể. Bạn có thể lạm dụng gấp cho điều đó, nhưng bạn mất cú pháp tô sáng trong trường hợp đó.
Christian Brabandt

1
Bạn không cần đánh dấu để gấp. :h fold-expr:h 'fdm'
Christian Brabandt

1
@ChristianBrabandt Có vẻ như có đủ năng lượng sẵn có ở đây để cho phép tôi viết một cái gì đó để tự động gấp những dòng này (hầu hết là trống hoặc chỉ có khoảng trắng) xung quanh niềng răng. Nhưng tôi sẽ phải ngồi xuống và thực sự suy ngẫm về nó, có vẻ như thế.
Steven Lu

2
Có lẽ bạn có thể báo cáo nó trong trình theo dõi vấn đề neovim, vì vậy một tính năng có thể hiển thị ở đó mà bạn có thể sử dụng để thực hiện điều này.
Farid Nouri Neshat

Câu trả lời:


2

Có thể lạm dụng các nếp gấp để ẩn các dòng trống thêm. Đây là cách người ta có thể làm điều đó:

function! SkipNewlineFoldExpr()
    let l:curline = getline(v:lnum)
    " fold begins at {$ or one line before }$
    if l:curline[-1:] == '{' || getline(v:lnum + 1)[-1:] == '}'
        return '>1'
    endif
    " fold ends one line after {$ or at }$
    if getline(v:lnum - 1)[-1:] == '{' || l:curline[-1:] == '}'
        return '<1'
    endif
    return 0
endfunction

function! SkipNewlineFoldText()
    " fold text matches non-empty line
    return getline(getline(v:foldstart)[-1:] == '{' ? v:foldstart : v:foldend)
endfunction

" customize how fold is defined
set foldexpr=SkipNewlineFoldExpr()
" customize how fold looks like
set foldtext=SkipNewlineFoldText()
" use 'foldexpr'
set foldmethod=expr

" Optional:
" drop highlighting of folds
" highlight clear Folded
" automatically close folds
" set foldclose=all
" automatically open folds on any actions on folded lines
" set foldopen=all

Nó sẽ trông giống như thế này:

Các dòng trống gấp

Như bạn có thể thấy không có cú pháp tô sáng trên các đường gấp, vẫn có thể là một cái gì đó dễ chịu hơn nhiều dòng trống không cần thiết. Bạn cũng có thể bật và tắt các nếp gấp bằng ziphím tắt trong trường hợp chúng cản đường bạn.

Folds không phải là một chủ đề nhỏ và Vim có một tệp trợ giúp riêng về chúng . Các tùy chọn liên quan được liên kết ở đó quá.

Hành vi chi tiết của con trỏ và tìm kiếm có thể được kiểm soát thông qua 'foldopen', kết hợp với 'foldclose'xác định khi các nếp gấp sẽ tự động được mở và đóng cho bạn.


Cảm ơn câu trả lời của bạn. Đây là một kỹ thuật rất thú vị, vì hóa ra có thể bắt đầu hai nếp gấp trên cùng một đường thẳng. Tôi sẽ thưởng cho bạn tiền thưởng nếu không có giải pháp tốt hơn xuất hiện! Tôi có thể thực hiện những gì tôi muốn bằng cách sử dụng này ( vi.stackexchange.com/questions/5175/iêu ).
Bart Louwers

1

Trước hết, đó là một thực thi phong cách shitty và bạn có cảm tình của tôi. Thay vì ẩn cách tạo bản đồ hoặc hàm (như hiển thị bên dưới) để xóa các dòng không cần thiết trước khi chỉnh sửa và thêm chúng khi bạn hoàn tất? một cái gì đó dọc theo dòng:

function! Clean()
    %s/{\n^$/{/
    %s/^$\n\(\s*}\)/\1/
endfunction

function! Pollute()
    %s/{$/{\r/
    %s/\(\s*}\)/\r\1/
endfunction

Ý tưởng cơ bản bắt đầu, xóa các dòng trống khi đọc và thay thế chúng khi viết, đã không thử nhưng tôi cảm thấy như thế này có thể được thêm dưới dạng autocmd như vậy:

au BufReadPost *.cpp call Clean()
au BufWritePost *.cpp call Pollute()

Câu trả lời của bạn không trả lời câu hỏi vì vậy tôi không thể thưởng cho bạn tiền thưởng. Trong trường hợp của tôi, tôi quan tâm đến việc ẩn siêu dữ liệu về một tiêu đề trong một phác thảo.
Bart Louwers

@Alex Không sao đâu. Tôi đã không trả lời cho tiền thưởng. Câu hỏi chỉ lọt vào mắt tôi khi tôi đến vim stackexchange để tự đặt câu hỏi. Tôi nghĩ rằng tôi sẽ cung cấp một tùy chọn thay thế như một cách để giải quyết câu hỏi ban đầu.
lonetwin
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.