Backspace dalam singkatan insert

8

Agar berfungsi, singkatan perlu dipisahkan dengan spasi putih. Misalnya, jika saya memiliki iab fo FOOBARmengetik whatfomaka tidak akan memicu singkatan. Ada beberapa alasan masuk akal yang jelas untuk ini.

Namun, saya ingin singkatan yang dapat digunakan sebagai sufiks tanpa saya harus memicu iab kemudian kembali dan menghapus spasi. Apakah ini mungkin? Misalnya iab fo <backspace>FOOBAR,.

goldilocks
sumber
Apakah kode berikut menghasilkan apa yang Anda inginkan? vpaste.net/IfU1j
saginaw
@saginaw Ya, brilian - posting itu sebagai jawaban dan itu milikmu.
goldilocks

Jawaban:

8

Anda bisa menulis di dalam vimrc Anda: iab fo <BS>FOOBAR

<BS> adalah notasi yang digunakan untuk kunci backspace.

Untuk informasi lebih lanjut tentang nama kunci khusus, lihat:

:help key-notation
saginaw
sumber
1
"Cara yang lebih sederhana" tidak berhasil dalam kasus ini karena saya memikirkan ketahanan; akhiran sebenarnya [7:0]dan Anda harus bermain-main dengan jumlah bs, dll untuk menyesuaikan untuk itu, saya pikir.
goldilocks
@delicateLatticeworkFever Anda benar, saya tidak memikirkan hal itu. Dalam kasus khusus ini, mungkin mengganti bdan edengan Bdan Eakan cukup. Tapi mungkin ada kasus lain di mana itu akan gagal, saya tidak tahu. Bagaimanapun versi pertama harus, semoga, berfungsi sebagian besar waktu.
Saginaw
@delicateLatticeworkFever Membaca ulang jawaban saya, saya menyadari bahwa itu terlalu rumit. Mungkin sesuatu seperti iab fo <BS>foobaritu sudah cukup. Maaf atas ketidaknyamanan ini, Anda mungkin harus mencentang jawaban @jjcast sebagai jawaban yang benar. Saat ini saya tidak dapat menghapus jawaban saya, tetapi sekali saya bisa saya akan melakukannya. Sekali lagi maaf, saya tidak terbiasa dengan singkatan.
Saginaw
Hei <BS>itu masalahnya. Saya bersumpah mencoba sesuatu seperti itu, tetapi saya tidak tahu semua karakter kontrol, jadi saya mungkin menggunakan <backspace>atau sesuatu.
goldilocks
1
@delicateLatticeworkFever Saya mengerti, tidak ada masalah. Jika Anda ingin melihat semua nama kunci khusus, Anda dapat membacanya di sini::help key-notation
saginaw
4

Cukup tekan dalam mode sisipkan Ctrl]. Ini akan memicu singkatan untuk diperluas, tanpa memasuki ruang

Christian Brabandt
sumber
Anda salah membaca pertanyaan. Saya ingin hasil akhirnya seperti: X(FOOBAR)tidak X( FOOBAR. Menggunakan Ctrl-] hanya menghilangkan ruang di bagian akhir . Saya harus bisa menggunakan singkatan - yang juga tergantung pada spasi putih di awal untuk memecat - tetapi harus disatukan dengan kata sebelumnya (itulah arti " akhiran ").
goldilocks
Oh, Anda ingin pengaya potongan ...
Christian Brabandt
Saya kira ini bisa dilakukan dengan sesuatu yang didefinisikan ${1}FOOBAR- itu jawaban yang bagus. Jika Anda ingin mengubah ini: / atau tambahkan jawaban lain saya akan mencentangnya.
goldilocks
karena saya pribadi tidak tahu plugins snippet, saya tidak bisa dengan serius menjawabnya.
Christian Brabandt
4

Sebagai alternatif, berikut ini cara untuk mendefinisikan dan memperluas singkatan yang berkembang di mana saja:

let s:anywhere_abbreviations = {
    \ 'fo': 'FOOBAR',
    \ 'ab': 'ABBREVIATION',
\ }

function! s:MaybeExpandAbbreviation(trigger)
    for key in keys(s:anywhere_abbreviations)
        if matchstr(getline('.'), repeat('.', strchars(key)) . '\%' . col('.') . 'c') ==# key
            return repeat("\<BS>", strchars(key)) . s:anywhere_abbreviations[key] . a:trigger
        endif
    endfor
    return "\<C-]>" . a:trigger
endfunction

inoremap <expr> <Space> <SID>MaybeExpandAbbreviation("\<Space>")

Cukup tambahkan singkatan yang harus diperluas ke s:anywhere_abbreviationskamus mana saja . The s:MaybeExpandAbbreviation()pencarian fungsi untuk dan mengembang pertandingan singkatan ketika tombol pemicu ditekan - <Space>dipetakan untuk memicu perluasan "singkatan di mana saja".

Dengan s:anywhere_abbreviationskamus di atas , mengetik whatfo<Space>akan diperluas ke whatFOOBAR.

djjcast
sumber
2

Untuk meringkas dua jawaban paling sederhana yang keluar dari ini:

  1. Anda dapat menggunakan backspace secara langsung dalam singkatan - berbagai karakter khusus didokumentasikan di bawah :help keycodes. Jadi, mis:

    :iab cdt <BS>cedental
    

    Akan memungkinkan Anda mengetik trans cdtdan mendapatkan transcendental.

  2. Satu saya sangat malu sejak saya telah menggunakannya selama bertahun-tahun: Plugin snipMate umum memungkinkan untuk parameter di depan, jadi

     snippet cdt
         ${1}cendental ${2}
    

    Mengizinkan untuk mengetik cdt, yang Tabakan diperluas ke cendentaldan meletakkan kursor di depan sehingga Anda dapat mengetik trans, lalu tekan Tablagi untuk pindah ke awal kata berikutnya.

goldilocks
sumber