Bagaimana saya bisa membuat bagian / * komentar dengan /// seperti di XCode?


8

Di XCode, ada add-on yang disebut vvdocument, yang dapat mendeteksi tiga /hit, dan mentransfer ///ke:

/*!
*  @author Robbie Yi JIANG, 29-Jan-2016 14:01:45
*
*  
*/

Bagaimana saya bisa melakukan ini di Vim.

Jawaban:


9

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 UltiSnipsdirektori di direktori .vimatau Anda _vimfiles. Di dalamnya, letakkan c.snippetfile 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 Aditunjukkan pada akhir baris pertama. Lihat :help UltiSnips-syntaxinformasi 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.


3
+1 untuk Ultisnips. Anda juga dapat menentukan lokasi lompatan dan lokasi default untuk kursor Anda setelah memperluas cuplikan.
fruglemonkey

6

Salah satu caranya adalah dengan membuat file yang berisi potongan ini, dan membacanya saat Anda mengetik ///.

Misalnya, buat yang ~/.vim/snippets/my_header.snipberisi 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.


3

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 strftimeketergantungan pada platform Anda, jika Anda tidak menggunakan Windows dan itu tidak berfungsi maka Anda perlu man strftimememikirkan 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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.