]> git.madduck.net Git - etc/vim.git/blobdiff - ftplugin/markdown.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:

Add tests for single-line emphasis
[etc/vim.git] / ftplugin / markdown.vim
index ae81c804c0d8030748917454ecdd8764be90166f..d68e7c0a790aeeca9e1f55e574d05976bc363aaf 100644 (file)
@@ -303,53 +303,75 @@ function! s:Toc(...)
     endif
 
 
     endif
 
 
-    let b:bufnr = bufnr('%')
-    let b:fenced_block = 0
-    let b:header_list = []
+    let l:bufnr = bufnr('%')
+    let l:cursor_line = line('.')
+    let l:cursor_header = 0
+    let l:fenced_block = 0
+    let l:front_matter = 0
+    let l:header_list = []
     let l:header_max_len = 0
     let l:header_max_len = 0
-    let g:vim_markdown_toc_autofit = get(g:, "vim_markdown_toc_autofit", 0)
+    let l:vim_markdown_toc_autofit = get(g:, "vim_markdown_toc_autofit", 0)
+    let l:vim_markdown_frontmatter = get(g:, "vim_markdown_frontmatter", 0)
     for i in range(1, line('$'))
         let l:lineraw = getline(i)
         let l:l1 = getline(i+1)
         let l:line = substitute(l:lineraw, "#", "\\\#", "g")
         if l:line =~ '````*' || l:line =~ '\~\~\~\~*'
     for i in range(1, line('$'))
         let l:lineraw = getline(i)
         let l:l1 = getline(i+1)
         let l:line = substitute(l:lineraw, "#", "\\\#", "g")
         if l:line =~ '````*' || l:line =~ '\~\~\~\~*'
-            if b:fenced_block == 0
-                let b:fenced_block = 1
-            elseif b:fenced_block == 1
-                let b:fenced_block = 0
+            if l:fenced_block == 0
+                let l:fenced_block = 1
+            elseif l:fenced_block == 1
+                let l:fenced_block = 0
+            endif
+        elseif l:vim_markdown_frontmatter == 1
+            if l:front_matter == 1
+                if l:line == '---'
+                    let l:front_matter = 0
+                endif
+            elseif i == 1
+                if l:line == '---'
+                    let l:front_matter = 1
+                endif
             endif
         endif
         if l:line =~ '^#\+' || (l:l1 =~ '^=\+\s*$' || l:l1 =~ '^-\+\s*$') && l:line =~ '^\S'
             endif
         endif
         if l:line =~ '^#\+' || (l:l1 =~ '^=\+\s*$' || l:l1 =~ '^-\+\s*$') && l:line =~ '^\S'
-            let b:is_header = 1
+            let l:is_header = 1
         else
         else
-            let b:is_header = 0
+            let l:is_header = 0
         endif
         endif
-        if b:is_header == 1 && b:fenced_block == 0
+        if l:is_header == 1 && l:fenced_block == 0 && l:front_matter == 0
             " append line to location list
             " append line to location list
-            let b:item = {'lnum': i, 'text': l:line, 'valid': 1, 'bufnr': b:bufnr, 'col': 1}
-            let b:header_list = b:header_list + [b:item]
+            let l:item = {'lnum': i, 'text': l:line, 'valid': 1, 'bufnr': l:bufnr, 'col': 1}
+            let l:header_list = l:header_list + [l:item]
+            " set header number of the cursor position
+            if l:cursor_header == 0
+                if i == l:cursor_line
+                    let l:cursor_header = len(l:header_list)
+                elseif i > l:cursor_line
+                    let l:cursor_header = len(l:header_list) - 1
+                endif
+            endif
             " keep track of the longest header size (heading level + title)
             " keep track of the longest header size (heading level + title)
-            let b:total_len = stridx(l:line, ' ') + len(l:line)
-            if b:total_len > l:header_max_len
-                let l:header_max_len = b:total_len
+            let l:total_len = stridx(l:line, ' ') + len(l:line)
+            if l:total_len > l:header_max_len
+                let l:header_max_len = l:total_len
             endif
         endif
     endfor
             endif
         endif
     endfor
-    if len(b:header_list) == 0
+    if len(l:header_list) == 0
         echom "Toc: No headers."
         return
     endif
         echom "Toc: No headers."
         return
     endif
-    call setloclist(0, b:header_list)
+    call setloclist(0, l:header_list)
 
     if l:window_type ==# 'horizontal'
         lopen
     elseif l:window_type ==# 'vertical'
         vertical lopen
         " auto-fit toc window when possible to shrink it
 
     if l:window_type ==# 'horizontal'
         lopen
     elseif l:window_type ==# 'vertical'
         vertical lopen
         " auto-fit toc window when possible to shrink it
