Mungkinkah membuat hotkey yang diawali secara numerik menjalankan fungsi yang berkali-kali?

7

Saya menemukan bahwa jika Anda memasukkan awalan numerik sebelum mengeksekusi perintah ex, konvensi yang berlaku adalah mengatur perintah untuk menyiapkan operasi melintasi rentang garis. Itu dijelaskan dalam dokumentasi,

JUMLAH GARIS

Ketika Anda tahu berapa banyak baris yang ingin Anda ubah, Anda bisa mengetikkan angka dan kemudian ":". Misalnya, saat Anda mengetik "5:", Anda akan mendapatkan:

    :.,.+4

Sekarang Anda bisa mengetik perintah yang ingin Anda gunakan. Ini akan menggunakan rentang "." (baris saat ini) hingga ". + 4" (empat baris ke bawah). Jadi itu mencakup lima baris.

Sekarang yang saya hadapi adalah fungsi khusus saya, yang ini:

function! MyAmazingEnhancedDot()
    if v:hlsearch == 1
        :normal! .n
    else
        :normal! .j
    endif
endfun

Ini hanya cara untuk merampingkan tugas berulang yang mencakup pengulangan operasi pada berbagai baris atau lebih dari serangkaian kecocokan pencarian.

Fungsi ini terikat ke hotkey. Seperti Alt+ .atau apa pun.

Tujuan saya adalah untuk dapat melakukan sesuatu yang sangat kuat: Saya harus bisa mengetik /varName<CR>ciwnew-var<ESC>n9<Alt+.>untuk mencapai penggantian 10 contoh varNamemenjadi new-var.

Apa yang sebenarnya terjadi jika saya melakukan ini adalah ia tidak melakukan penggantian nama dan 9 baris dimanipulasi dengan .operasi edit saya yang disimpan dari kolom 0.

Saya hanya bisa berasumsi bahwa Vim adalah menafsirkan penekanan tombol saya demikian: :.,.+8 normal! .n.

Di sisi setengah kaca, :normal! .jkasus ikatan sebenarnya bekerja, karena jgerakan yang tidak memiliki efek tidak ada konsekuensi dalam situasi ini. (Saya masih membutuhkannya juntuk membuatnya berfungsi dalam kasus penggunaan interaktif non-numerik-awalan).

Jadi pertanyaan saya adalah bagaimana saya bisa mengesampingkan perilaku perluasan garis yang diterapkan Vim pada ikatan saya? Apa yang akan fantastis adalah jika saya bisa membaca awalan angka sebagai argumen atau sesuatu seperti itu.

Steven Lu
sumber

Jawaban:

6

Secara default vim memperlakukan semua fungsi seolah-olah mereka adalah perintah-perintah ex default, yaitu setiap angka awalan digunakan sebagai {range}. Untuk mengubah ini, Anda perlu memodifikasi fungsi dan peta Anda untuk menggunakan hitungan.

Peta dengan jumlah

Peta dapat dihitung dan tersedia melalui v:countdan v:count1. Yang pertama berisi 0 jika tidak ada hitungan yang disediakan dan yang terakhir berisi 1 sebagai default. Anda dapat membuat peta untuk fungsi Anda:

nnoremap <M-.> :<C-u>call MyAmazingEnhancedDot(v:count1)<cr>

Untuk info lebih lanjut :h v:count

Perintah dengan hitungan

Perintah dapat memiliki opsi salah satu {range}atau countsebagai awalan. Saat membuat perintah, flag -countmenonaktifkan opsi rentang dan default <count>variabel ke 0. Secara opsional nilai default dapat diberikan -count=N. Nilai awalan kemudian tersedia melalui variabel countdi fungsi Anda.

Perintah yang menggunakan hitungan akan terlihat seperti ini:

:command -count=1 EDot call MyAmazingEnhancedDot(<count>)

Sekarang ketika Anda memanggil 9EDotfungsi Anda dipanggil dengan hitungan 9bukan rentang.

Untuk info lebih lanjut, lihat :h command-count

Keduanya contoh

Ini kodenya:

function MyAmazingEnhancedDot(count)
  let c = a:count
  while c > 0
    if v:hlsearch == 1
      :normal! .n
    else
      :normal! .j
    endif
    let c -= 1
  endwhile
endfunction

command -count=1 EDot call MyAmazingEnhancedDot(<count>)

nnoremap <M-.> :<C-u>exe v:count1 . "EDot"<CR>

Sekarang Anda dapat melakukan contoh Anda

/varName<CR>ciwvar-name<esc>n9<M-.>
jecxjo
sumber
1
Keren. Sekarang sepertinya ada terlalu banyak cara untuk menyelesaikan masalah saya! Saya mengerti bahwa Anda menggabungkan kedua mekanisme dalam contoh yang Anda berikan untuk mengilustrasikan cara menggunakannya. Tapi saya ingin tahu apakah itu tidak cukup untuk hanya menggunakan nnoremap <M-.> :<C-u>call MyAmazingEnhancedDot(v:count1)<cr>dan melewatkan command -count=1 EDot call MyAmazingEnhancedDot(<count>)?
Steven Lu
Melewati opsi perintah baik-baik saja. Satu-satunya manfaat yang Anda dapatkan dari opsi perintah adalah dapat memanggilnya dari perintah ex seperti :9EDot. Jika Anda tidak menggunakan banyak perintah ex maka lewati saja.
jecxjo
Luar biasa. Sekarang jawaban sempurna Anda selesai!
Steven Lu