Como posso criar uma seção de comentários / * com /// like no XCode?


8

No XCode, há um complemento chamado vvdocument, que pode detectar três ocorrências /e transferir ///para:

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

Como posso fazer isso no Vim.

Respostas:


9

O método na minha resposta anterior não se transforma bem em conteúdo dinâmico. É aqui que entram os plug-ins de trechos como UltiSnips e SnipMate. Vou fornecer uma demonstração do UltiSnips aqui. Instale-o usando seu método favorito em Como instalar um plug-in no vim / vi?

Agora, crie um UltiSnipsdiretório no seu diretório .vimou _vimfiles. Nele, coloque um c.snippetarquivo contendo:

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

Agora, se você abrir um arquivo C e digitar ///, ele deverá ser substituído automaticamente pelo cabeçalho, incluindo a data e a hora atuais. É isso aí!

Normalmente, o UltiSnips insere um trecho quando você pressiona Tab. Aqui, especificamos que o snippet deve ser inserido automaticamente - é o que Aindica no final da primeira linha. Confira :help UltiSnips-syntaxmais informações sobre como escrever snippets.

A maioria das pessoas, no entanto, começa com uma coleção de trechos, como vim-snippets. Há muitos para descrever aqui, mas alguns deles podem ser muito úteis.


3
+1 para Ultisnips. Você também pode especificar locais de salto e locais padrão para o seu cursor após expandir um snippet.
Fruglemonkey

6

Uma maneira seria criar um arquivo contendo esse trecho e lê-lo quando você digita ///.

Por exemplo, crie ~/.vim/snippets/my_header.snipcontendo esse cabeçalho. Em seguida, defina este mapeamento:

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

Ou:

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

No primeiro mapeamento, seu cursor será colocado na primeira linha do texto inserido; e no segundo, o cursor será colocado abaixo do texto inserido.

Talvez o mapeamento mais simples, em termos de alternância de modos, seja:

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

Para uso mais geral, convém procurar plug-ins de trechos. UltiSnips e SnipMate são dois populares. Eu também não uso, então não vou recomendar um.


3

Escreva uma função que retorne a string e chame-a.

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

Os detalhes strftimedependem da sua plataforma, se você não estiver no Windows e não estiver funcionando, será necessário man strftimedescobrir os argumentos.

Isso funciona no modo de inserção, mas faz coisas estranhas no processamento da barra. Se você estiver fazendo //comentários no estilo C ++ , a segunda barra não será exibida até que você digite um espaço ou algo depois dela.

O <C-R>=insere uma expressão na posição do cursor. O InsertHeader()<Enter>bit é a expressão que é avaliada. Eu construo a string linha por linha na função, .é concatenação de string e \é o caractere de continuação de linha (onde continuation diz "combine isso com a linha anterior", em contraste com o modo como C e sua família o fazem). Finalmente, duas <C-O>operações, uma para subir duas linhas e outra para o final da linha, onde presumivelmente um comentário de arquivo será inserido; observe o espaço no final da string na quarta linha de l:header.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.