Jawaban:
Metode dalam jawaban saya sebelumnya tidak bertransformasi dengan baik ke konten dinamis. Di sinilah plugin potongan seperti UltiSnips dan SnipMate masuk. Saya akan memberikan demo UltiSnips di sini. Instal menggunakan metode favorit Anda dari Bagaimana cara menginstal plugin di vim / vi?
Sekarang, buat UltiSnips
direktori di direktori .vim
atau Anda _vimfiles
. Di dalamnya, letakkan c.snippet
file yang berisi:
snippet /// "My header" A
/*!
* @author Robbie Yi JIANG, `date +'%d-%b-%Y %T'`
*
*
*/
endsnippet
Sekarang, jika Anda membuka file C dan mengetik ///
, itu akan secara otomatis diganti dengan header, termasuk tanggal dan waktu saat ini. Itu dia!
Biasanya, UltiSnips menyisipkan potongan ketika Anda menekan Tab. Di sini, kami telah menetapkan bahwa cuplikan harus dimasukkan secara otomatis - itulah yang A
ditunjukkan pada akhir baris pertama. Lihat :help UltiSnips-syntax
informasi lebih lanjut tentang cara menulis cuplikan.
Namun, kebanyakan orang memulai dengan koleksi cuplikan, seperti vim-snippets
. Ada terlalu banyak untuk dijelaskan di sini, tetapi Anda mungkin beberapa di antaranya sangat berguna.
Salah satu caranya adalah dengan membuat file yang berisi potongan ini, dan membacanya saat Anda mengetik ///
.
Misalnya, buat yang ~/.vim/snippets/my_header.snip
berisi tajuk ini. Kemudian tentukan pemetaan ini:
inoremap /// <esc>:r ~/.vim/snippets/my_header.snip<cr>i
Atau:
inoremap /// <esc>:call append(line('.')-1, readfile(expand('~/.vim/snippets/my_header.snip')))<cr>i
Dalam pemetaan pertama, kursor Anda akan ditempatkan pada baris pertama dari teks yang disisipkan; dan yang kedua, kursor akan ditempatkan di bawah teks yang disisipkan.
Mungkin pemetaan paling sederhana, dalam hal melompati mode, adalah:
inoremap /// <c-r><c-o>=readfile(expand('~/.vim/snippets/my_header.snip'))<cr>
Untuk penggunaan yang lebih umum, Anda mungkin ingin melihat plugin snippet. UltiSnips dan SnipMate adalah dua yang populer. Saya juga tidak menggunakan, jadi saya tidak akan merekomendasikan satu.
Tulis fungsi yang mengembalikan string dan menyebutnya.
function! InsertHeader()
let l:header = "/*!\n"
\. "* @author Robbie Yi JIANG, " . strftime('%d-%b-%Y %H:%M:%S') . "\n"
\. "*\n"
\. "* \n"
\. "*/\n"
return l:header
endfunction
inoremap /// <C-R>=InsertHeader()<Enter><C-O>2k<C-O>$
Rincian strftime
ketergantungan pada platform Anda, jika Anda tidak menggunakan Windows dan itu tidak berfungsi maka Anda perlu man strftime
memikirkan argumennya.
Ini berfungsi dalam mode penyisipan tetapi melakukan hal-hal aneh untuk pemrosesan garis miring. Jika Anda melakukan //
komentar gaya C ++ , garis miring kedua tidak akan keluar sampai Anda mengetik spasi atau sesuatu setelahnya.
The <C-R>=
menyisipkan ekspresi pada posisi kursor. The InsertHeader()<Enter>
bit adalah ekspresi yang akan dievaluasi. Saya membangun garis string demi baris dalam fungsi, .
adalah penggabungan string dan \
merupakan karakter kelanjutan garis (di mana kelanjutan mengatakan "menggabungkan ini dengan baris sebelumnya," berbeda dengan bagaimana C dan keluarganya melakukannya). Akhirnya, dua <C-O>
operasi, satu untuk naik dua baris dan satu untuk pindah ke akhir baris di mana mungkin sebuah komentar file akan dimasukkan; perhatikan spasi di akhir string di baris keempat l:header
.