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.
vimscript
delimiter-matching
200_sukses
sumber
sumber
Jawaban:
Jika saya memahami pertanyaan Anda dengan benar, kuncinya adalah untuk menentukan apakah karakter pada kursor adalah pembatas yang cocok.
Pertimbangkan perintah mode normal
v%"zy
danv%%"zy
.@z
. Yang kedua akan menyentak untaian panjang tepat 1 — lagi, pembatas itu sendiri — ke@z
.@z
. Menggugurkan.@z
. Menggugurkan.@z
. Menggugurkan.Dengan demikian, kami memiliki hasil sebagai berikut:
Petunjuk untuk VIML:
:norm ...
danstrlen(@z)
akan membantu di sini.sumber
(|)
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 |)
.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