aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjdhao <jdhao@hotmail.com>2020-11-12 21:56:44 +0800
committerjdhao <jdhao@hotmail.com>2020-11-12 21:56:44 +0800
commit92bf71ac7773588fbb7460479054d43c121ee7f5 (patch)
tree6b2376e69ffebe743a30e74bdb31e0a2498eeb87
parentf68fa62e864b1293d74bc23e4fe7b54746203370 (diff)
Add text objects for Markdown fenced code blocks.
-rw-r--r--after/ftplugin/markdown.vim6
-rw-r--r--autoload/text_obj.vim24
2 files changed, 30 insertions, 0 deletions
diff --git a/after/ftplugin/markdown.vim b/after/ftplugin/markdown.vim
index 33b5f1c..355c067 100644
--- a/after/ftplugin/markdown.vim
+++ b/after/ftplugin/markdown.vim
@@ -6,3 +6,9 @@ if exists(':FootnoteNumber')
nnoremap <buffer> <Plug>AddVimFootnote :<C-U>call markdownfootnotes#VimFootnotes('i')<CR>
inoremap <buffer> <Plug>AddVimFootnote <C-O>:<C-U>call markdownfootnotes#VimFootnotes('i')<CR>
endif
+
+" Text objects for Markdown code blocks.
+xnoremap <buffer><silent> ic :<C-U>call text_obj#MdCodeBlock('i')<CR>
+xnoremap <buffer><silent> ac :<C-U>call text_obj#MdCodeBlock('a')<CR>
+onoremap <buffer><silent> ic :<C-U>call text_obj#MdCodeBlock('i')<CR>
+onoremap <buffer><silent> ac :<C-U>call text_obj#MdCodeBlock('a')<CR>
diff --git a/autoload/text_obj.vim b/autoload/text_obj.vim
index ba7c808..58ba710 100644
--- a/autoload/text_obj.vim
+++ b/autoload/text_obj.vim
@@ -52,3 +52,27 @@ function! text_obj#URL() abort
call setpos("'>", [buf_num, cur_row, end_col, 0])
normal! gv
endfunction
+
+function! text_obj#MdCodeBlock(type) abort
+ " the parameter type specify whether it is inner text objects or arround
+ " text objects.
+
+ " Move the cursor to the end of line in case that cursor is on the openning
+ " of a code block. Actually, there are still issues if the cursor is on the
+ " closing of a code block. In this case, the start row of code blocks would
+ " be wrong. Unless we can match code blocks, it not easy to fix this.
+ normal! $
+ let start_row = searchpos('\s*```', 'bnW')[0]
+ let end_row = searchpos('\s*```', 'nW')[0]
+
+ let buf_num = bufnr()
+ if a:type ==# 'i'
+ let start_row += 1
+ let end_row -= 1
+ endif
+ " echo a:type start_row end_row
+
+ call setpos("'<", [buf_num, start_row, 1, 0])
+ call setpos("'>", [buf_num, end_row, 1, 0])
+ execute 'normal! `<V`>'
+endfunction