/vim/plugin/epitech.vim

https://gitlab.com/simepy/config · Vim Script · 228 lines · 186 code · 26 blank · 16 comment · 41 complexity · 364de527b74c90b139cb255af75ca3b5 MD5 · raw file

  1. "
  2. " Plugin vim pour les headers Epitech | Nathan Appere
  3. " > Mise a jour de la 1ere ligne et de l'update a la sauvegarde
  4. " > HeaderF10 remet integralement a jour le header
  5. " > Genere les .h correspondants au .c
  6. if exists("loaded_epitech")
  7. finish
  8. else
  9. let loaded_epitech = 1
  10. endif
  11. " >> Suppression des espaces surnumeraires
  12. function! RemoveST()
  13. let pos = line(".")
  14. let ext = expand("%:e")
  15. if (ext == "h" || ext == "c" || ext == "cpp" || ext == "hpp")
  16. execute "9,$s/[ \t]*$//"
  17. else
  18. execute "0,$s/[ \t]*$//"
  19. endif
  20. execute pos
  21. endfunction
  22. "autocmd BufWritePre * :call RemoveST()
  23. "autocmd BufNewFile * call HeaderCreate(1)
  24. "autocmd BufWritePre,FileWritePre * call HeaderUpdate()
  25. nnoremap <F9> :call InsertPrototypes()<cr>
  26. nnoremap <F10> :call HeaderF10()<cr>
  27. "
  28. " Format a la norme de l'ecole (/usr/local/share/emacs/site-lisp/std_comment.el)
  29. let s:login = "appere_n"
  30. let s:name = "nathan appere"
  31. let s:txt_made_by = "Made by "
  32. let s:txt_login = "Login "
  33. let s:txt_mail_s = "<"
  34. let s:txt_mail_e = "@epitech.net>"
  35. let s:txt_start = "Started on "
  36. let s:txt_last = "Last update "
  37. let s:txt_for = " for "
  38. let s:txt_in = " in "
  39. let s:date_format = "%a %b %d %H:%M:%S %Y"
  40. function s:GetComStr()
  41. let hascom = 1
  42. if &ft == "c" || &ft == "css"
  43. let s:cs = "/\*"
  44. let s:cc = "\*\* "
  45. let s:ce = "\*/"
  46. elseif &ft == "cpp" || expand("%:e") == "h" || &ft == "java" || &ft == "pov"
  47. let s:cs = "//"
  48. let s:cc = "// "
  49. let s:ce = "//"
  50. elseif &ft == "make" || &ft == "text"
  51. let s:cs = "##"
  52. let s:cc = "## "
  53. let s:ce = "##"
  54. elseif &ft == "php"
  55. let s:cs = "#!/usr/local/bin/php\n<?php\n/\*"
  56. let s:cc = "\*\* "
  57. let s:ce = "\*/"
  58. elseif &ft == "ruby"
  59. let s:cs = "#!/usr/local/bin/ruby"
  60. let s:cc = "## "
  61. let s:ce = "##"
  62. elseif &ft == "perl"
  63. let s:cs = "#!/usr/local/bin/perl -w"
  64. let s:cc = "## "
  65. let s:ce = "##"
  66. elseif &ft == "pascal"
  67. let s:cs = "{ "
  68. let s:cc = " "
  69. let s:ce = "}"
  70. elseif &ft == "latex"
  71. let s:cs = "%%"
  72. let s:cc = "%% "
  73. let s:ce = "%%"
  74. elseif &ft == "lisp"
  75. let s:cs = ";;"
  76. let s:cc = ";; "
  77. let s:ce = ";;"
  78. elseif &ft == "xdefault"
  79. let s:cs = "!!"
  80. let s:cc = "!! "
  81. let s:ce = "!!"
  82. else
  83. let hascom = 0
  84. endif
  85. return hascom
  86. endfunction
  87. "
  88. " Fonctions propres aux headers Epitech
  89. function s:LineFind(pat)
  90. let i = 1
  91. let l = getline(i)
  92. while l !~ '^\s*$' && i < 10
  93. if match(l, a:pat) != -1
  94. return i
  95. endif
  96. let i = i + 1
  97. let l = getline(i)
  98. endwhile
  99. return 0
  100. endfunction
  101. function s:LineUpdate(lnum, newline)
  102. let oldline = getline(a:lnum)
  103. if oldline != a:newline
  104. call setline(a:lnum, a:newline)
  105. endif
  106. endfunction
  107. function HeaderUpdate()
  108. if s:GetComStr()
  109. let lnum = s:LineFind(s:cc . s:txt_last)
  110. if lnum
  111. let newline = s:cc . s:txt_last . strftime(s:date_format) .' '. s:name
  112. call s:LineUpdate(lnum, newline)
  113. endif
  114. let lnum = s:LineFind('^\('. s:cc .'\).*\('. s:txt_for. '\).*\('. s:txt_in .'\).*$')
  115. if lnum
  116. let newline = s:cc . expand("%:t") . s:txt_for . expand("%:p:h:t") . s:txt_in . expand("%:p:h")
  117. call s:LineUpdate(lnum, newline)
  118. endif
  119. endif
  120. endfunction
  121. function HeaderCreate(new)
  122. if s:GetComStr()
  123. setl fo-=o fo-=r fo-=a fo-=c
  124. setl noautoindent nosmartindent nocindent
  125. execute "normal! ggO" .
  126. \ s:cs . "\n".
  127. \ s:cc . expand("%:t") . s:txt_for . expand("%:p:h:t") . s:txt_in . expand("%:p:h") . "\n".
  128. \ s:cc . "\n".
  129. \ s:cc . s:txt_made_by . s:name . "\n".
  130. \ s:cc . s:txt_login . s:txt_mail_s . s:login . s:txt_mail_e . "\n".
  131. \ s:cc . "\n".
  132. \ s:cc . s:txt_start . strftime(s:date_format) .' '. s:name . "\n".
  133. \ s:cc . s:txt_last . strftime(s:date_format) .' '. s:name . "\n".
  134. \ s:ce
  135. if getline(10) !~ '^\s*$' "pb avec le shebang
  136. execute "normal! 10"
  137. execute "normal! o"
  138. endif
  139. setl fo+=o fo+=r fo+=a fo+=c
  140. setl autoindent smartindent cindent
  141. if expand("%:e") == "h" || expand("%:e") == "hpp"
  142. if a:new
  143. call s:ProtectHeaders()
  144. call InsertPrototypes()
  145. endif
  146. else
  147. execute "normal! G"
  148. endif
  149. endif
  150. endfunction
  151. function HeaderF10()
  152. if s:GetComStr()
  153. if getline(1) == s:cs && getline(9) == s:ce
  154. execute "normal! gg9dd"
  155. endif
  156. call HeaderCreate(0)
  157. endif
  158. endfunction
  159. "
  160. " Fonctions de generations des .h
  161. function s:ProtectHeaders()
  162. let filename = substitute(toupper(expand("%:t")), "\\.", "_", "g") . "_"
  163. execute "normal! Go" .
  164. \ '#ifndef '. filename . "\n".
  165. \ '# define ' . filename . "\n".
  166. \ "\n\n\n".
  167. \ '#endif /* !' . filename . ' */'
  168. normal! kk
  169. endfunction
  170. " Un peu crade... mais au final v/s n'aident pas forcemment
  171. function InsertPrototypes()
  172. if expand("%:e") != "h" && input("Ce fichier n'est pas un header C, inclure quand meme ? (y/n)", "") != "y"
  173. return
  174. endif
  175. let cfile = expand("%:p:r") . ".cpp"
  176. if !filereadable(cfile)
  177. let cfile = expand("%:p:h") . input("Saisir un fichier: ", ".cpp")
  178. if !filereadable(cfile)
  179. return
  180. endif
  181. return
  182. endif
  183. let l = line(".")
  184. execute 'normal! o<EOIF>'
  185. silent execute (l) ." read ". cfile
  186. let lastline = getline(l)
  187. while lastline != '<EOIF>'
  188. let newline = getline(l + 1)
  189. if newline !~ '^{$' || !match(lastline, '.*\<main\>.*') || !match(lastline, '.*\<static\>.*')
  190. execute l
  191. execute l . "d"
  192. else
  193. call setline(l, lastline . ';')
  194. let l = l + 1
  195. endif
  196. let lastline = newline
  197. endwhile
  198. execute "normal! dd"
  199. if getline(l) !~ '^\s*$'
  200. execute "normal! O"
  201. endif
  202. endfunction