Bundling urutan perintah bersama untuk repeat (.)

10

Mempertimbangkan:

apple
pear

Letakkan kursor Anda di baris dan jenis pertama Yp, menghasilkan:

apple
apple
pear

Letakkan kursor Anda di pearbaris dan ketik .untuk mengulangi perintah terakhir. Ini hanya mengulangi p(bukan kombinasi Yp), menghasilkan:

apple
apple
pear
apple

Saya ingin cara memberitahu .untuk mengulangi perintah N terakhir. Sesuatu seperti 2.mengulangi kombinasi Ypuntuk menghasilkan:

apple
apple
pear
pear

Ofc itu tidak akan berhasil - ini mengulangi pdua kali. Tapi idenya adalah "ulangi urutan 2 perintah terakhir".

Saya tahu saya bisa q-mengatur urutan perintah dan mengulanginya dengan @@, tetapi solusi ini tidak ideal, karena mengharuskan Anda untuk telah merencanakan sebelumnya, sedangkan dalam praktiknya Anda sering tidak menyadari Anda perlu mengulangi sesuatu sampai setelah kamu sudah melakukannya.

Apakah ada cara untuk mencapai apa yang saya inginkan?

Hadiah hiburan: Jika hal di atas tidak memungkinkan, apakah ada cara untuk mengulang pemutaran makro terakhir? Misalnya, jika saya mengetik @@untuk memutar makro terakhir saya, saya ingin berikutnya .setara dengan mengetik @@lagi - yang tidak (misalnya, jika hasil @@tergantung pada baris Anda berada di)

Jonah
sumber
Saya tidak tahu solusi untuk bagian pertama dari masalah Anda, tetapi untuk bagian kedua, Anda dapat mencoba pemetaan ini: nno <silent> @@ @@:sil! call repeat#set('@@', v:count1)<CR>Tetapi agar bisa berfungsi, Anda perlu menginstal plugin ini: github.com/tpope/vim-repeat
user9433424

Jawaban:

4

Vim hanya menyimpan perintah yang terakhir dieksekusi, dan hanya itu yang diulangi oleh .; menurut saya, hal lain akan sulit ditangani.

Jika Anda merasa perlu mengulangi Ypkombo sebagai satu kesatuan, Anda harus menjadikannya satu perintah tunggal. Plugin repeat.vim Tim Pope memungkinkan untuk melakukannya dengan mudah untuk pemetaan khusus. Tentu saja, jika Anda memilih kunci pendek [urutan] untuk pemetaan, Anda dapat dengan cepat mengetik ulang itu (bukan .), dan bahkan menghindari integrasi repeat.vim.

BTW, plugin LineJuggler saya menyediakan ]dpemetaan untuk menduplikasi baris saat ini, dan itu mendukung pengulangan melalui repeat.vim.

Ingo Karkat
sumber
2

Di Yp, satu-satunya "perubahan" yang harus diulang adalah p. Satu-satunya cara yang saya tahu untuk mengubah perilaku .dalam mode normal adalah dengan menambahkan yke cpoptionsopsi:

set cpoptions+=y

yang memungkinkan Anda mengulangi sentakan terakhir serta perubahan terakhir.

Tapi itu tidak mengubah apa pun untuk masalah Anda karena Ypmasih ada dua perintah: yank diikuti oleh perubahan.

Saya tidak berpikir Anda bisa mendapatkan apa yang Anda inginkan tanpa skrip non-sepele. Apakah Anda melihat bagian skrip vim.org ?

romainl
sumber
1

Saya sering menggunakan mapuntuk mencapai efek ini. Sebagai contoh:

map <F12> Yp

Kemudian menekan F12berulang kali akan mengeksekusi YpYpYpdll. Jika Anda ingin pindah ke baris berikutnya setelah setiap rekat, petakan kunci untuk Yp+sebaliknya.

pengguna112358
sumber
1

Alat luar biasa yang merupakan plugin RepeatLast (oleh @joeytwiddle milik kami sendiri ) menyediakan fungsionalitas ini saja, melalui metode tidak suci dalam merekam semua yang Anda lakukan sebagai makro.

Ini menyediakan sejumlah pemetaan baru, tapi, jika saya membaca dokumentasi dengan benar, untuk melakukan pengeditan Anda menggambarkan Anda bisa menggunakan urutan perintah (menganggap Anda menggunakan default <leader>dari \):

  • YpTarik dan tempel / tempelkan baris apple,
  • jTurunkan satu baris sehingga kursor sekarang berada di peargaris,
  • \Dlupakan jperintah,
  • 2\.Ulangi kedua perintah Ydanp
Kaya
sumber
Sungguh tidak suci! Tapi saya menghargai ambisinya.
Jonah