From f68fa62e864b1293d74bc23e4fe7b54746203370 Mon Sep 17 00:00:00 2001 From: jdhao Date: Thu, 12 Nov 2020 21:45:00 +0800 Subject: [PATCH] Move text object to autoload directory --- autoload/text_obj.vim | 54 +++++++++++++++++++++++++++++++++++++++ core/mappings.vim | 59 ++----------------------------------------- 2 files changed, 56 insertions(+), 57 deletions(-) create mode 100644 autoload/text_obj.vim diff --git a/autoload/text_obj.vim b/autoload/text_obj.vim new file mode 100644 index 0000000..ba7c808 --- /dev/null +++ b/autoload/text_obj.vim @@ -0,0 +1,54 @@ +function! text_obj#URL() abort + if match(&runtimepath, 'vim-highlighturl') != -1 + " Note that we use https://github.com/itchyny/vim-highlighturl to get the URL pattern. + let url_pattern = highlighturl#default_pattern() + else + let url_pattern = expand('') + " Since expand('') also works for normal words, we need to check if + " this is really URL using heuristics, e.g., URL length. + if len(url_pattern) <= 10 + return + endif + endif + + " We need to find all possible URL on this line and their start, end idx. + " Then find where current cursor is, and decide if cursor is on one of the + " URLs. + let line_text = getline('.') + let url_infos = [] + + let [_url, _idx_start, _idx_end] = matchstrpos(line_text, url_pattern) + while _url !=# '' + let url_infos += [[_url, _idx_start+1, _idx_end]] + let [_url, _idx_start, _idx_end] = matchstrpos(line_text, url_pattern, _idx_end) + endwhile + + " echo url_infos + " If no URL is found, do nothing. + if len(url_infos) == 0 + return + endif + + let [start_col, end_col] = [-1, -1] + " If URL is found, find if cursor is on it. + let [buf_num, cur_row, cur_col] = getcurpos()[0:2] + for url_info in url_infos + " echo url_info + let [_url, _idx_start, _idx_end] = url_info + if cur_col >= _idx_start && cur_col <= _idx_end + let start_col = _idx_start + let end_col = _idx_end + break + endif + endfor + + " Cursor is not on a URL, do nothing. + if start_col == -1 + return + endif + + " Now set the '< and '> mark + call setpos("'<", [buf_num, cur_row, start_col, 0]) + call setpos("'>", [buf_num, cur_row, end_col, 0]) + normal! gv +endfunction diff --git a/core/mappings.vim b/core/mappings.vim index 81646f7..2aa9723 100644 --- a/core/mappings.vim +++ b/core/mappings.vim @@ -211,61 +211,6 @@ nnoremap l nnoremap k nnoremap j -xnoremap iu :call URLTextObj() -onoremap iu :call URLTextObj() - -function! s:URLTextObj() abort - if match(&runtimepath, 'vim-highlighturl') != -1 - " Note that we use https://github.com/itchyny/vim-highlighturl to get the URL pattern. - let url_pattern = highlighturl#default_pattern() - else - let url_pattern = expand('') - " Since expand('') also works for normal words, we need to check if - " this is really URL using heuristics, e.g., URL length. - if len(url_pattern) <= 10 - return - endif - endif - - " We need to find all possible URL on this line and their start, end idx. - " Then find where current cursor is, and decide if cursor is on one of the - " URLs. - let line_text = getline('.') - let url_infos = [] - - let [_url, _idx_start, _idx_end] = matchstrpos(line_text, url_pattern) - while _url !=# '' - let url_infos += [[_url, _idx_start+1, _idx_end]] - let [_url, _idx_start, _idx_end] = matchstrpos(line_text, url_pattern, _idx_end) - endwhile - - " echo url_infos - " If no URL is found, do nothing. - if len(url_infos) == 0 - return - endif - - let [start_col, end_col] = [-1, -1] - " If URL is found, find if cursor is on it. - let [buf_num, cur_row, cur_col] = getcurpos()[0:2] - for url_info in url_infos - " echo url_info - let [_url, _idx_start, _idx_end] = url_info - if cur_col >= _idx_start && cur_col <= _idx_end - let start_col = _idx_start - let end_col = _idx_end - break - endif - endfor - - " Cursor is not on a URL, do nothing. - if start_col == -1 - return - endif - - " Now set the '< and '> mark - call setpos("'<", [buf_num, cur_row, start_col, 0]) - call setpos("'>", [buf_num, cur_row, end_col, 0]) - normal! gv -endfunction +xnoremap iu :call text_obj#URL() +onoremap iu :call text_obj#URL() "}