Secara otomatis menghapus pasangan penutupan tanpa menyebabkan pasangan tidak seimbang

8

Saya menulis fungsi VimL itu, dalam mode insert, memungkinkan <BS>melalui bagian pembukaan sepasang ( [, {, dll) untuk menghapus bagian penutupan pasangan jika karakter berikutnya setelah kursor (seperti auto-pasangan dan vim-autoclose ). Fungsi ini akan berbeda karena bagian penutup dari pasangan tidak akan dihapus jika ada pasangan yang tidak seimbang.

Contoh:

Formatnya adalah <initial> => <result-after-backspace>tempat kursor saya berada di depan |.

((|)    =>   (|)

((|))   =>   (|)

(|)     =>   |

(defn   =>   (defn
  (|)          |)

Bagaimana saya bisa menentukan apakah pasangan tidak seimbang atau tidak sebelum saya melanjutkan dan menghapus pasangan penutup?

Saya telah menguji pasangan-otomatis dan vim-autoclose . Dengan kedua plugin, bagian penutup dari pasangan selalu dihapus.

200_sukses
sumber
Bisakah Anda mengklarifikasi kata pengantar Anda? Apakah Anda ingin menghindari semua plugin, atau yang serupa dengan yang Anda sebutkan? Jika yang terakhir, bagaimana dengan mereka berdua yang tidak Anda sukai?
Tom
Saya tidak ingin menggunakan plugin apa pun untuk ini. Saya telah memperbarui kata pengantar.
1
Saya memilih untuk menutup pertanyaan ini. Saya pikir topik dasar seperti itu baik-baik saja, tetapi pembatasan Anda membuatnya menjadi "tolong tuliskan beberapa kode untuk saya plz kthxbye" -pertanyaan sekarang. Saya tidak berpikir kami ingin mengizinkan pertanyaan semacam ini di sini ...
Martin Tournoij
1
@Carpetsmoker Selain kata-kata dari pertanyaan ini adalah masalah yang belum diselesaikan di plugin apa pun yang telah saya lihat. Tampak jelas bagi saya bahwa setelah pertanyaan ini dijawab dengan sukses, setiap plugin jenis penutupan otomatis atau pasangan otomatis dapat memperoleh manfaat dari solusinya. Bagaimana Anda menyarankan saya mengubah kata-kata agar diterima?
2
@merb, plugin paredit melakukan apa yang Anda inginkan. Jika Anda ingin fungsi itu tanpa benar-benar menggunakan plugin maka saya sarankan Anda memeriksa sumber di github. Saya pikir itu akan lebih instruktif daripada saya mencoba mereproduksi versi di sini. github.com/kovisoft/paredit
Quincy Bowers

Jawaban:

1

Jika saya memahami pertanyaan Anda dengan benar, kuncinya adalah untuk menentukan apakah karakter pada kursor adalah pembatas yang cocok.

Pertimbangkan perintah mode normal v%"zydan v%%"zy.

  • Jika kursor berada pada pembatas yang cocok, maka perintah pertama akan menarik string dengan panjang minimal 2 — pembatas, pasangannya, dan teks apa pun di tengah-ke @z. Yang kedua akan menyentak untaian panjang tepat 1 — lagi, pembatas itu sendiri — ke @z.
  • Jika kursor berada pada pembatas yang tak tertandingi, maka perintah pertama akan menarik string panjang 1 - pembatas itu sendiri ke @z. Menggugurkan.
  • Jika kursor tidak berada pada pembatas dan ada pembatas di baris, maka perintah kedua akan menarik string dengan panjang lebih dari 1 menjadi @z. Menggugurkan.
  • Jika kursor tidak berada pada pembatas dan tidak ada pembatas lain di baris, maka perintah pertama akan menarik string dengan panjang tepat 1 — karakter itu sendiri — ke @z. Menggugurkan.

Dengan demikian, kami memiliki hasil sebagai berikut:

Kursor berada pada pembatas yang cocok jika dan hanya jika perintah mode normal v%"zymenarik string dengan panjang setidaknya 2 ke dalam @zdan perintah mode normal v%%"zymenarik string dengan panjang tepat 1 ke dalam @z.

Petunjuk untuk VIML: :norm ...dan strlen(@z)akan membantu di sini.

wchargin
sumber
Apakah ini menjawab pertanyaan Anda, atau saya kehilangan sesuatu?
wchargin
Menentukan apakah karakter pada kursor cocok atau tidak bukan kuncinya. Kuncinya adalah menentukan apakah bentuk yang diberikan seimbang atau tidak. Jika formulir seimbang dan kami berada di posisi ini:, (|)menekan <BS>harus menghapus keduanya. Namun, jika formulir tingkat atas tidak seimbang, seperti ini (defn (|):, menekan <BS>hanya akan menghapus apa yang biasanya dihapus - dalam hal ini meninggalkan kita (defn |).
1

Ok jadi saya akhirnya melalui paredit.vim dan mengeluarkan beberapa fungsi untuk membuat ini: vim-pear . Ini menyisipkan dan menghapus pembatas berpasangan sambil mempertahankan keadaan seimbang.


sumber
Keren :-) Bagaimana cara menggunakannya? Bisakah saya menginstalnya dan akan diaktifkan secara default? Apakah mungkin untuk mengaktifkan / menonaktifkan ini hanya untuk tipe file tertentu?
Martin Tournoij
Diaktifkan untuk semuanya secara default. Kirim PR jika Anda menginginkan hal seperti itu. Saya mungkin melakukannya sendiri di beberapa titik.
Tautan ini (saat ini) rusak.
Kaya