diff options
Diffstat (limited to 'vim/init/keymaps.vim')
-rw-r--r-- | vim/init/keymaps.vim | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/vim/init/keymaps.vim b/vim/init/keymaps.vim index 37c0936..4df45ad 100644 --- a/vim/init/keymaps.vim +++ b/vim/init/keymaps.vim | |||
@@ -197,45 +197,57 @@ endfunc | |||
197 | nnoremap dm :call DeleteMark(getchar())<CR> | 197 | nnoremap dm :call DeleteMark(getchar())<CR> |
198 | 198 | ||
199 | 199 | ||
200 | " Usage: z' to fold lines not near marks, use v:count to set bound | 200 | " Usage: z' to fold lines not near marks, use v:count to set offset |
201 | " For example: 15z' | 201 | " For example: 15z' |
202 | autocmd BufEnter * let b:unfold_marks = 0 | 202 | autocmd BufEnter * let b:fold_for_marks = 0 |
203 | let g:mark_bound = 5 | 203 | let g:mark_offset = 5 |
204 | function! ToggleFoldForMarks(bound) | 204 | function! ToggleFoldForMarks(offset) |
205 | let bound = a:bound ? a:bound : g:mark_bound | 205 | if !b:fold_for_marks || a:offset |
206 | if !b:unfold_marks | 206 | " If toggling from other foldmethod, save view! |
207 | mkview | 207 | if !b:fold_for_marks |
208 | setlocal foldmethod=manual | 208 | mkview |
209 | setlocal foldmethod=manual | ||
210 | endif | ||
211 | |||
212 | " Then clear all folds | ||
209 | norm! zEgg | 213 | norm! zEgg |
210 | 214 | ||
215 | " Get list of lines which has mark | ||
211 | let line_list = [] | 216 | let line_list = [] |
212 | for info in getmarklist(bufnr()) | 217 | for info in getmarklist(bufnr()) |
213 | if match(info.mark, "[a-z]") == 1 | 218 | if match(info.mark, "[a-z]") == 1 |
214 | call add(line_list, info.pos[1]) | 219 | call add(line_list, info.pos[1]) |
215 | endif | 220 | endif |
216 | endfor | 221 | endfor |
217 | echo line_list | ||
218 | call uniq(sort(line_list, 'n')) | 222 | call uniq(sort(line_list, 'n')) |
219 | 223 | ||
224 | " Create folds not inside offset of marks | ||
225 | let offset = a:offset ? a:offset : g:mark_offset | ||
220 | for line in line_list | 226 | for line in line_list |
221 | let foldstart = line('.') | 227 | let foldstart = line('.') |
222 | let line_upper = line - bound | 228 | let line_upper = line - offset |
223 | let line_lower = line + bound | 229 | let line_lower = line + offset |
224 | if foldstart < (line_upper - 1) | 230 | if foldstart < (line_upper - 1) |
225 | exe foldstart..","..(line_upper-1).." fold" | 231 | exe foldstart..","..(line_upper-1).." fold" |
226 | endif | 232 | endif |
227 | " Jump to lower bound of lineer | 233 | " Move cursor outside of lower offset |
228 | exe (line_lower + 1) | 234 | exe (line_lower + 1) |
229 | endfor | 235 | endfor |
236 | |||
237 | " Fold lower offset to end of file | ||
230 | if line('.') < line('$') | 238 | if line('.') < line('$') |
231 | norm! zfG | 239 | norm! zfG |
232 | endif | 240 | endif |
241 | |||
242 | let b:fold_for_marks = 1 | ||
243 | echo "Folds for Marks" | ||
233 | else | 244 | else |
234 | loadview | 245 | loadview |
246 | let b:fold_for_marks = 0 | ||
247 | echo "Reset Folds" | ||
235 | endif | 248 | endif |
236 | let b:unfold_marks = !b:unfold_marks | ||
237 | endfunction | 249 | endfunction |
238 | nnoremap <expr> z' ":\<C-u>call ToggleFoldForMarks(".v:count..")\<CR>" | 250 | nnoremap <expr> z' ":\<C-u>call ToggleFoldForMarks("..v:count..")\<CR>" |
239 | 251 | ||
240 | "}}} | 252 | "}}} |
241 | " EDIT {{{ | 253 | " EDIT {{{ |