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