Ẩn một số dòng nhất định (không gấp)


9

Tôi muốn có thể ẩn một số dòng nhất định trong bộ đệm của mình để hiển thị tất cả (và có thể chuyển đổi khi nhìn thấy chúng). Tôi tìm thấy những câu hỏi tương tự , nhưng chúng không giải quyết được vấn đề của tôi. Tôi không muốn sử dụng nếp gấp cho việc này.

Tôi muốn chính xác những gì?

Khi tôi mở một tài liệu, tôi muốn Vim không đọc các dòng bình luận. Nó sẽ hoạt động như thể những dòng này hoàn toàn không tồn tại trong tài liệu, chỉ có một ngoại lệ: Tôi cần một chỉ báo trực quan (ví dụ: trong một cột bổ sung ở bên cạnh) cho tôi biết đây là một nhận xét không được hiển thị.

Khi nhấn một tổ hợp phím nhất định, tôi muốn tất cả các bình luận hiển thị (tức là hành vi Vim bình thường).

Tôi muốn có thể sửa đổi tài liệu với các bình luận không được hiển thị. Khi lưu, toàn bộ tài liệu được lưu với các nhận xét (chúng luôn được lưu 1 dòng phía trên văn bản nằm dưới chúng ở đầu).

Tại sao tôi muốn điều này?

Nó phá hủy ít hơn và trông trực quan dễ chịu hơn. Lấy .vimrcví dụ - bạn có thể có tất cả các cài đặt độc đáo bên dưới nhau. Nếu bạn muốn thay đổi một cái gì đó, hoặc không chắc chắn tại sao bạn đặt nó theo cách này, chỉ cần chuyển đổi nhận xét của bạn.


Hy vọng bạn không bận tâm đến câu hỏi của tôi ... Tại sao bạn đặc biệt loại trừ các nếp gấp?
Roflo

1
Tất nhiên là tôi không :) Tôi đã loại trừ các nếp gấp vì tôi biết cách thu gọn các bình luận bằng các nếp gấp - nhưng các bình luận được gấp lại vẫn làm mất tập trung, cản trở dòng đọc và không thực sự hấp dẫn về mặt trực quan.
cbaumhardt

Tôi cũng muốn nhiều thứ, nhưng tôi phát hiện ra rằng tốt hơn là nên gắn bó / thích nghi với những gì tôi cần;)
VanLaser

@cbaumhardt bạn có thể gấp nó và sử dụng cài đặt / chức năng 'Foldtext' tùy chỉnh để ẩn mọi thứ
Christian Brabandt

Câu trả lời:


8

Tôi không biết làm thế nào để đạt được chính xác những gì bạn muốn, chỉ một phần.

Bạn muốn ẩn một số văn bản bên trong ~/.vimrc(ví dụ).

Đầu tiên chúng ta cần biết nhóm đánh dấu nào xử lý văn bản bạn muốn ẩn. Thêm ánh xạ này vào ~/.vimrc:

map <F10> :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<'
\ . synIDattr(synID(line("."),col("."),0),"name") . "> lo<"
\ . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">"<CR>

Tôi đã lấy nó từ đây .

Tiếp theo đặt con trỏ của bạn vào một số văn bản bạn muốn ẩn, ví dụ như một nhận xét. Rồi đánh F10.
Tên của nhóm đánh dấu sẽ xuất hiện trên dòng lệnh.
Trên hệ thống của tôi, đầu ra là:

hi<vimLineComment> trans<vimLineComment> lo<Comment>

Tôi nghĩ rằng nó có nghĩa là nhóm nổi bật cho các bình luận vim vimLineCommentvà nó được liên kết với Comment. Vì vậy, chúng tôi muốn ẩn văn bản được xử lý bởi nhóm đánh dấu vimLineComment(hoặc Comment).

Để đạt được điều này, chúng ta có thể sử dụng tính năng che giấu được thêm vào trong vim 7.3 ( :help conceal).

:syntax match vimLineComment "^\".*" conceal containedin=ALL cchar=>

Dòng này cho vim tìm kiếm văn bản có nhóm tô sáng vimLineCommentvà khớp với biểu thức chính quy ^\".*(bắt đầu một dòng ( ^) theo sau là một trích dẫn kép ( \") theo sau bởi bất kỳ văn bản nào ( .*)) và để ẩn và thay thế nó ở mọi nơi mà nó tìm thấy ( containedin=ALL) với nhân vật >( cchar=>).
Các concealthuộc tính cú pháp sẽ ẩn văn bản chúng ta muốn, trừ khi con trỏ trên nó.

Tiếp theo, chúng tôi nói với vim để ẩn hoàn toàn văn bản trừ khi nó có một ký tự thay thế tùy chỉnh được xác định:

:set conceallevel=2

Có 4 giá trị có thể cho tùy chọn này với 4 hiệu ứng khác nhau (xem :help conceallevel).

Vì chúng tôi không muốn nhập các lệnh đó mỗi lần, chúng tôi sẽ thêm tự động vào ~/.vimrc:

augroup hide_text
    autocmd!
    autocmd FileType vim :set conceallevel=2 | :syntax match vimLineComment "^\".*" conceal containedin=ALL cchar=>
augroup END

Cuối cùng, chúng tôi thêm ánh xạ để chuyển đổi giá trị của concealleveltùy chọn (giữa 2 và 0; 2 = ẩn, 0 = hiển thị):

