From 49dcb6a7f25b594429c0737719c264f181be40dd Mon Sep 17 00:00:00 2001 From: Wang Shidong Date: Wed, 4 May 2022 23:21:08 +0800 Subject: [PATCH] fix(vimchat): fix cursor highlight position --- bundle/vim-chat/autoload/chat/gitter.vim | 6 +++--- bundle/vim-chat/autoload/chat/windows.vim | 26 ++++++++++++++++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/bundle/vim-chat/autoload/chat/gitter.vim b/bundle/vim-chat/autoload/chat/gitter.vim index ed3219ed5..e6e740df9 100644 --- a/bundle/vim-chat/autoload/chat/gitter.vim +++ b/bundle/vim-chat/autoload/chat/gitter.vim @@ -25,7 +25,7 @@ function! chat#gitter#enter_room(room) abort return 0 endif call s:fetch(roomid) - let cmd = printf('curl -s -N -H "Accept: application/json" -H "Authorization: Bearer %s" "https://stream.gitter.im/v1/rooms/%s/chatMessages"',g:chat_gitter_token , roomid) + let cmd = printf('curl -s --show-error --fail -N -H "Accept: application/json" -H "Authorization: Bearer %s" "https://stream.gitter.im/v1/rooms/%s/chatMessages"',g:chat_gitter_token , roomid) let jobid = s:JOB.start(cmd, { \ 'on_stdout' : function('s:gitter_stdout'), \ 'on_stderr' : function('s:gitter_stderr'), @@ -113,7 +113,7 @@ let s:fetch_response = {} function! s:fetch(roomid) abort let room = s:roomid_to_room(a:roomid) if !has_key(s:fetch_response, room) - let cmd = printf( 'curl -s -H "Accept: application/json" -H "Authorization: Bearer %s" "https://api.gitter.im/v1/rooms/%s/chatMessages?limit=50"', g:chat_gitter_token, a:roomid) + let cmd = printf( 'curl -s --show-error --fail -H "Accept: application/json" -H "Authorization: Bearer %s" "https://api.gitter.im/v1/rooms/%s/chatMessages?limit=50"', g:chat_gitter_token, a:roomid) let s:fetch_response[room] = { \ 'response' : [], \ 'jobid' : s:JOB.start(cmd, @@ -208,7 +208,7 @@ function! s:get_all_channels() abort \ 'msg' : 'listing gitter channels', \ 'time': strftime("%Y-%m-%d %H:%M"), \ }) - let cmd = printf('curl -s -H "Accept: application/json" -H "Authorization: Bearer %s" "https://api.gitter.im/v1/rooms"', g:chat_gitter_token) + let cmd = printf('curl -s --show-error --fail -H "Accept: application/json" -H "Authorization: Bearer %s" "https://api.gitter.im/v1/rooms"', g:chat_gitter_token) let s:list_all_channels_jobid = s:JOB.start(cmd, { \ 'on_stdout' : function('s:get_all_channels_stdout'), \ 'on_stderr' : function('s:get_all_channels_stderr'), diff --git a/bundle/vim-chat/autoload/chat/windows.vim b/bundle/vim-chat/autoload/chat/windows.vim index 8c6e945e4..eb6fdf554 100644 --- a/bundle/vim-chat/autoload/chat/windows.vim +++ b/bundle/vim-chat/autoload/chat/windows.vim @@ -119,7 +119,7 @@ function! chat#windows#open() abort elseif char ==# "\" || char ==# "\x80\xfd-" let mouse_left_release_lnum = v:mouse_lnum let mouse_left_relsese_col = getmousepos().column - let selected_text = s:high_pso(mouse_left_lnum, mouse_left_col, mouse_left_release_lnum, mouse_left_relsese_col) + let selected_text = s:high_pos(mouse_left_lnum, mouse_left_col, mouse_left_release_lnum, mouse_left_relsese_col) elseif char ==# "\" " copy select text if exists('selected_text') && !empty(selected_text) @@ -267,11 +267,31 @@ function! s:disable_r_mode(timer) abort let s:c_r_mode = 0 endfunction -function! s:high_pso(l, c, rl, rc) abort +function! s:has_conceal(l) abort + return getline(a:l) =~# '**`[^`]*`\*\*' +endfunction + +function! s:get_really_col(c, l) abort + let [str, conceal_begin, conceal_end] = matchstrpos(getline(a:l), '**`[^`]*`\*\*') + if a:c > conceal_end - 6 + return a:c + 6 + elseif a:c > conceal_begin + return a:c + 3 + endif + return a:c +endfunction + +function! s:high_pos(l, c, rl, rc) abort let l = a:l - let rl = a:rl let c = strlen(strpart(getline(l), 0, a:c)) + 1 + if s:has_conceal(l) + let c = s:get_really_col(c, l) + endif + let rl = a:rl let rc = strlen(strpart(getline(rl), 0, a:rc)) + 1 + if s:has_conceal(rl) + let rc = s:get_really_col(rc, rl) + endif call clearmatches() let selected_text = [] if l ==# rl && c == rc