From 92bf71ac7773588fbb7460479054d43c121ee7f5 Mon Sep 17 00:00:00 2001 From: jdhao Date: Thu, 12 Nov 2020 21:56:44 +0800 Subject: [PATCH] Add text objects for Markdown fenced code blocks. --- after/ftplugin/markdown.vim | 6 ++++++ autoload/text_obj.vim | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) 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 AddVimFootnote :call markdownfootnotes#VimFootnotes('i') inoremap AddVimFootnote :call markdownfootnotes#VimFootnotes('i') endif + +" Text objects for Markdown code blocks. +xnoremap ic :call text_obj#MdCodeBlock('i') +xnoremap ac :call text_obj#MdCodeBlock('a') +onoremap ic :call text_obj#MdCodeBlock('i') +onoremap ac :call text_obj#MdCodeBlock('a') 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! `' +endfunction