]> git.madduck.net Git - etc/vim.git/blob - ftplugin/mkd.vim

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

added header navigation mappings
[etc/vim.git] / ftplugin / mkd.vim
1 "TODO get working on visual mode
2
3 "- if inside a header
4 "    goes to the nearest head before current position
5 "    returns its initial hashes (#)
6 "- else
7 "    goes to beginning of document
8 "    returns ''
9 fu! b:Markdown_GoCurHeader()
10     if search( '^#', 'bcW' ) != 0
11         return matchstr( getline('.'), '\v^#+' )
12     el
13         norm! gg
14         ec 'outside any header'
15         return ''
16     en
17 endf
18
19 "same as `b:Markdown_GoCurHeader`:function: but does not change cursor position
20 fu! b:Markdown_GetHashesCurHeader()
21     let line = search( '\v^#', 'nW' ) != 0
22     retu matchstr( getline(line) '\v^#+' )
23 endf
24
25 "goes to next header of any level
26 "returns its hashes
27 fu! b:Markdown_GoNextHeader()
28     if search( '\v^#', 'W' ) != 0
29         return matchstr( getline('.'), '\v^#+' )
30     el
31         "norm! G
32         ec 'no more headers'
33         return ''
34     en
35 endf
36
37 "goes to previous header of any level
38 "
39 "if there is no previous header, only print a warning
40 "
41 "if the cursor is not exactly at the header,
42 "it goes to exactly the header. So this could be used
43 "if you want to go to the current header line.
44 fu! b:Markdown_GoPreviousHeader()
45     if search( '^#', 'bW' ) != 0
46         return matchstr( getline('.'), '\v^#+' )
47     el
48         "norm! gg
49         ec 'no more headers'
50         return ''
51     en
52 endf
53
54 "if already at top level, go to beginning of buffer
55 fu! b:Markdown_GoHeaderUp()
56     let l:hashes = b:Markdown_GoCurHeader()
57     if len( l:hashes ) > 1
58         cal search( '^' . l:hashes[1:] . '[^#]', 'b' )
59     el
60         norm! gg
61     en
62 endf
63
64 fu! b:Markdown_GoNextHeaderSameLevel()
65
66     let l:hashes = b:Markdown_GoCurHeader()
67     
68     "go to next occurrence of that number of hashes
69     cal search( '^' . l:hashes . '[^#]', 'W' )
70
71 endf
72
73 "if no more next siblings, print error message and do nothing.
74 fu! b:Markdown_GoNextSiblingHeader()
75
76     let l:hashes = b:Markdown_GoCurHeader()
77
78     if l:hashes ==# ''
79         retu
80     en
81
82     let l:nhashes = len(l:hashes)
83     if l:nhashes == 1
84         "special case, just add the largest possible value
85         let l:nextLowerLevelLine  = line('$') + 1
86     el
87         let l:nextLowerLevelLine  = search( '\v^#{1,' . ( l:nhashes - 1 ) . '}[^#]' , 'nW' )
88     en
89
90     let l:nextSameLevelLine   = search( '\v^' . l:hashes . '[^#]', 'nW' )
91
92     if (
93             \ l:nextSameLevelLine > 0
94             \ &&
95             \ (
96             \   l:nextLowerLevelLine == 0
97             \   ||
98             \   l:nextLowerLevelLine > l:nextSameLevelLine
99             \ )
100         \ )
101         cal cursor( l:nextSameLevelLine, 0 )
102     el
103         ec 'no more siblings'
104     en
105
106 endf
107
108 fu! b:Markdown_GoPreviousHeaderSameLevel()
109
110     let l:hashes = b:Markdown_GoCurHeader()
111
112     "go to next occurrence of that number of hashes
113     cal search( '^' . l:hashes . '[^#]', 'bW' )
114
115 endf
116
117 "if no more next siblings, print error message and do nothing.
118 fu! b:Markdown_GoPreviousSiblingHeader()
119
120     let l:hashes = b:Markdown_GoCurHeader()
121
122     if l:hashes ==# ''
123         retu
124     en
125
126     let l:nhashes = len(l:hashes)
127     if l:nhashes == 1
128         "special case, just add the largest possible value
129         let l:prevLowerLevelLine  = -1
130     el
131         let l:prevLowerLevelLine  = search( '\v^#{1,' . ( l:nhashes - 1 ) . '}[^#]' , 'bnW' )
132     en
133
134     let l:prevSameLevelLine   = search( '\v^' . l:hashes . '[^#]', 'bnW' )
135
136     if (
137             \ l:prevSameLevelLine > 0
138             \ &&
139             \ (
140             \   l:prevLowerLevelLine == 0
141             \   ||
142             \   l:prevLowerLevelLine < l:prevSameLevelLine
143             \ )
144         \ )
145         cal cursor( l:prevSameLevelLine, 0 )
146     el
147         ec 'no more siblings'
148     en
149
150 endf
151
152 "mnemonics: ']' next (like a right arrow)
153 nn <buffer><silent> ]] :cal b:Markdown_GoNextHeader()<cr>
154 "vnoremap <buffer><silent> ]] /^#<cr><esc>:nohl<cr>gv
155
156 "mnemonics: '[' next (like a left arrow)
157 nn <buffer><silent> ][ :cal b:Markdown_GoNextSiblingHeader()<cr>
158 "vnoremap <buffer><silent> ][ <esc>:cal b:Markdown_GoNextHeaderSameLevel()<cr>
159
160 nn <buffer><silent> [] :cal b:Markdown_GoPreviousSiblingHeader()<cr>
161
162 nn <buffer><silent> [[ :cal b:Markdown_GoPreviousHeader()<cr>
163 "vnoremap <buffer><silent> [[ ?^#<cr><esc>:nohl<cr>gv
164
165 "go up one level. Menmonic: Up.
166 nn <buffer><silent> ]u :cal b:Markdown_GoHeaderUp()<cr>