Skip to content

Commit e073705

Browse files
authored
Merge pull request #78 from vim-denops/fix-echo
🐛 Fix flush on `echo()` function in `helper` module on Vim
2 parents f956550 + 4cf914e commit e073705

File tree

2 files changed

+39
-50
lines changed

2 files changed

+39
-50
lines changed

denops_std/helper/echo.ts

Lines changed: 3 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import { deferred, Denops } from "../deps.ts";
22
import * as anonymous from "../anonymous/mod.ts";
3-
import { execute } from "./execute.ts";
4-
5-
let defined = false;
3+
import { load } from "./load.ts";
64

75
/**
86
* Echo message as like `echo` on Vim script.
@@ -26,54 +24,9 @@ export function echo(denops: Denops, message: string): Promise<void> {
2624
}
2725

2826
async function echoVim(denops: Denops, message: string): Promise<void> {
27+
await load(denops, new URL("./echo.vim", import.meta.url));
2928
const waiter = deferred<void>();
3029
const id = anonymous.once(denops, () => waiter.resolve())[0];
31-
await define(denops);
32-
await denops.cmd(
33-
`call timer_start(0, { -> s:denops_std_helper_echo(l:message, l:name, l:id) })`,
34-
{
35-
message,
36-
name: denops.name,
37-
id,
38-
},
39-
);
30+
await denops.call("DenopsStdHelperEcho", message, denops.name, id);
4031
await waiter;
4132
}
42-
43-
async function define(denops: Denops): Promise<void> {
44-
if (defined) {
45-
return;
46-
}
47-
await execute(
48-
denops,
49-
`
50-
if exists('s:loaded_denops_std_helper_echo')
51-
return
52-
endif
53-
let s:loaded_denops_std_helper_echo = 1
54-
function! s:denops_std_helper_echo(message, name, id) abort
55-
let info = {}
56-
let info.t = timer_start(0, { -> feedkeys('jk', 'n') })
57-
let info.name = a:name
58-
let info.id = a:id
59-
let info.message = a:message
60-
let info.updatetime = &updatetime
61-
let &updatetime = 1
62-
let s:denops_std_helper_echo_info = info
63-
augroup denops_std_helper_echo
64-
autocmd!
65-
autocmd CursorHold * ++once call s:denops_std_helper_echo_post()
66-
augroup END
67-
endfunction
68-
function! s:denops_std_helper_echo_post() abort
69-
let info = s:denops_std_helper_echo_info
70-
silent! unlet! s:denops_std_helper_echo_info
71-
let &updatetime = info.updatetime
72-
call timer_stop(info.t)
73-
redraw | echo info.message
74-
call denops#request(info.name, info.id, [])
75-
endfunction
76-
`,
77-
);
78-
defined = true;
79-
}

denops_std/helper/echo.vim

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
if exists('g:loaded_denops_std_helper_echo')
2+
finish
3+
endif
4+
let g:loaded_denops_std_helper_echo = 1
5+
6+
" Redraw debounce interval defined in denops.vim
7+
" https://github.com/vim-denops/denops.vim/pull/90
8+
let s:redraw_interval = 10
9+
10+
function! DenopsStdHelperEcho(message, name, id) abort
11+
let info = {}
12+
let info.name = a:name
13+
let info.id = a:id
14+
let info.message = a:message
15+
let info.updatetime = &updatetime
16+
let s:denops_std_helper_echo_info = info
17+
" Wait s:redraw_interval + alpha to avoid debounced
18+
" `redraw` call after RPC. See #77 for details.
19+
" https://github.com/vim-denops/deno-denops-std/issues/77
20+
let &updatetime = float2nr(ceil(s:redraw_interval * 1.5))
21+
" Reset Vim's internal timer for 'updatetime'
22+
call feedkeys('jk', 'n')
23+
augroup denops_std_helper_echo
24+
autocmd!
25+
autocmd CursorHold * ++once call s:denops_std_helper_echo_post()
26+
augroup END
27+
endfunction
28+
29+
function! s:denops_std_helper_echo_post() abort
30+
let info = s:denops_std_helper_echo_info
31+
silent! unlet! s:denops_std_helper_echo_info
32+
let &updatetime = info.updatetime
33+
redraw | echo info.message
34+
call denops#request(info.name, info.id, [])
35+
endfunction
36+

0 commit comments

Comments
 (0)