Apakah ada cara untuk menyembunyikan garis?

8

Berikut ini adalah kasus penggunaan saya:

Saya punya banyak kode yang karena penegakan gaya kami menulis baris baru setelah dan sebelum masing-masing kurung buka dan tutup (masing-masing).

Contoh:

function func(args) {

    statement 1;
    statement 2;

    if (condition) {

        statement 3; 

    }

}

Meskipun ini bagus dan mudah dibaca, saya menganggap ini sebagai pemborosan ruang yang layak-sumpah serapah, tetapi rekan satu tim saya tidak setuju dengan saya. Pada dasarnya ini adalah bagaimana kami memeriksa kode kami dan hanya itu.

Saya berpikir bahwa mungkin saya dapat menggunakan fitur Vim untuk membantu saya menyimpan layar real-estate, sementara masih memungkinkan saya untuk menulis kode dengan cara verbose. Saya tidak keberatan mengetiknya, saya hanya ingin penggunaan ruang yang lebih efisien. Kupikir mungkin aku bisa membuat Vim secara otomatis menutup jalur kosong yang serampangan.

Saya merasa agak sulit untuk mengatur ini menggunakan aturan sintaksis karena apa pun yang saya tulis tampaknya bertentangan dengan aturan sintaksis yang ada, tetapi apa yang saya putuskan untuk dilakukan sebagai upaya pertama adalah menulis aturan-aturan ini yang tidak akan bertabrakan:

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

Aturan kedua di sini dekat dengan apa yang saya inginkan, yang untuk case braket terbuka adalah sesuatu seperti /\v\{(\n\s*){2,}: cocokkan braket-terbuka dengan angka lebih besar atau sama dengan 2 dari baris baru diikuti hanya dengan spasi kosong.

Apa yang terjadi di dalam vim adalah sebagai berikut:

  1. Jika saya mengetikkan abcdgaris, itu disembunyikan Aseperti yang diharapkan.

  2. Jika saya mengetik efdi satu baris dan ghdi baris berikutnya, KEDUA baris menjadi tersembunyi dengan B.

Saya benar-benar berharap dua garis itu ef\nghakan disembunyikan menjadi satu baris sehingga saya dapat menghemat ruang buffer vertikal dengan cara ini.

Tapi saya melihat sekarang bahwa itu mungkin masalah detail implementasi Vim. Garis runtuh adalah masalah yang harus dipecahkan oleh kode lipat, mungkin hanya di luar jangkauan sejauh yang disembunyikan.

Jadi saya bertanya-tanya apakah masih ada cara untuk melakukan apa yang ingin saya lakukan. Mungkin menggunakan spidol lipat entah bagaimana? Masalahnya adalah bahwa saya hanya perlu melipat spasi kosong.

Steven Lu
sumber
3
Seingat saya Anda tidak bisa melakukan itu, dan bahkan jika Anda bisa, Anda akan meminta banyak masalah dengan melakukannya. Bagaimana kalau menggunakan printer cantik untuk beralih antara gaya Anda dan yang "resmi". Jika Anda menggunakan gitAnda bahkan mungkin dapat menggunakan kait untuk membuat perubahan berlaku secara transparan.
Sato Katsura
2
Tidak mungkin. Anda dapat menyalahgunakan lipatan untuk itu, tetapi Anda kehilangan sintaks yang disorot dalam kasus itu.
Christian Brabandt
1
Anda tidak perlu spidol untuk melipat. :h fold-exprdan:h 'fdm'
Christian Brabandt
1
@ChristianBrabandt Sepertinya ada cukup daya yang tersedia di sini untuk membuat saya menulis sesuatu untuk secara otomatis melipat garis-garis ini (sebagian besar tunggal kosong atau hanya spasi) di sekitar kawat gigi. Tapi saya harus duduk dan benar-benar merenungkannya, sepertinya.
Steven Lu
2
Mungkin Anda dapat melaporkannya di pelacak masalah neovim, sehingga fitur mungkin muncul di sana yang dapat Anda gunakan untuk mengimplementasikan ini.
Farid Nouri Neshat

Jawaban:

2

Dimungkinkan untuk menggunakan lipatan untuk menyembunyikan garis kosong tambahan. Berikut ini cara melakukannya:

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

Akan terlihat seperti ini:

Baris kosong terlipat

Seperti yang Anda lihat tidak ada penyorotan sintaks pada garis terlipat, mungkin masih ada sesuatu yang lebih lumayan daripada banyak baris kosong yang tidak perlu. Anda juga dapat mengaktifkan dan menonaktifkan lipatan dengan zicara pintas jika mereka menghalangi Anda.

Lipatan bukan topik kecil dan Vim memiliki file bantuan terpisah . Opsi terkait juga ditautkan di sana.

Perilaku terperinci kursor dan pencarian dapat dikontrol melalui 'foldopen', yang dikombinasikan dengan 'foldclose'menentukan kapan lipatan akan dibuka dan ditutup secara otomatis untuk Anda.

xaizek
sumber
Terima kasih atas jawaban anda. Ini adalah teknik yang sangat menarik, karena ternyata mungkin untuk memulai dua lipatan pada baris yang sama. Saya akan memberi Anda hadiah jika tidak ada solusi yang lebih baik muncul! Saya mungkin dapat mengimplementasikan apa yang saya inginkan menggunakan ini ( vi.stackexchange.com/questions/5175/… ).
Bart Louwers
1

Pertama, itu gaya penegakan yang menyebalkan dan Anda memiliki simpati. Alih-alih menyembunyikan bagaimana membuat pemetaan atau fungsi (seperti yang ditunjukkan di bawah) untuk menghapus baris yang tidak perlu sebelum mengedit dan menambahkannya ketika Anda sudah selesai? sesuatu di sepanjang garis:

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

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

Ide dasarnya dimulai, hapus baris kosong saat dibaca dan ganti saat menulis, jangan coba-coba tetapi saya merasa ini dapat ditambahkan sebagai autocmd seperti:

au BufReadPost *.cpp call Clean()
au BufWritePost *.cpp call Pollute()
Lonetwin
sumber
Jawaban Anda tidak menjawab pertanyaan jadi saya tidak bisa memberi Anda hadiah. Dalam kasus saya, saya tertarik menyembunyikan metadata tentang header dalam garis besar.
Bart Louwers
@ Alex Tidak apa-apa. Saya tidak menjawab untuk hadiah itu. Pertanyaan itu baru saja menarik perhatian saya ketika saya datang ke vim stackexchange untuk mengajukan pertanyaan sendiri. Saya pikir saya akan menawarkan opsi alternatif sebagai cara untuk menyelesaikan pertanyaan awal.
Lonetwin