Sembunyikan garis-garis tertentu sepenuhnya (tidak dilipat)

9

Saya ingin dapat menyembunyikan garis-garis tertentu di buffer saya agar tidak muncul sama sekali (dan dapat beralih melihat mereka). Saya menemukan pertanyaan serupa , tetapi mereka tidak menyelesaikan masalah saya. Saya tidak ingin menggunakan lipatan untuk ini.

Apa yang sebenarnya saya inginkan?

Ketika saya membuka dokumen, saya ingin Vim tidak membaca dalam baris komentar. Seharusnya berperilaku seolah-olah garis-garis ini tidak ada sama sekali dalam dokumen, dengan hanya satu pengecualian: Saya memerlukan indikator visual (misalnya di kolom tambahan di samping) yang memberitahu saya di sini adalah komentar yang tidak ditampilkan.

Setelah menekan kombinasi tombol tertentu, saya ingin semua komentar muncul (yaitu perilaku Vim normal).

Saya ingin dapat memodifikasi dokumen dengan komentar yang tidak ditampilkan. Setelah menyimpan, seluruh dokumen disimpan dengan komentar (mereka selalu disimpan 1 baris di atas teks yang berada di bawahnya di awal).

Mengapa saya menginginkan ini?

Ini mengurangi kurang dan terlihat lebih menyenangkan secara visual. Ambil .vimrccontoh - Anda dapat memiliki semua pengaturan dengan baik di bawah satu sama lain. Jika Anda ingin mengubah sesuatu, atau tidak yakin mengapa Anda mengaturnya dengan cara ini, matikan saja komentar Anda.

cbaumhardt
sumber
Semoga Anda tidak keberatan dengan pertanyaan saya ... Mengapa Anda secara khusus tidak termasuk lipatan?
Roflo
1
Tentu saja saya tidak :) Saya mengecualikan lipatan-lipatan karena saya tahu bagaimana menciutkan komentar dengan lipatan - tetapi komentar yang terlipat masih mengganggu, menghambat aliran bacaan dan tidak benar-benar menarik secara visual.
cbaumhardt
Saya ingin banyak hal juga, tetapi saya tahu biasanya lebih baik tetap / beradaptasi dengan yang saya butuhkan;)
VanLaser
@cbaumhardt Anda dapat melipatnya dan menggunakan pengaturan / fungsi 'foldtext' khusus untuk menyembunyikan semuanya
Christian Brabandt

Jawaban:

8

Saya tidak tahu bagaimana mencapai apa yang Anda inginkan, hanya sebagian.

Anda ingin menyembunyikan beberapa teks di dalamnya ~/.vimrc(misalnya).

Pertama, kita perlu tahu grup sorotan mana yang menangani teks yang ingin Anda sembunyikan. Tambahkan pemetaan ini ke ~/.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>

Saya sudah mengambilnya dari sini .

Selanjutnya letakkan kursor Anda pada beberapa teks yang ingin Anda sembunyikan, misalnya komentar. Lalu pukul F10.
Nama grup sorotan akan muncul di baris perintah.
Pada sistem saya, hasilnya adalah:

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

Saya pikir itu berarti bahwa grup sorotan untuk komentar vim adalah vimLineCommentdan bahwa itu terhubung dengan Comment. Jadi kami ingin menyembunyikan teks yang ditangani oleh grup sorotan vimLineComment(atau Comment).

Untuk mencapai ini, kita bisa menggunakan fitur penyembunyian yang ditambahkan dalam vim 7.3 ( :help conceal).

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

Baris ini memberitahu vim untuk mencari teks yang grup sorotnya vimLineCommentdan yang cocok dengan regex ^\".*(awal baris ( ^) diikuti oleh tanda kutip ganda ( \") diikuti oleh teks apa pun ( .*)), dan untuk menyembunyikan dan menggantinya di mana saja ia ditemukan ( containedin=ALL) dengan karakter >( cchar=>).
The concealAtribut sintaks akan menyembunyikan teks yang kita inginkan, kecuali kursor berada di atasnya.

Selanjutnya, kami memberi tahu vim untuk menyembunyikan teks sepenuhnya kecuali ia memiliki karakter pengganti khusus yang ditentukan:

:set conceallevel=2

Ada 4 nilai yang mungkin untuk opsi ini dengan 4 efek berbeda (lihat :help conceallevel).

Karena kami tidak ingin mengetikkan perintah itu setiap kali, kami menambahkan perintah otomatis di ~/.vimrc:

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

