Saya sedang dalam proses mempercantik beberapa kode sumber menggunakan vim. {1}
Saya telah membuat beberapa makro vim yang melakukan langkah-langkah individual: menghapus trailing whilespace, menghapus baris kosong setelah {
, menghapus baris kosong sebelumnya {
, hal-hal semacam itu.
Sekarang, saya ingin membuat makro yang mengeksekusi semua makro secara berurutan. Namun, begitu makro rekursif pertama berakhir (karena tidak dapat lagi menemukan kecocokan -> kesalahan pencocokan), makro "pembungkus" saya juga berakhir.
Apakah ada cara untuk membuat makro vim melanjutkan setelah submacro menghasilkan kesalahan?
{1} Saya tahu tentang reformator otomatis. Saya bahkan mungkin menggunakannya pada masalah saya saat ini. Saya hanya menyebutkan pemformatan ulang sumber untuk contoh ini. Jangan memposting jawaban apapun tentang ahli kecantikan sumber ini atau itu. Pertanyaannya bukan tentang memformat ulang kode per se , tetapi tentang makro vim.
Contoh:
- Makro 1 - memangkas spasi tambahan -
qw/\s\+$d$@wq
- Makro 2 - menghapus baris kosong sebelumnya} -
qe/\n\n *}dd@eq
- Makro Wrapper - retabbing, Makro 1, Makro 2 -
qr:retab@w@eq
Ketika saya menjalankan pembungkus - @r
- itu akan retab, kemudian jalankan Macro 1 sampai tidak ada spasi spasi tambahan ditemukan, kemudian hentikan ( tanpa menjalankan Macro 2).
Klarifikasi:
Apa yang saya cari adalah bagaimana memanggil submacro sehingga ketika submacro itu berakhir, makro panggilan berlanjut?
Jika perintah gagal adalah substitusi yang tidak menemukan polanya, misalnya,
ketika
foo
tidak ada di buffer, Anda dapat menambahkane
tanda untuk mengabaikan kesalahan itu, misalnya,Lihat
Anda bisa memberi tahu Vim untuk mengabaikan kesalahan dari beberapa perintah ex dengan mendahului mereka
:silent!
. LihatEdit Mengikuti Penambahan Contoh pada Pertanyaan
Makro 1 dan Makro 2 keduanya rekursif dan tidak memiliki mekanisme eksplisit untuk mengakhiri rekursi. Dugaan saya adalah bahwa salah satu tes internal Vim untuk rekursi tak terbatas sedang dipicu, yang menghasilkan kesalahan. Jika Makro 1 menghasilkan kesalahan seperti itu, maka kesalahan itu akan menghentikan eksekusi Wrapper Macro segera setelah itu
@w
.Saran saya adalah untuk membatasi berapa kali makro Anda dieksekusi dengan menulis ulang mereka sebagai: perintah ex dan membatasi rentang garis di mana mereka dieksekusi. Sebagai contoh:
mana
^M
cara mengetik Enter atau tombol Kembali Anda. Saya belum menguji mereka bersama-sama di Makro Wrapper Anda, tetapi saya pikir Anda akan dapat memperbaiki kesalahan yang mungkin saya buat.sumber
/foo
). Meskipun:silent!
memang trik submakro rekursif tidak membatalkan makro pembungkus, sekarang submacro tidak berakhir sama sekali ... dan saya menduga bahwa membuatnya entah bagaimana mengakhiri lagi akan kembali mengakhiri makro pembungkus juga. Sepertinya saya mandek. : - \Apa yang berhasil bagi saya adalah kombinasi jawaban @Peter Rincker dan @garyjohn. Secara terpisah saya terus mendapatkan masalah aneh.
Saya pikir
silent!
di dalam<leader>rt
, dan karakter pipa antaraendtry
danw
itu adalah kunci - hanya memiliki garis istirahat setelahendtry
gagal. Thetry
s bekerja ketika saya baru saja memasukkan mereka, tetapi ketika menjalankan sebagai makro kesalahan tentang teks pencarian tidak ditemukan akan terus dibangkitkan.sumber
Saya secara rutin membuat macro on-the-fly ketika saya perlu melakukan tugas yang berulang di antara banyak file. Dalam kasus saya, saya memiliki NERDtree ( http://www.vim.org/scripts/script.php?script_id=1658 ) diinstal di VIM, yang membuat
vsplit
jendela, dan di sebelah kiri, saya memiliki daftar semua file di direktori saat ini. Dalam satu contoh, saya perlu menemukan contoh pertama dari stringMY_TEST
dalam file, dan kemudian menghapus, jika ada, awalan berlabelCUSTOM_PREFIX-
dari baris itu, simpan file, lalu pindah ke yang berikutnya.Inilah cara saya menjalankan makro ini di sekitar 2000 file di direktori saat ini. Saya bisa menulis skrip bash untuk melakukan ini, tetapi lebih cepat di VIM, dalam kasus saya. The
+
tombol Menandakan ditekan simulq,a
CTRL+ W,←
↓
ENTER
q
1000 @,,a
Semoga ini membantu!
sumber