diff options
| -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 {{{ |