Akhirnya, kami menambahkan pemetaan untuk mengganti nilai conceallevelopsi (antara 2 dan 0; 2 = disembunyikan, 0 = ditampilkan):

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

Hasilnya adalah bahwa teks harus ditampilkan / disembunyikan ketika kita menekan <leader>h.

Anda juga dapat mengubah warna karakter pengganti:

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

Dan Anda dapat memilih dalam mode mana komentar akan ditampilkan. Misalnya, jika Anda ingin itu hanya ditampilkan ketika Anda berada pada jalurnya dalam mode insert:

setlocal concealcursor=ncv

Namun saya tidak tahu bagaimana cara menutup semua garis tersembunyi seperti yang dilakukan fitur lipat, maaf.


Edit : solusi lain yang mungkin.

Anda menyimpan pengaturan lipatan untuk menutup garis yang tidak ingin Anda lihat, dan Anda menyembunyikan judul lipatan, sehingga tidak mengalihkan perhatian Anda.

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

Dalam kode ini kami menyesuaikan judul lipatan dengan memberikan nilai FoldingTitle()pada foldtextopsi. Itu berarti bahwa kita dapat mengubah bagaimana lipatan akan melihat melalui fungsi ini. FoldingTitle()cukup kembalikan simbol sehingga Anda tahu ada lipatan ( >didahului oleh beberapa spasi berulang, atau |tergantung pada lipat tingkat).

Kemudian kita mendefinisikan karakter spasi sebagai karakter yang digunakan untuk mengisi ruang kosong di baris:

set fillchars+=fold:\ 

Jangan lupa spasi setelah backslash.

Akhirnya kita mendefinisikan kolom (yang lebarnya 3) yang akan ditampilkan di sisi jendela dan yang akan menunjukkan lipatan terbuka dan tertutup. Kami juga menyesuaikan warna kolom lipat serta warna judul lipatan. Masing-masing dari 3 baris ini adalah opsional.

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>
saginaw
sumber
1
Ini benar-benar hebat, saya tidak tahu tentang fitur penyembunyian. Dengan solusi Anda, baris-barisnya masih ada di sana, tetapi benar-benar kosong atau hanya memiliki satu karakter - jadi saya memiliki sedikit gangguan ketika melihat kode saya. Saya masih berharap ada cara untuk tidak menunjukkan garis tertentu sama sekali, tetapi solusi ini juga bagus (jauh lebih baik daripada melipat untuk saya).
cbaumhardt
Wow, menyembunyikan benar-benar hebat, Anda bahkan dapat menyembunyikan hanya bagian dari garis (lipatan vertikal): vim.wikia.com/wiki/Patch_to_conceal_parts_of_lines
cbaumhardt
@ cbaumhardt Saya sudah mengedit jawaban saya untuk memasukkan proposisi lain, yang mungkin bisa menarik minat Anda.
Saginaw
Proposal dalam hasil edit Anda sebenarnya bukan pilihan, karena saya ingin tetap menggunakan lipatan normal saya. Tapi ketika saya melakukannya, Foldedelemen untuk lipatan normal saya perlu warna, jadi satu-satunya pilihan adalah mengisi teks lipat untuk garis yang ingin saya sembunyikan dengan spasi. Namun, saya masih akan melihat bagian yang digarisbawahi serta latar belakang yang berbeda untuk Foldedobjek - dan saya tidak dapat mengubahnya, karena saya membutuhkannya agar lipatan normal saya berfungsi.
cbaumhardt
-1

solusi yang mungkin adalah menggunakan bilah lipat minimalis yang saya gunakan karena saya tidak menemukan solusi yang sama, di bawah ini saya meletakkan daftar perintah untuk membuat bilah lipat minimalis yang dapat Anda gunakan untuk komentar tersembunyi, di setiap perintah saya menulis apa yang melakukannya :

atur foldtext = '+' "untuk menampilkan referensi teks + dalam untuk lipatan

hai Dilipat ctermbg = NONE "ubah bilah lipatan warna tanpa hasil

: set fillchars = vert: \ |, lipat: \ "(beri spasi) tidak ada tempat ----- di bilah lipat

penggunaan opsional untuk komentar yang hilang

:Hai! tautan Komentar Abaikan

gunakan kembali

:Hai! tautan Komentar Komentar

ramses_ATK
sumber
Maaf, saya tidak dapat memahami pos Anda. Saya menyarankan untuk menulis lebih banyak kalimat di dalamnya.
peterh