1 " Author: Mikolaj Machowski <mikmach@wp.pl>
3 " Description: Footnotes in Vim
4 " Installation: See below
5 " Last change: pon wrz 30 09:00 2002 C
8 " Inspired by Emmanuel Touzery tip:
9 " http://vim.sourceforge.net/tip_view.php?tip_id=332
10 " and discussion below (thanks to Luc for pluginization hints)
11 " I added functions and turned it into vim script.
13 " Installation: Drop it to your plugin directory but you can declare your
14 " favorite types of footnotes in your ftplugins.
18 " <Leader>f (in insert mode) - inserts footnotemark, opens at bottom window where
19 " footnotemark is also inserted and you are ready to type in your
21 " <Leader>r (in insert mode) - closes footnote window and returns to the text in
24 " You can change them by placing in your vimrc:
25 " imap your_map <Plug>AddVimFootnote
26 " imap your_map <Plug>ReturnFromFootnote
29 " Footnotes are placed at the end of the file but above signature delimiter
33 " b:vimfootnotetype - possible values:
34 " arabic (default) - [1] [2] [3] ...
35 " alpha - [a] [b] ... [z] [aa] [bb] ... [zz] [a] ...
36 " Alpha - as above but uppercase [A] ...
37 " roman - [i] [ii] [iii] displayed properly up to 89
38 " Roman - as above but uppercase [I] ...
39 " star - [*] [**] [***] ...
41 " Additional commands:
43 " You can change current footnote number (one obligatory argument)
45 " FootnoteNumberRestore:
46 " You can restore old footnote number
47 " :FootnoteNumberRestore
49 " Decrease footnote counter by 1
52 " Change type of the footnotes and restart counter (1, a, A, i, I, *)
54 " If your previous footnote type was alpha, Alpha, roman, Roman or star
55 " new type will be arabic.
56 " If your previous footnote type was arabic new type will be alpha.
57 " :FootnoteMeta name_of_the_type
58 " Change footnote type to name_of_the_type. If name_of_the_type is the
59 " same as your current footnote type nothing would be changed.
60 " You can change your default type of footnote before inserting first
63 " Restore previous footnote type and counter. Unfortunately there is no easy
64 " way to sort footnotes at the end of file without handmade :!sort on marked
65 " lines (it doesn't work for 'star' type).
68 " For easier work with this commands I would suggest place this lines in your
69 " vimrc (they offer very nice completion of Vim commands):
71 " set wildmode=longest,list
74 " And/or map :FootnoteComs for something you like.
76 """""""""""""""""""""""""""""""""""""""""""""""""""
78 if exists("b:loaded_footnote_vim") | finish | endif
79 let b:loaded_footnote_vim = 1
84 if !exists("g:vimfootnotetype")
85 let g:vimfootnotetype = "arabic"
87 if !exists("g:vimfootnotenumber")
88 let g:vimfootnotenumber = 0
92 if !hasmapto('<Plug>AddVimFootnote', 'i')
93 imap <Leader>f <Plug>AddVimFootnote
95 if !hasmapto('<Plug>AddVimFootnote', 'n')
96 nmap <Leader>f <Plug>AddVimFootnote
99 if !hasmapto('<Plug>ReturnFromFootnote', 'i')
100 imap <Leader>r <Plug>ReturnFromFootnote
102 if !hasmapto('<Plug>ReturnFromFootnote', 'n')
103 nmap <Leader>r <Plug>ReturnFromFootnote
106 nnoremap <Plug>AddVimFootnote :call <SID>VimFootnotes('a')<CR>
107 inoremap <Plug>AddVimFootnote <C-O>:call <SID>VimFootnotes('a')<CR>
109 inoremap <Plug>ReturnFromFootnote <C-O>:q<CR><Right>
110 noremap <Plug>ReturnFromFootnote :q<CR><Right>
113 command! -nargs=1 FootnoteNumber call <sid>VimFootnoteNumber(<q-args>)
114 command! -nargs=0 FootnoteNumberRestore call <sid>VimFootnoteNumberRestore()
115 command! -nargs=0 FootnoteUndo let g:vimfootnotenumber = g:vimfootnotenumber - 1
116 command! -nargs=? FootnoteMeta call <sid>VimFootnoteMeta(<f-args>)
117 command! -nargs=0 FootnoteRestore call <sid>VimFootnoteRestore()
119 function! s:VimFootnoteNumber(newnumber)
120 let g:oldvimfootnotenumber = g:vimfootnotenumber
121 let g:vimfootnotenumber = a:newnumber - 1
124 function! s:VimFootnoteNumberRestore()
125 if exists(g:oldvimfootnotenumber)
126 let g:vimfootnotenumber = g:oldvimfootnotenumber
132 function! s:VimFootnoteMeta(...)
133 let g:oldvimfootnotetype = g:vimfootnotetype
134 let g:oldvimfootnotenumber = g:vimfootnotenumber
136 if (g:vimfootnotetype == "arabic")
137 let g:vimfootnotetype = "alpha"
139 let g:vimfootnotetype = "arabic"
142 if (a:1 == g:vimfootnotetype)
143 echomsg "You have chosen the same footnote type! Command won't affect."
146 let g:vimfootnotetype = a:1
149 let g:vimfootnotenumber = 0
152 function! s:VimFootnoteRestore()
153 if exists("g:oldvimfootnotenumber")
154 let oldvimfootnotetype2 = g:vimfootnotetype
155 let oldvimfootnotenumber2 = g:vimfootnotenumber
156 let g:vimfootnotetype = g:oldvimfootnotetype
157 let g:vimfootnotenumber = g:oldvimfootnotenumber
158 let g:oldvimfootnotetype = oldvimfootnotetype2
159 let g:oldvimfootnotenumber = oldvimfootnotenumber2
161 echomsg "You didn't change footnote type. Yet."
166 function! s:VimFootnoteType(footnumber)
167 if (g:vimfootnotetype =~ "alpha\\|Alpha")
168 if (g:vimfootnotetype == "alpha")
173 if (a:footnumber <= 26)
174 let ftnumber = nr2char(a:footnumber+96+upper)
175 elseif (a:footnumber <= 52)
176 let ftnumber = nr2char(a:footnumber+70+upper).nr2char(a:footnumber+70+upper)
178 let g:vimfootnotenumber = 1
179 let ftnumber = nr2char(97+upper)
181 elseif (g:vimfootnotetype == "star")
184 while (starnumber <= a:footnumber)
185 let ftnumber = ftnumber . '*'
186 let starnumber = starnumber + 1
188 elseif (g:vimfootnotetype =~ "roman\\|Roman")
191 let counter = g:vimfootnotenumber
194 let counter = counter - 50
196 if (counter > 39 && counter < 50)
198 let counter = counter - 40
201 let tenmodulo = counter % 10
202 let number_roman_ten = (counter - tenmodulo) / 10
204 while (romanten <= number_roman_ten)
205 let ftnumber = ftnumber.'x'
206 let romanten = romanten + 1
208 elseif (counter == 10)
209 let ftnumber = ftnumber.'x'
212 let tenmodulo = counter
216 elseif (tenmodulo == 2)
218 elseif (tenmodulo == 3)
220 elseif (tenmodulo == 4)
222 elseif (tenmodulo == 5)
224 elseif (tenmodulo == 6)
226 elseif (tenmodulo == 7)
228 elseif (tenmodulo == 8)
229 let oneroman = 'viii'
230 elseif (tenmodulo == 9)
232 elseif (tenmodulo == 0)
235 let ftnumber = ftnumber . oneroman
236 if (g:vimfootnotetype == "Roman")
237 let ftnumber = substitute(ftnumber, ".*", "\\U\\0", "g")
240 let ftnumber = a:footnumber
245 function! s:VimFootnotes(appendcmd)
246 if (g:vimfootnotenumber != 0)
247 let g:vimfootnotenumber = g:vimfootnotenumber + 1
248 let g:vimfootnotemark = <sid>VimFootnoteType(g:vimfootnotenumber)
251 let g:vimfootnotenumber = 1
252 let g:vimfootnotemark = <sid>VimFootnoteType(g:vimfootnotenumber)
255 exe "normal ".a:appendcmd."[".g:vimfootnotemark."]\<esc>"
258 if search("^-- $", "bW")
259 exe "normal O \<esc> O".cr."[".g:vimfootnotemark."] "
261 exe "normal o".cr."[".g:vimfootnotemark."] "
266 let &cpo = s:cpo_save