nnoremap <leader>h :<c-u>if (&conceallevel==2) \| set conceallevel=0 \| else \| set conceallevel=2 \| endif<cr>

Kết quả là văn bản sẽ được hiển thị / ẩn khi chúng ta nhấn <leader>h.

Bạn cũng có thể thay đổi màu của ký tự thay thế:

highlight Conceal ctermfg=<code color> guifg=#<code color>

Và bạn có thể chọn chế độ bình luận sẽ được hiển thị. Ví dụ: nếu bạn muốn nó chỉ được hiển thị khi bạn ở trên dòng của nó ở chế độ chèn:

setlocal concealcursor=ncv

Tuy nhiên, tôi không biết làm thế nào để thu gọn tất cả các dòng ẩn như tính năng gấp này, xin lỗi.


Chỉnh sửa : một giải pháp có thể khác.

Bạn giữ các cài đặt gấp của mình để thu gọn các dòng bạn không muốn xem và bạn ẩn các tiêu đề của các nếp gấp để chúng không làm bạn mất tập trung.

function! FoldingTitle()
    if (v:foldlevel>1)
        let line = repeat(' ', &sw * (v:foldlevel-1)).'>'
    else
        let line = '|'
    endif
    return line
endfunction

set foldtext=FoldingTitle()
set fillchars+=fold:\ 
set foldcolumn=3 " optional

highlight FoldColumn ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color> "optional
highlight Folded ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color> "optional

Trong mã này, chúng tôi tùy chỉnh tiêu đề của các nếp gấp bằng cách đưa giá trị FoldingTitle()cho foldtexttùy chọn. Nó có nghĩa là chúng ta có thể thay đổi cách một nếp gấp sẽ nhìn qua chức năng này. FoldingTitle()chỉ trả về một biểu tượng để bạn biết có một nếp gấp ( >trước một số khoảng trắng lặp lại hoặc |tùy thuộc vào nếp gấp).

Sau đó, chúng tôi xác định ký tự khoảng trắng là ký tự được sử dụng để điền vào khoảng trống trên các dòng:

set fillchars+=fold:\ 

Đừng quên khoảng trống sau dấu gạch chéo ngược.

Cuối cùng, chúng tôi xác định một cột (có chiều rộng là 3) sẽ được hiển thị ở bên cạnh cửa sổ và sẽ chỉ ra các nếp gấp mở và đóng. Chúng tôi cũng tùy chỉnh màu của các nếp gấp cũng như màu của các tiêu đề của các nếp gấp. Mỗi trong số 3 dòng này là tùy chọn.

set foldcolumn=3 " optional
highlight FoldColumn ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color>
highlight Folded ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color>

1
Điều này thực sự tuyệt vời, tôi không biết về tính năng che giấu. Với giải pháp của bạn, các dòng vẫn còn trong đó, nhưng hoàn toàn trống rỗng hoặc chỉ có một ký tự - vì vậy tôi có cách ít phân tâm hơn khi nhìn vào mã của mình. Tôi vẫn hy vọng có một cách để không hiển thị các dòng cụ thể, nhưng giải pháp này cũng tốt (cách tốt hơn so với gấp cho tôi).
cbaumhardt

Wow, che giấu thực sự tuyệt vời, bạn thậm chí có thể chỉ che giấu các phần của một dòng (gấp dọc): vim.wikia.com/wiki/Patch_to_conceal_parts_of_lines
cbaumhardt

@cbaumhardt Tôi đã chỉnh sửa câu trả lời của mình để đưa vào một đề xuất khác, có thể khiến bạn quan tâm.
saginaw

Đề xuất trong chỉnh sửa của bạn không thực sự là một lựa chọn, vì tôi muốn vẫn có thể sử dụng cách gấp thông thường của mình. Nhưng khi tôi làm như vậy, các Foldedphần tử cho các nếp gấp thông thường của tôi cần màu sắc, vì vậy tùy chọn duy nhất là chỉ điền vào các nếp gấp cho các dòng tôi muốn ẩn bằng khoảng trắng. Tuy nhiên, tôi vẫn sẽ thấy phần gạch chân cũng như nền khác nhau cho các Foldedđối tượng - và tôi không thể thay đổi điều đó, vì tôi cần chúng để các nếp gấp bình thường của tôi hoạt động.
cbaumhardt

-1

Bất kỳ giải pháp nào cũng có thể sử dụng một thanh gấp tối giản mà tôi đã sử dụng vì tôi không tìm thấy cùng một giải pháp, bên dưới tôi đặt một danh sách các lệnh để tạo một thanh gấp tối giản mà bạn có thể sử dụng cho các nhận xét ẩn, trong mỗi lệnh tôi viết gì :

đặt Foldtext = '+' "để xuất hiện dấu + trong tham chiếu văn bản cho nếp gấp

hi Folded ctermbg = KHÔNG "thay đổi thanh gấp màu không có gì

: đặt fillchars = vert: \ |, Fold: \ "(đặt dấu cách) không đặt ----- trong thanh gấp

sử dụng tùy chọn cho các bình luận biến mất

:Chào! liên kết Bình luận Bỏ qua

sử dụng trở lại

:Chào! liên kết Bình luận Bình luận


Tôi xin lỗi nhưng tôi không thể hiểu bài viết của bạn. Tôi đề nghị viết nhiều câu tròn hơn trong đó.
peterh - Phục hồi Monica
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.