-        if (&columns/2) > l:header_max_len && g:vim_markdown_toc_autofit == 1
-            let &winwidth = (l:header_max_len + 1)
+        if (&columns/2) > l:header_max_len && l:vim_markdown_toc_autofit == 1
+            execute 'vertical resize ' . (l:header_max_len + 1)
         else
         else
-            let &winwidth = (&columns/2)
+            execute 'vertical resize ' . (&columns/2)
         endif
     elseif l:window_type ==# 'tab'
         tab lopen
         endif
     elseif l:window_type ==# 'tab'
         tab lopen
@@ -378,7 +400,7 @@ function! s:Toc(...)
     endfor
     setlocal nomodified
     setlocal nomodifiable
     endfor
     setlocal nomodified
     setlocal nomodifiable
-    normal! gg
+    execute 'normal! ' . l:cursor_header . 'G'
 endfunction
 
 " Convert Setex headers in range `line1 .. line2` to Atx.
 endfunction
 
 " Convert Setex headers in range `line1 .. line2` to Atx.
@@ -594,10 +616,11 @@ command! -buffer Toct call s:Toc('tab')
 " Heavily based on vim-notes - http://peterodding.com/code/vim/notes/
 let s:filetype_dict = {
     \ 'c++': 'cpp',
 " Heavily based on vim-notes - http://peterodding.com/code/vim/notes/
 let s:filetype_dict = {
     \ 'c++': 'cpp',
-    \ 'viml': 'vim'
+    \ 'viml': 'vim',
+    \ 'bash': 'sh'
 \ }
 
 \ }
 
-function! s:Markdown_highlight_sources(force)
+function! s:MarkdownHighlightSources(force)
     " Syntax highlight source code embedded in notes.
     " Look for code blocks in the current file
     let filetypes = {}
     " Syntax highlight source code embedded in notes.
     " Look for code blocks in the current file
     let filetypes = {}
@@ -623,7 +646,7 @@ function! s:Markdown_highlight_sources(force)
                 let filetype = ft
             endif
             let group = 'mkdSnippet' . toupper(substitute(filetype, "[+-]", "_", "g"))
                 let filetype = ft
             endif
             let group = 'mkdSnippet' . toupper(substitute(filetype, "[+-]", "_", "g"))
-            let include = s:syntax_include(filetype)
+            let include = s:SyntaxInclude(filetype)
             let command = 'syntax region %s matchgroup=%s start="^\s*```%s$" matchgroup=%s end="\s*```$" keepend contains=%s%s'
             execute printf(command, group, startgroup, ft, endgroup, include, has('conceal') ? ' concealends' : '')
             execute printf('syntax cluster mkdNonListItem add=%s', group)
             let command = 'syntax region %s matchgroup=%s start="^\s*```%s$" matchgroup=%s end="\s*```$" keepend contains=%s%s'
             execute printf(command, group, startgroup, ft, endgroup, include, has('conceal') ? ' concealends' : '')
             execute printf('syntax cluster mkdNonListItem add=%s', group)
@@ -633,7 +656,7 @@ function! s:Markdown_highlight_sources(force)
     endfor
 endfunction
 
     endfor
 endfunction
 
-function! s:syntax_include(filetype)
+function! s:SyntaxInclude(filetype)
     " Include the syntax highlighting of another {filetype}.
     let grouplistname = '@' . toupper(a:filetype)
     " Unset the name of the current syntax while including the other syntax
     " Include the syntax highlighting of another {filetype}.
     let grouplistname = '@' . toupper(a:filetype)
     " Unset the name of the current syntax while including the other syntax
@@ -658,16 +681,16 @@ function! s:syntax_include(filetype)
 endfunction
 
 
 endfunction
 
 
-function! s:Markdown_refresh_syntax(force)
+function! s:MarkdownRefreshSyntax(force)
     if &filetype == 'markdown' && line('$') > 1
     if &filetype == 'markdown' && line('$') > 1
-        call s:Markdown_highlight_sources(a:force)
+        call s:MarkdownHighlightSources(a:force)
     endif
 endfunction
 
 augroup Mkd
     autocmd!
     endif
 endfunction
 
 augroup Mkd
     autocmd!
-    au BufWinEnter * call s:Markdown_refresh_syntax(1)
-    au BufWritePost * call s:Markdown_refresh_syntax(0)
-    au InsertEnter,InsertLeave * call s:Markdown_refresh_syntax(0)
-    au CursorHold,CursorHoldI * call s:Markdown_refresh_syntax(0)
+    au BufWinEnter * call s:MarkdownRefreshSyntax(1)
+    au BufWritePost * call s:MarkdownRefreshSyntax(0)
+    au InsertEnter,InsertLeave * call s:MarkdownRefreshSyntax(0)
+    au CursorHold,CursorHoldI * call s:MarkdownRefreshSyntax(0)
 augroup END
 augroup END