Come posso creare una sezione commenti / * con /// like in XCode?


8

In XCode, c'è un componente aggiuntivo chiamato vvdocument, che può rilevare tre /hit e trasferirsi ///in:

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

Come posso farlo in Vim.

Risposte:


9

Il metodo nella mia risposta precedente non si trasforma bene in contenuto dinamico. È qui che entrano in gioco plugin di frammenti come UltiSnips e SnipMate. Qui fornirò una demo di UltiSnips . Installalo usando il tuo metodo preferito da Come posso installare un plugin in vim / vi?

Ora, crea una UltiSnipsdirectory nella tua .vimo _vimfilesdirectory. In esso, inserire un c.snippetfile contenente:

snippet /// "My header" A
/*!
*  @author Robbie Yi JIANG, `date +'%d-%b-%Y %T'`
*
*  
*/
endsnippet

Ora, se apri un file C e digiti ///, dovrebbe essere sostituito automaticamente con l'intestazione, inclusa la data e l'ora correnti. Questo è tutto!

Di solito, UltiSnips inserisce uno snippet quando si preme Tab. Qui, abbiamo specificato che lo snippet deve essere inserito automaticamente - questo è ciò Ache indica alla fine della prima riga. Checkout :help UltiSnips-syntaxper ulteriori informazioni sulla scrittura di frammenti.

La maggior parte delle persone, tuttavia, inizia con una raccolta di frammenti, come ad esempio vim-snippets. Ce ne sono troppi da descrivere qui, ma alcuni potrebbero essere molto utili.


3
+1 per Ultisnips. Puoi anche specificare le posizioni di salto e le posizioni predefinite per il cursore dopo aver espanso uno snippet.
fruglemonkey,

6

Un modo sarebbe quello di creare un file contenente questo frammento e leggerlo durante la digitazione ///.

Ad esempio, creare ~/.vim/snippets/my_header.snipcontenente questa intestazione. Quindi definire questo mapping:

inoremap /// <esc>:r ~/.vim/snippets/my_header.snip<cr>i

O:

inoremap /// <esc>:call append(line('.')-1, readfile(expand('~/.vim/snippets/my_header.snip')))<cr>i

Nella prima mappatura, il cursore verrà posizionato sulla prima riga del testo inserito; e nel secondo, il cursore verrà posizionato sotto il testo inserito.

Forse la mappatura più semplice, in termini di saltare le modalità, è:

inoremap /// <c-r><c-o>=readfile(expand('~/.vim/snippets/my_header.snip'))<cr>

Per un utilizzo più generale, potresti voler esaminare i plug-in dei frammenti. UltiSnips e SnipMate sono due popolari. Nemmeno io uso, quindi non lo consiglio.


3

Scrivi una funzione che restituisce la stringa e chiamala.

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>$

I dettagli di strftimedipendono dalla tua piattaforma, se non sei su Windows e non funziona, dovrai man strftimecapire gli argomenti.

Funziona in modalità insert ma fa cose strane per l'elaborazione in avanti. Se stai facendo //commenti in stile C ++ , la seconda barra non uscirà finché non digiti uno spazio o qualcosa dopo.

La <C-R>=inserisce un'espressione nella posizione del cursore. Il InsertHeader()<Enter>bit è l'espressione che viene valutata. Costruisco la stringa riga per riga nella funzione, .è la concatenazione di stringhe ed \è il carattere di continuazione della riga (dove la continuazione dice "combina questo con la riga precedente", in contrasto con il modo in cui C e la sua famiglia lo fanno). Infine, due <C-O>operazioni, una per spostarsi di due righe in alto e una per spostarsi alla fine della riga, dove presumibilmente verrà inserito un commento di file; notare lo spazio alla fine della stringa nella quarta riga di l:header.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.