From 4eca7f97a56113cf180da7579a48d54e4bdbbbb1 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Tue, 2 Jul 2024 19:38:24 -0400 Subject: [PATCH 01/25] Add initial texpresso support --- autoload/vimtex/compiler.vim | 1 + autoload/vimtex/compiler/_template.vim | 4 +- autoload/vimtex/compiler/texpresso.vim | 81 ++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 autoload/vimtex/compiler/texpresso.vim diff --git a/autoload/vimtex/compiler.vim b/autoload/vimtex/compiler.vim index 07207ae78c..85ee901cc7 100644 --- a/autoload/vimtex/compiler.vim +++ b/autoload/vimtex/compiler.vim @@ -343,6 +343,7 @@ function! s:init_compiler(options) abort " {{{1 \ 'latexmk', \ 'latexrun', \ 'tectonic', + \ 'texpresso', \], l:method) < 0 call vimtex#log#error('Error! Invalid compiler method: ' . l:method) let l:method = 'latexmk' diff --git a/autoload/vimtex/compiler/_template.vim b/autoload/vimtex/compiler/_template.vim index f31cf38f28..3c936f728f 100644 --- a/autoload/vimtex/compiler/_template.vim +++ b/autoload/vimtex/compiler/_template.vim @@ -304,7 +304,7 @@ endfunction let s:compiler_jobs = {} function! s:compiler_jobs.exec(cmd) abort dict " {{{1 let l:options = { - \ 'in_io': 'null', + \ 'in_io': 'pipe', \ 'out_io': 'file', \ 'err_io': 'file', \ 'out_name': self.output, @@ -411,7 +411,7 @@ endfunction let s:compiler_nvim = {} function! s:compiler_nvim.exec(cmd) abort dict " {{{1 let l:shell = { - \ 'stdin': 'null', + \ 'stdin': 'pipe', \ 'on_stdout': function('s:callback_nvim_output'), \ 'on_stderr': function('s:callback_nvim_output'), \ 'cwd': self.file_info.root, diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim new file mode 100644 index 0000000000..32371577d8 --- /dev/null +++ b/autoload/vimtex/compiler/texpresso.vim @@ -0,0 +1,81 @@ +" VimTeX - LaTeX plugin for Vim +" +" Maintainer: Karl Yngve LervÄg +" Email: karl.yngve@gmail.com +" + +function! vimtex#compiler#texpresso#init(options) abort " {{{1 + return s:compiler.new(a:options) +endfunction + +" }}}1 + +let s:compiler = vimtex#compiler#_template#new({ + \ 'name' : 'texpresso', + \ 'continuous': 1, + \ 'options' : [ + \ '-json', + \ '-lines' + \ ], + \}) + +function! s:compiler.__check_requirements() abort dict " {{{1 + if !executable('texpresso') + call vimtex#log#warning('texpresso is not executable!') + let self.enabled = v:false + endif +endfunction +" }}}1 + +function! s:compiler.__init() abort dict " {{{1 + autocmd User VimtexEventCompileStarted call s:start_listening() + autocmd User VimtexEventCompileStopped call s:stop_listening() +endfunction +" }}}1 + +function! s:get_buffer_lines(bufnr, start, end) abort " {{{1 + let l:lines = getbufline(a:bufnr, a:start, a:end) + if empty(l:lines) + return '' + else + return join(l:lines, "\n") .. "\n" + endif +endfunction +" }}}1 + +function! s:start_listening() abort " {{{1 + let s:listener_id = listener_add(function('s:listener')) + let l:path = fnamemodify(bufname(), ":p") + " call s:texpresso_theme() + call s:texpresso_send("open", l:path, s:get_buffer_lines("%", 1, '$')) +endfunction +" }}}1 + +function! s:stop_listening() abort " {{{1 + call job_stop(s:listener_id) + unlet s:listener_id +endfunction +" }}}1 + +function! s:listener(bufnr, start, end, added, changes) abort " {{{1 + let l:path = fnamemodify(bufname(a:bufnr), ":p") + call s:texpresso_send("change-lines", l:path, a:start - 1, a:end - a:start, s:get_buffer_lines(a:bufnr, a:start, a:end - 1 + a:added)) +endfunction +" }}}1 + +function! s:texpresso_send(...) abort " {{{1 + if has('nvim') + call chansend(b:vimtex.compiler.job, json_encode(a:000) .. "\n\n") + else + call ch_sendraw(b:vimtex.compiler.job, json_encode(a:000) .. "\n\n") + endif + echom json_encode(a:000) +endfunction +" }}}1 + +function! s:compiler.__build_cmd(passed_options) abort dict " {{{1 + return 'texpresso ' . join(self.options) + \ . ' ' . vimtex#util#shellescape(self.file_info.target_basename) +endfunction + +" }}}1 From d9bc3a33fb3622bdcc6a5f90474395c7305a2da1 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Tue, 2 Jul 2024 22:09:43 -0400 Subject: [PATCH 02/25] Add functions for reload, theme, and synctex --- autoload/vimtex/compiler/texpresso.vim | 43 +++++++++++++++++++++----- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index 32371577d8..3cfece5fc4 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -28,8 +28,13 @@ endfunction " }}}1 function! s:compiler.__init() abort dict " {{{1 - autocmd User VimtexEventCompileStarted call s:start_listening() - autocmd User VimtexEventCompileStopped call s:stop_listening() + augroup vimtex_compiler + autocmd! + autocmd User VimtexEventCompileStarted call s:start_listening() + autocmd User VimtexEventCompileStopped call s:stop_listening() + autocmd CursorMoved call s:texpresso_synctex_forward_hook() + autocmd ColorScheme call s:texpresso_theme() + augroup END endfunction " }}}1 @@ -44,10 +49,14 @@ endfunction " }}}1 function! s:start_listening() abort " {{{1 - let s:listener_id = listener_add(function('s:listener')) - let l:path = fnamemodify(bufname(), ":p") - " call s:texpresso_theme() - call s:texpresso_send("open", l:path, s:get_buffer_lines("%", 1, '$')) + if has('nvim') + " call nvim_buf_attach(0, v:false, { 'on_lines': function('s:on_lines') }) + else + let s:listener_id = listener_add(function('s:listener')) + endif + + call s:texpresso_theme() + call s:texpresso_reload() endfunction " }}}1 @@ -63,13 +72,33 @@ function! s:listener(bufnr, start, end, added, changes) abort " {{{1 endfunction " }}}1 +function! s:texpresso_theme() abort " {{{1 + " let l:colors = hlget('Normal', v:true) + " TODO: Convert colors to rgb tuples + " call s:texpresso_send("theme", [], []) +endfunction +" }}}1 + +function! s:texpresso_reload() abort " {{{1 + let l:path = fnamemodify(bufname(), ":p") + call s:texpresso_send("open", l:path, s:get_buffer_lines("%", 1, '$')) +endfunction +" }}}1 + +function! s:texpresso_synctex_forward_hook() abort "{{{1 + if !b:vimtex.compiler.is_running() | return | endif + let l:path = fnamemodify(bufname(), ":p") + let l:lnum = getpos('.')[1] + call s:texpresso_send("synctex-forward", l:path, l:lnum - 1) +endfunction +" }}}1 + function! s:texpresso_send(...) abort " {{{1 if has('nvim') call chansend(b:vimtex.compiler.job, json_encode(a:000) .. "\n\n") else call ch_sendraw(b:vimtex.compiler.job, json_encode(a:000) .. "\n\n") endif - echom json_encode(a:000) endfunction " }}}1 From 867fc7806bfe323aac7091042a6afb191b0e5e93 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Wed, 3 Jul 2024 10:42:00 -0400 Subject: [PATCH 03/25] Log messages --- autoload/vimtex/compiler/texpresso.vim | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index 3cfece5fc4..2c40cf44b9 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -35,6 +35,7 @@ function! s:compiler.__init() abort dict " {{{1 autocmd CursorMoved call s:texpresso_synctex_forward_hook() autocmd ColorScheme call s:texpresso_theme() augroup END + call add(self.hooks, function('s:texpresso_process_message')) endfunction " }}}1 @@ -107,4 +108,8 @@ function! s:compiler.__build_cmd(passed_options) abort dict " {{{1 \ . ' ' . vimtex#util#shellescape(self.file_info.target_basename) endfunction +function! s:texpresso_process_message(msg) abort " {{{1 + echom a:msg +endfunction +" }}}1 " }}}1 From bd5903f2a5be97d8377b1196f619038350e5ed52 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Wed, 3 Jul 2024 11:22:27 -0400 Subject: [PATCH 04/25] Handle inverse search --- autoload/vimtex/compiler/texpresso.vim | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index 2c40cf44b9..ebd70e7366 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -108,8 +108,28 @@ function! s:compiler.__build_cmd(passed_options) abort dict " {{{1 \ . ' ' . vimtex#util#shellescape(self.file_info.target_basename) endfunction -function! s:texpresso_process_message(msg) abort " {{{1 - echom a:msg +function! s:texpresso_process_message(json) abort " {{{1 + try + let l:msg = json_decode(a:json) + catch /^Vim\%((\a\+)\)\=:E491:/ + " FIXME: hooks receive messages from both stdout and stderr, so + " sometimes parsing can fail. + return + endtry + + if type(l:msg) != v:t_list || empty(l:msg) + return + endif + + echom l:msg + + if l:msg[0] ==# 'synctex' + let l:path = l:msg[1] + let l:lnum = l:msg[2] + call vimtex#view#inverse_search(l:lnum, l:path) + else + " TODO: handle other types of messages + endif endfunction " }}}1 " }}}1 From bc46b7ed907414cfb2db8329d89d072ba6e2daa5 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Wed, 3 Jul 2024 12:07:31 -0400 Subject: [PATCH 05/25] Reorder functions --- autoload/vimtex/compiler/texpresso.vim | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index ebd70e7366..d82189a9d4 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -10,6 +10,7 @@ endfunction " }}}1 + let s:compiler = vimtex#compiler#_template#new({ \ 'name' : 'texpresso', \ 'continuous': 1, @@ -39,6 +40,12 @@ function! s:compiler.__init() abort dict " {{{1 endfunction " }}}1 +function! s:compiler.__build_cmd(passed_options) abort dict " {{{1 + return 'texpresso ' . join(self.options) + \ . ' ' . vimtex#util#shellescape(self.file_info.target_basename) +endfunction +" }}}1 + function! s:get_buffer_lines(bufnr, start, end) abort " {{{1 let l:lines = getbufline(a:bufnr, a:start, a:end) if empty(l:lines) @@ -103,11 +110,6 @@ function! s:texpresso_send(...) abort " {{{1 endfunction " }}}1 -function! s:compiler.__build_cmd(passed_options) abort dict " {{{1 - return 'texpresso ' . join(self.options) - \ . ' ' . vimtex#util#shellescape(self.file_info.target_basename) -endfunction - function! s:texpresso_process_message(json) abort " {{{1 try let l:msg = json_decode(a:json) @@ -127,9 +129,10 @@ function! s:texpresso_process_message(json) abort " {{{1 let l:path = l:msg[1] let l:lnum = l:msg[2] call vimtex#view#inverse_search(l:lnum, l:path) + elseif l:msg[0] ==# 'flush' + elseif l:msg[0] ==# 'flush' else " TODO: handle other types of messages endif endfunction " }}}1 -" }}}1 From c404ab1348446ba4d9204d2ae52726a2f4b69cf5 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Wed, 3 Jul 2024 12:30:05 -0400 Subject: [PATCH 06/25] Fix CursorMoved hook --- autoload/vimtex/compiler/texpresso.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index d82189a9d4..a23f0f15b5 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -33,7 +33,7 @@ function! s:compiler.__init() abort dict " {{{1 autocmd! autocmd User VimtexEventCompileStarted call s:start_listening() autocmd User VimtexEventCompileStopped call s:stop_listening() - autocmd CursorMoved call s:texpresso_synctex_forward_hook() + autocmd CursorMoved call s:texpresso_synctex_forward_hook() autocmd ColorScheme call s:texpresso_theme() augroup END call add(self.hooks, function('s:texpresso_process_message')) @@ -123,7 +123,7 @@ function! s:texpresso_process_message(json) abort " {{{1 return endif - echom l:msg + " echom l:msg if l:msg[0] ==# 'synctex' let l:path = l:msg[1] From 9843fef6570641a65e95d9b232c2eab62a165f98 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Wed, 3 Jul 2024 21:48:20 -0400 Subject: [PATCH 07/25] Add quickfix handling --- autoload/vimtex/compiler/texpresso.vim | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index a23f0f15b5..3f7970b754 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -102,6 +102,7 @@ endfunction " }}}1 function! s:texpresso_send(...) abort " {{{1 + " echom a:000 if has('nvim') call chansend(b:vimtex.compiler.job, json_encode(a:000) .. "\n\n") else @@ -129,7 +130,21 @@ function! s:texpresso_process_message(json) abort " {{{1 let l:path = l:msg[1] let l:lnum = l:msg[2] call vimtex#view#inverse_search(l:lnum, l:path) - elseif l:msg[0] ==# 'flush' + elseif l:msg[0] ==# 'truncate-lines' + let l:name = l:msg[1] + let l:count = l:msg[2] + if name ==# 'out' + " TODO: truncate qf list + call setqflist(getqflist()[:l:count], 'r') + endif + elseif l:msg[0] ==# 'append-lines' + let l:name = l:msg[1] + let l:lines = l:msg[2:] + if name ==# 'out' + " TODO: parse lines and append to qf list + echom l:lines + call setqflist([], 'a', { 'lines': l:lines, 'efm': '%t%*[^:]: %f:%l: %m' }) + endif elseif l:msg[0] ==# 'flush' else " TODO: handle other types of messages From 518cca748c6e1dd36c0e54b201c680e581825e4e Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Thu, 4 Jul 2024 02:06:52 -0400 Subject: [PATCH 08/25] Add initial neovim support --- autoload/vimtex/compiler/texpresso.vim | 39 +++++++++++++++++--------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index 3f7970b754..55c23a57b4 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -58,9 +58,22 @@ endfunction function! s:start_listening() abort " {{{1 if has('nvim') - " call nvim_buf_attach(0, v:false, { 'on_lines': function('s:on_lines') }) + lua << EOF + vim.api.nvim_buf_attach(0, false, { + on_lines = function(e, buf, _tick, first, oldlast, newlast) + local path = vim.api.nvim_buf_get_name(buf) + local count = oldlast - first + local lines = "" + if first < newlast then + lines = table.concat(vim.api.nvim_buf_get_lines(buf, first, newlast, false), "\n") .. "\n" + end + local msg = vim.json.encode({"change-lines", path, first, count, lines}) + vim.fn.chansend(vim.b.vimtex.compiler.job, {msg, ""}) + end + }) +EOF else - let s:listener_id = listener_add(function('s:listener')) + let b:vimtex.compiler.listener_id = listener_add(function(s:compiler.texpresso_listener, [], b:vimtex.compiler)) endif call s:texpresso_theme() @@ -69,14 +82,14 @@ endfunction " }}}1 function! s:stop_listening() abort " {{{1 - call job_stop(s:listener_id) - unlet s:listener_id + call job_stop(b:vimtex.compiler.listener_id) + unlet b:vimtex.compiler.listener_id endfunction " }}}1 -function! s:listener(bufnr, start, end, added, changes) abort " {{{1 +function! s:compiler.texpresso_listener(bufnr, start, end, added, changes) abort dict " {{{1 let l:path = fnamemodify(bufname(a:bufnr), ":p") - call s:texpresso_send("change-lines", l:path, a:start - 1, a:end - a:start, s:get_buffer_lines(a:bufnr, a:start, a:end - 1 + a:added)) + call self.texpresso_send("change-lines", l:path, a:start - 1, a:end - a:start, s:get_buffer_lines(a:bufnr, a:start, a:end - 1 + a:added)) endfunction " }}}1 @@ -89,7 +102,7 @@ endfunction function! s:texpresso_reload() abort " {{{1 let l:path = fnamemodify(bufname(), ":p") - call s:texpresso_send("open", l:path, s:get_buffer_lines("%", 1, '$')) + call b:vimtex.compiler.texpresso_send("open", l:path, s:get_buffer_lines("%", 1, '$')) endfunction " }}}1 @@ -97,16 +110,16 @@ function! s:texpresso_synctex_forward_hook() abort "{{{1 if !b:vimtex.compiler.is_running() | return | endif let l:path = fnamemodify(bufname(), ":p") let l:lnum = getpos('.')[1] - call s:texpresso_send("synctex-forward", l:path, l:lnum - 1) + call b:vimtex.compiler.texpresso_send("synctex-forward", l:path, l:lnum - 1) endfunction " }}}1 -function! s:texpresso_send(...) abort " {{{1 - " echom a:000 +function! s:compiler.texpresso_send(...) abort dict " {{{1 + if !self.is_running() | return | endif if has('nvim') - call chansend(b:vimtex.compiler.job, json_encode(a:000) .. "\n\n") + call chansend(self.job, json_encode(a:000) .. "\n\n") else - call ch_sendraw(b:vimtex.compiler.job, json_encode(a:000) .. "\n\n") + call ch_sendraw(self.job, json_encode(a:000) .. "\n\n") endif endfunction " }}}1 @@ -114,7 +127,7 @@ endfunction function! s:texpresso_process_message(json) abort " {{{1 try let l:msg = json_decode(a:json) - catch /^Vim\%((\a\+)\)\=:E491:/ + catch " FIXME: hooks receive messages from both stdout and stderr, so " sometimes parsing can fail. return From 99350e6de7400501cda388c9dcb7da9a60081e91 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Thu, 4 Jul 2024 14:56:17 -0400 Subject: [PATCH 09/25] Use buffer-local autocmds --- autoload/vimtex/compiler/texpresso.vim | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index 55c23a57b4..287488a4a5 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -10,7 +10,6 @@ endfunction " }}}1 - let s:compiler = vimtex#compiler#_template#new({ \ 'name' : 'texpresso', \ 'continuous': 1, @@ -30,11 +29,11 @@ endfunction function! s:compiler.__init() abort dict " {{{1 augroup vimtex_compiler - autocmd! - autocmd User VimtexEventCompileStarted call s:start_listening() - autocmd User VimtexEventCompileStopped call s:stop_listening() + autocmd! * + autocmd User VimtexEventCompileStarted call s:start_listening() + autocmd User VimtexEventCompileStopped call s:stop_listening() autocmd CursorMoved call s:texpresso_synctex_forward_hook() - autocmd ColorScheme call s:texpresso_theme() + autocmd ColorScheme call s:texpresso_theme() augroup END call add(self.hooks, function('s:texpresso_process_message')) endfunction @@ -58,20 +57,21 @@ endfunction function! s:start_listening() abort " {{{1 if has('nvim') - lua << EOF - vim.api.nvim_buf_attach(0, false, { - on_lines = function(e, buf, _tick, first, oldlast, newlast) - local path = vim.api.nvim_buf_get_name(buf) - local count = oldlast - first - local lines = "" - if first < newlast then - lines = table.concat(vim.api.nvim_buf_get_lines(buf, first, newlast, false), "\n") .. "\n" + " TODO: return true to stop subscribing + lua << trim EOF + vim.api.nvim_buf_attach(0, false, { + on_lines = function(e, buf, _tick, first, oldlast, newlast) + local path = vim.api.nvim_buf_get_name(buf) + local count = oldlast - first + local lines = "" + if first < newlast then + lines = table.concat(vim.api.nvim_buf_get_lines(buf, first, newlast, false), "\n") .. "\n" + end + local msg = vim.json.encode({"change-lines", path, first, count, lines}) + vim.fn.chansend(vim.b.vimtex.compiler.job, {msg, ""}) end - local msg = vim.json.encode({"change-lines", path, first, count, lines}) - vim.fn.chansend(vim.b.vimtex.compiler.job, {msg, ""}) - end - }) -EOF + }) + EOF else let b:vimtex.compiler.listener_id = listener_add(function(s:compiler.texpresso_listener, [], b:vimtex.compiler)) endif From 649fca7813432f73cb5582c2a35a2d6ee486a52d Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Thu, 4 Jul 2024 23:12:48 -0400 Subject: [PATCH 10/25] Only send 1 NL --- autoload/vimtex/compiler/texpresso.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index 287488a4a5..a0ee633e67 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -117,9 +117,9 @@ endfunction function! s:compiler.texpresso_send(...) abort dict " {{{1 if !self.is_running() | return | endif if has('nvim') - call chansend(self.job, json_encode(a:000) .. "\n\n") + call chansend(self.job, json_encode(a:000) .. "\n") else - call ch_sendraw(self.job, json_encode(a:000) .. "\n\n") + call ch_sendraw(self.job, json_encode(a:000) .. "\n") endif endfunction " }}}1 From 8e2a85416a14fcd1cf98aa434584296a8a15c94d Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Fri, 5 Jul 2024 13:22:13 -0400 Subject: [PATCH 11/25] Use inheritance --- autoload/vimtex/compiler/texpresso.vim | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index a0ee633e67..48cbd6a992 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -28,14 +28,15 @@ endfunction " }}}1 function! s:compiler.__init() abort dict " {{{1 + let self.start = function('s:start', [self.start]) + let self.stop = function('s:stop', [self.stop]) + call add(self.hooks, function('s:texpresso_process_message')) + augroup vimtex_compiler autocmd! * - autocmd User VimtexEventCompileStarted call s:start_listening() - autocmd User VimtexEventCompileStopped call s:stop_listening() autocmd CursorMoved call s:texpresso_synctex_forward_hook() autocmd ColorScheme call s:texpresso_theme() augroup END - call add(self.hooks, function('s:texpresso_process_message')) endfunction " }}}1 @@ -55,7 +56,9 @@ function! s:get_buffer_lines(bufnr, start, end) abort " {{{1 endfunction " }}}1 -function! s:start_listening() abort " {{{1 +function! s:start(super, ...) abort dict " {{{1 + call call(a:super, a:000, self) + if has('nvim') " TODO: return true to stop subscribing lua << trim EOF @@ -73,7 +76,7 @@ function! s:start_listening() abort " {{{1 }) EOF else - let b:vimtex.compiler.listener_id = listener_add(function(s:compiler.texpresso_listener, [], b:vimtex.compiler)) + let self.listener_id = listener_add(function(self.texpresso_listener, [], self)) endif call s:texpresso_theme() @@ -81,9 +84,12 @@ function! s:start_listening() abort " {{{1 endfunction " }}}1 -function! s:stop_listening() abort " {{{1 - call job_stop(b:vimtex.compiler.listener_id) - unlet b:vimtex.compiler.listener_id +function! s:stop(super, ...) abort dict " {{{1 + call call(a:super, a:000, self) + if !has('nvim') + call listener_remove(self.listener_id) + unlet self.listener_id + endif endfunction " }}}1 From b193e458f589de5cf6529231d4099be4999366eb Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Fri, 5 Jul 2024 13:45:47 -0400 Subject: [PATCH 12/25] return true to detach from buf_attach --- autoload/vimtex/compiler/texpresso.vim | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index 48cbd6a992..75e481c016 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -60,10 +60,13 @@ function! s:start(super, ...) abort dict " {{{1 call call(a:super, a:000, self) if has('nvim') - " TODO: return true to stop subscribing lua << trim EOF vim.api.nvim_buf_attach(0, false, { on_lines = function(e, buf, _tick, first, oldlast, newlast) + local job = vim.b[buf].vimtex.compiler.job + if vim.fn.jobwait({job}, 0)[1] ~= -1 then + return true + end local path = vim.api.nvim_buf_get_name(buf) local count = oldlast - first local lines = "" @@ -71,7 +74,7 @@ function! s:start(super, ...) abort dict " {{{1 lines = table.concat(vim.api.nvim_buf_get_lines(buf, first, newlast, false), "\n") .. "\n" end local msg = vim.json.encode({"change-lines", path, first, count, lines}) - vim.fn.chansend(vim.b.vimtex.compiler.job, {msg, ""}) + vim.fn.chansend(job, {msg, ""}) end }) EOF From c4d65ea14afa8664b5df437b6080c0bd5b76df62 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Fri, 5 Jul 2024 14:37:30 -0400 Subject: [PATCH 13/25] Use more OOP --- autoload/vimtex/compiler/texpresso.vim | 39 +++++++++++++------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index 75e481c016..d378795251 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -28,15 +28,9 @@ endfunction " }}}1 function! s:compiler.__init() abort dict " {{{1 - let self.start = function('s:start', [self.start]) - let self.stop = function('s:stop', [self.stop]) + let self.start = function('s:compiler_start', [self.start]) + let self.stop = function('s:compiler_stop', [self.stop]) call add(self.hooks, function('s:texpresso_process_message')) - - augroup vimtex_compiler - autocmd! * - autocmd CursorMoved call s:texpresso_synctex_forward_hook() - autocmd ColorScheme call s:texpresso_theme() - augroup END endfunction " }}}1 @@ -56,9 +50,15 @@ function! s:get_buffer_lines(bufnr, start, end) abort " {{{1 endfunction " }}}1 -function! s:start(super, ...) abort dict " {{{1 +function! s:compiler_start(super, ...) abort dict " {{{1 call call(a:super, a:000, self) + augroup vimtex_compiler + autocmd! * + autocmd CursorMoved call b:vimtex.compiler.texpresso_synctex_forward() + autocmd ColorScheme call b:vimtex.compiler.texpresso_theme() + augroup END + if has('nvim') lua << trim EOF vim.api.nvim_buf_attach(0, false, { @@ -82,17 +82,19 @@ function! s:start(super, ...) abort dict " {{{1 let self.listener_id = listener_add(function(self.texpresso_listener, [], self)) endif - call s:texpresso_theme() - call s:texpresso_reload() + call self.texpresso_theme() + call self.texpresso_reload() endfunction " }}}1 -function! s:stop(super, ...) abort dict " {{{1 +function! s:compiler_stop(super, ...) abort dict " {{{1 call call(a:super, a:000, self) if !has('nvim') call listener_remove(self.listener_id) unlet self.listener_id endif + + autocmd! vimtex_compiler * endfunction " }}}1 @@ -102,24 +104,23 @@ function! s:compiler.texpresso_listener(bufnr, start, end, added, changes) abort endfunction " }}}1 -function! s:texpresso_theme() abort " {{{1 +function! s:compiler.texpresso_theme() abort dict " {{{1 " let l:colors = hlget('Normal', v:true) " TODO: Convert colors to rgb tuples - " call s:texpresso_send("theme", [], []) + " call self.texpresso_send("theme", [], []) endfunction " }}}1 -function! s:texpresso_reload() abort " {{{1 +function! s:compiler.texpresso_reload() abort dict " {{{1 let l:path = fnamemodify(bufname(), ":p") - call b:vimtex.compiler.texpresso_send("open", l:path, s:get_buffer_lines("%", 1, '$')) + call self.texpresso_send("open", l:path, s:get_buffer_lines("%", 1, '$')) endfunction " }}}1 -function! s:texpresso_synctex_forward_hook() abort "{{{1 - if !b:vimtex.compiler.is_running() | return | endif +function! s:compiler.texpresso_synctex_forward() abort dict "{{{1 let l:path = fnamemodify(bufname(), ":p") let l:lnum = getpos('.')[1] - call b:vimtex.compiler.texpresso_send("synctex-forward", l:path, l:lnum - 1) + call self.texpresso_send("synctex-forward", l:path, l:lnum - 1) endfunction " }}}1 From edfb85e8433229e9780506e098d112e9f21a967e Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Fri, 5 Jul 2024 14:38:21 -0400 Subject: [PATCH 14/25] Change augroup name to vimtex_compiler_texpresso --- autoload/vimtex/compiler/texpresso.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index d378795251..e3646815dc 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -53,7 +53,7 @@ endfunction function! s:compiler_start(super, ...) abort dict " {{{1 call call(a:super, a:000, self) - augroup vimtex_compiler + augroup vimtex_compiler_texpresso autocmd! * autocmd CursorMoved call b:vimtex.compiler.texpresso_synctex_forward() autocmd ColorScheme call b:vimtex.compiler.texpresso_theme() @@ -94,7 +94,7 @@ function! s:compiler_stop(super, ...) abort dict " {{{1 unlet self.listener_id endif - autocmd! vimtex_compiler * + autocmd! vimtex_compiler_texpresso * endfunction " }}}1 From 579040fa69efccc4d884fe6c386d01194eec9616 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Fri, 5 Jul 2024 16:26:21 -0400 Subject: [PATCH 15/25] Use closure to detach nvim listener --- autoload/vimtex/compiler/texpresso.vim | 48 ++++++++++++++++---------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index e3646815dc..a8036169dc 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -50,6 +50,30 @@ function! s:get_buffer_lines(bufnr, start, end) abort " {{{1 endfunction " }}}1 + +if has('nvim') + let s:nvim_attach = luaeval(' + \ function() + \ local stopped = false + \ vim.api.nvim_buf_attach(0, false, { + \ on_lines = function(e, buf, _tick, first, oldlast, newlast) + \ if stopped then + \ return true + \ end + \ local path = vim.api.nvim_buf_get_name(buf) + \ local count = oldlast - first + \ local lines = "" + \ if first < newlast then + \ lines = table.concat(vim.api.nvim_buf_get_lines(buf, first, newlast, false), "\n") .. "\n" + \ end + \ local msg = vim.json.encode({"change-lines", path, first, count, lines}) + \ vim.fn.chansend(vim.b[buf].vimtex.compiler.job, {msg, ""}) + \ end + \ }) + \ return function() stopped = true end + \ end') +endif + function! s:compiler_start(super, ...) abort dict " {{{1 call call(a:super, a:000, self) @@ -60,24 +84,7 @@ function! s:compiler_start(super, ...) abort dict " {{{1 augroup END if has('nvim') - lua << trim EOF - vim.api.nvim_buf_attach(0, false, { - on_lines = function(e, buf, _tick, first, oldlast, newlast) - local job = vim.b[buf].vimtex.compiler.job - if vim.fn.jobwait({job}, 0)[1] ~= -1 then - return true - end - local path = vim.api.nvim_buf_get_name(buf) - local count = oldlast - first - local lines = "" - if first < newlast then - lines = table.concat(vim.api.nvim_buf_get_lines(buf, first, newlast, false), "\n") .. "\n" - end - local msg = vim.json.encode({"change-lines", path, first, count, lines}) - vim.fn.chansend(job, {msg, ""}) - end - }) - EOF + let self.nvim_detach = s:nvim_attach() else let self.listener_id = listener_add(function(self.texpresso_listener, [], self)) endif @@ -89,7 +96,10 @@ endfunction function! s:compiler_stop(super, ...) abort dict " {{{1 call call(a:super, a:000, self) - if !has('nvim') + if has('nvim') + call self.nvim_detach() + unlet self.nvim_detach() + else call listener_remove(self.listener_id) unlet self.listener_id endif From b2ac9774faf524e65b9102899ba26c857c7ec422 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Fri, 5 Jul 2024 20:17:06 -0400 Subject: [PATCH 16/25] Add theme syncing --- autoload/vimtex/compiler/texpresso.vim | 74 ++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index a8036169dc..03a1d930ab 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -115,9 +115,15 @@ endfunction " }}}1 function! s:compiler.texpresso_theme() abort dict " {{{1 - " let l:colors = hlget('Normal', v:true) - " TODO: Convert colors to rgb tuples - " call self.texpresso_send("theme", [], []) + let l:normal_id = synIDtrans(hlID('Normal')) + let l:fg = synIDattr(l:normal_id, 'fg#') + let l:bg = synIDattr(l:normal_id, 'bg#') + + if l:fg ==# '' || l:bg ==# '' + return + endif + + call self.texpresso_send("theme", s:convert_color(l:bg), s:convert_color(l:fg)) endfunction " }}}1 @@ -184,3 +190,65 @@ function! s:texpresso_process_message(json) abort " {{{1 endif endfunction " }}}1 + +function s:convert_color(color) + let l:color = get(s:to_HEX, a:color, a:color) + let l:r = str2nr(l:color[1:2], 16) + let l:g = str2nr(l:color[3:4], 16) + let l:b = str2nr(l:color[5:6], 16) + return [l:r / 255.0, l:g / 255.0, l:b / 255.0] +endfunction + +let s:to_HEX = { + \ '00': '#000000', '01': '#800000', '02': '#008000', '03': '#808000', '04': '#000080', + \ '05': '#800080', '06': '#008080', '07': '#c0c0c0', '08': '#808080', '09': '#ff0000', + \ '10': '#00ff00', '11': '#ffff00', '12': '#0000ff', '13': '#ff00ff', '14': '#00ffff', + \ '15': '#ffffff', '16': '#000000', '17': '#00005f', '18': '#000087', '19': '#0000af', + \ '20': '#0000d7', '21': '#0000ff', '22': '#005f00', '23': '#005f5f', '24': '#005f87', + \ '25': '#005faf', '26': '#005fd7', '27': '#005fff', '28': '#008700', '29': '#00875f', + \ '30': '#008787', '31': '#0087af', '32': '#0087d7', '33': '#0087ff', '34': '#00af00', + \ '35': '#00af5f', '36': '#00af87', '37': '#00afaf', '38': '#00afd7', '39': '#00afff', + \ '40': '#00d700', '41': '#00d75f', '42': '#00d787', '43': '#00d7af', '44': '#00d7d7', + \ '45': '#00d7ff', '46': '#00ff00', '47': '#00ff5f', '48': '#00ff87', '49': '#00ffaf', + \ '50': '#00ffd7', '51': '#00ffff', '52': '#5f0000', '53': '#5f005f', '54': '#5f0087', + \ '55': '#5f00af', '56': '#5f00d7', '57': '#5f00ff', '58': '#5f5f00', '59': '#5f5f5f', + \ '60': '#5f5f87', '61': '#5f5faf', '62': '#5f5fd7', '63': '#5f5fff', '64': '#5f8700', + \ '65': '#5f875f', '66': '#5f8787', '67': '#5f87af', '68': '#5f87d7', '69': '#5f87ff', + \ '70': '#5faf00', '71': '#5faf5f', '72': '#5faf87', '73': '#5fafaf', '74': '#5fafd7', + \ '75': '#5fafff', '76': '#5fd700', '77': '#5fd75f', '78': '#5fd787', '79': '#5fd7af', + \ '80': '#5fd7d7', '81': '#5fd7ff', '82': '#5fff00', '83': '#5fff5f', '84': '#5fff87', + \ '85': '#5fffaf', '86': '#5fffd7', '87': '#5fffff', '88': '#870000', '89': '#87005f', + \ '90': '#870087', '91': '#8700af', '92': '#8700d7', '93': '#8700ff', '94': '#875f00', + \ '95': '#875f5f', '96': '#875f87', '97': '#875faf', '98': '#875fd7', '99': '#875fff', + \ '100': '#878700', '101': '#87875f', '102': '#878787', '103': '#8787af', '104': '#8787d7', + \ '105': '#8787ff', '106': '#87af00', '107': '#87af5f', '108': '#87af87', '109': '#87afaf', + \ '110': '#87afd7', '111': '#87afff', '112': '#87d700', '113': '#87d75f', '114': '#87d787', + \ '115': '#87d7af', '116': '#87d7d7', '117': '#87d7ff', '118': '#87ff00', '119': '#87ff5f', + \ '120': '#87ff87', '121': '#87ffaf', '122': '#87ffd7', '123': '#87ffff', '124': '#af0000', + \ '125': '#af005f', '126': '#af0087', '127': '#af00af', '128': '#af00d7', '129': '#af00ff', + \ '130': '#af5f00', '131': '#af5f5f', '132': '#af5f87', '133': '#af5faf', '134': '#af5fd7', + \ '135': '#af5fff', '136': '#af8700', '137': '#af875f', '138': '#af8787', '139': '#af87af', + \ '140': '#af87d7', '141': '#af87ff', '142': '#afaf00', '143': '#afaf5f', '144': '#afaf87', + \ '145': '#afafaf', '146': '#afafd7', '147': '#afafff', '148': '#afd700', '149': '#afd75f', + \ '150': '#afd787', '151': '#afd7af', '152': '#afd7d7', '153': '#afd7ff', '154': '#afff00', + \ '155': '#afff5f', '156': '#afff87', '157': '#afffaf', '158': '#afffd7', '159': '#afffff', + \ '160': '#d70000', '161': '#d7005f', '162': '#d70087', '163': '#d700af', '164': '#d700d7', + \ '165': '#d700ff', '166': '#d75f00', '167': '#d75f5f', '168': '#d75f87', '169': '#d75faf', + \ '170': '#d75fd7', '171': '#d75fff', '172': '#d78700', '173': '#d7875f', '174': '#d78787', + \ '175': '#d787af', '176': '#d787d7', '177': '#d787ff', '178': '#d7af00', '179': '#d7af5f', + \ '180': '#d7af87', '181': '#d7afaf', '182': '#d7afd7', '183': '#d7afff', '184': '#d7d700', + \ '185': '#d7d75f', '186': '#d7d787', '187': '#d7d7af', '188': '#d7d7d7', '189': '#d7d7ff', + \ '190': '#d7ff00', '191': '#d7ff5f', '192': '#d7ff87', '193': '#d7ffaf', '194': '#d7ffd7', + \ '195': '#d7ffff', '196': '#ff0000', '197': '#ff005f', '198': '#ff0087', '199': '#ff00af', + \ '200': '#ff00d7', '201': '#ff00ff', '202': '#ff5f00', '203': '#ff5f5f', '204': '#ff5f87', + \ '205': '#ff5faf', '206': '#ff5fd7', '207': '#ff5fff', '208': '#ff8700', '209': '#ff875f', + \ '210': '#ff8787', '211': '#ff87af', '212': '#ff87d7', '213': '#ff87ff', '214': '#ffaf00', + \ '215': '#ffaf5f', '216': '#ffaf87', '217': '#ffafaf', '218': '#ffafd7', '219': '#ffafff', + \ '220': '#ffd700', '221': '#ffd75f', '222': '#ffd787', '223': '#ffd7af', '224': '#ffd7d7', + \ '225': '#ffd7ff', '226': '#ffff00', '227': '#ffff5f', '228': '#ffff87', '229': '#ffffaf', + \ '230': '#ffffd7', '231': '#ffffff', '232': '#080808', '233': '#121212', '234': '#1c1c1c', + \ '235': '#262626', '236': '#303030', '237': '#3a3a3a', '238': '#444444', '239': '#4e4e4e', + \ '240': '#585858', '241': '#626262', '242': '#6c6c6c', '243': '#767676', '244': '#808080', + \ '245': '#8a8a8a', '246': '#949494', '247': '#9e9e9e', '248': '#a8a8a8', '249': '#b2b2b2', + \ '250': '#bcbcbc', '251': '#c6c6c6', '252': '#d0d0d0', '253': '#dadada', '254': '#e4e4e4', + \ '255': '#eeeeee' } From 8b836814794017f630be15f53c3ea178c58877b6 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Fri, 5 Jul 2024 20:49:13 -0400 Subject: [PATCH 17/25] Add join_lines function --- autoload/vimtex/compiler/texpresso.vim | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index 03a1d930ab..f67e9c9383 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -40,17 +40,6 @@ function! s:compiler.__build_cmd(passed_options) abort dict " {{{1 endfunction " }}}1 -function! s:get_buffer_lines(bufnr, start, end) abort " {{{1 - let l:lines = getbufline(a:bufnr, a:start, a:end) - if empty(l:lines) - return '' - else - return join(l:lines, "\n") .. "\n" - endif -endfunction -" }}}1 - - if has('nvim') let s:nvim_attach = luaeval(' \ function() @@ -110,7 +99,8 @@ endfunction function! s:compiler.texpresso_listener(bufnr, start, end, added, changes) abort dict " {{{1 let l:path = fnamemodify(bufname(a:bufnr), ":p") - call self.texpresso_send("change-lines", l:path, a:start - 1, a:end - a:start, s:get_buffer_lines(a:bufnr, a:start, a:end - 1 + a:added)) + let l:lines = getbufline(a:bufnr, a:start, a:end - 1 + a:added) + call self.texpresso_send("change-lines", l:path, a:start - 1, a:end - a:start, s:join_lines(l:lines)) endfunction " }}}1 @@ -129,7 +119,7 @@ endfunction function! s:compiler.texpresso_reload() abort dict " {{{1 let l:path = fnamemodify(bufname(), ":p") - call self.texpresso_send("open", l:path, s:get_buffer_lines("%", 1, '$')) + call self.texpresso_send("open", l:path, s:join_lines(getline(1, '$'))) endfunction " }}}1 @@ -189,9 +179,16 @@ function! s:texpresso_process_message(json) abort " {{{1 " TODO: handle other types of messages endif endfunction + +" }}}1 + +function s:join_lines(lines) " {{{1 + return a:lines == [] ? '' : join(a:lines, "\n") .. "\n" +endfunction + " }}}1 -function s:convert_color(color) +function s:convert_color(color) abort " {{{1 let l:color = get(s:to_HEX, a:color, a:color) let l:r = str2nr(l:color[1:2], 16) let l:g = str2nr(l:color[3:4], 16) @@ -199,6 +196,9 @@ function s:convert_color(color) return [l:r / 255.0, l:g / 255.0, l:b / 255.0] endfunction +" }}}1 + + let s:to_HEX = { \ '00': '#000000', '01': '#800000', '02': '#008000', '03': '#808000', '04': '#000080', \ '05': '#800080', '06': '#008080', '07': '#c0c0c0', '08': '#808080', '09': '#ff0000', From e467d3f483fd83bb8b108a923d091ecee72dfb6e Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Fri, 5 Jul 2024 21:43:11 -0400 Subject: [PATCH 18/25] Cleanup --- autoload/vimtex/compiler/texpresso.vim | 3 --- 1 file changed, 3 deletions(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index f67e9c9383..a7fad4efd7 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -163,15 +163,12 @@ function! s:texpresso_process_message(json) abort " {{{1 let l:name = l:msg[1] let l:count = l:msg[2] if name ==# 'out' - " TODO: truncate qf list call setqflist(getqflist()[:l:count], 'r') endif elseif l:msg[0] ==# 'append-lines' let l:name = l:msg[1] let l:lines = l:msg[2:] if name ==# 'out' - " TODO: parse lines and append to qf list - echom l:lines call setqflist([], 'a', { 'lines': l:lines, 'efm': '%t%*[^:]: %f:%l: %m' }) endif elseif l:msg[0] ==# 'flush' From 8342829ef360eee618b11218fbc1fc032d1c455b Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Fri, 5 Jul 2024 21:46:31 -0400 Subject: [PATCH 19/25] Fix qf truncate --- autoload/vimtex/compiler/texpresso.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index a7fad4efd7..5f60dac63e 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -163,7 +163,7 @@ function! s:texpresso_process_message(json) abort " {{{1 let l:name = l:msg[1] let l:count = l:msg[2] if name ==# 'out' - call setqflist(getqflist()[:l:count], 'r') + call setqflist(slice(getqflist(), 0, l:count), 'r') endif elseif l:msg[0] ==# 'append-lines' let l:name = l:msg[1] From 1da704845abac37c65cfffae89e711f7605f9a23 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Sat, 6 Jul 2024 22:38:55 -0400 Subject: [PATCH 20/25] Only send synctex-forward when line number changes --- autoload/vimtex/compiler/texpresso.vim | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index 5f60dac63e..69abf7dcc9 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -126,6 +126,10 @@ endfunction function! s:compiler.texpresso_synctex_forward() abort dict "{{{1 let l:path = fnamemodify(bufname(), ":p") let l:lnum = getpos('.')[1] + if get(self, 'texpresso_synctex_forward_previous', v:null) == [l:path, l:lnum] + return + endif + let self.texpresso_synctex_forward_previous = [l:path, l:lnum] call self.texpresso_send("synctex-forward", l:path, l:lnum - 1) endfunction " }}}1 From af1726ca3c6831c1a7e37298a80551ff60e5dc79 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Sun, 7 Jul 2024 07:52:13 -0400 Subject: [PATCH 21/25] Add abort to function declarations --- autoload/vimtex/compiler/texpresso.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index 69abf7dcc9..65ead67b68 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -183,7 +183,7 @@ endfunction " }}}1 -function s:join_lines(lines) " {{{1 +function s:join_lines(lines) abort " {{{1 return a:lines == [] ? '' : join(a:lines, "\n") .. "\n" endfunction From 714ce2cba20a68a3e42aec8bf2ca9c7711e94a3b Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Sun, 7 Jul 2024 09:52:13 -0400 Subject: [PATCH 22/25] Fix wrong line number in texpresso_synctex_forward --- autoload/vimtex/compiler/texpresso.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index 65ead67b68..05da97622c 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -130,7 +130,7 @@ function! s:compiler.texpresso_synctex_forward() abort dict "{{{1 return endif let self.texpresso_synctex_forward_previous = [l:path, l:lnum] - call self.texpresso_send("synctex-forward", l:path, l:lnum - 1) + call self.texpresso_send("synctex-forward", l:path, l:lnum) endfunction " }}}1 From 9a971bb965d31fd459083d7182709ab7c5459c1f Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:52:46 -0400 Subject: [PATCH 23/25] Add next_page and previous_page methods --- autoload/vimtex/compiler/texpresso.vim | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index 05da97622c..7be00f8b81 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -134,6 +134,16 @@ function! s:compiler.texpresso_synctex_forward() abort dict "{{{1 endfunction " }}}1 +function! s:compiler.texpresso_previous_page() abort dict "{{{1 + call self.texpresso_send("previous-page") +endfunction +"}}}1 + +function! s:compiler.texpresso_next_page() abort dict "{{{1 + call self.texpresso_send("next-page") +endfunction +"}}}1 + function! s:compiler.texpresso_send(...) abort dict " {{{1 if !self.is_running() | return | endif if has('nvim') From b0c8ce385a35d5322d4045ce88e0ed2b366e8ce5 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Sun, 7 Jul 2024 11:07:44 -0400 Subject: [PATCH 24/25] Fix typo --- autoload/vimtex/compiler/texpresso.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index 7be00f8b81..38ea1ac805 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -87,7 +87,7 @@ function! s:compiler_stop(super, ...) abort dict " {{{1 call call(a:super, a:000, self) if has('nvim') call self.nvim_detach() - unlet self.nvim_detach() + unlet self.nvim_detach else call listener_remove(self.listener_id) unlet self.listener_id From 4a85174e24bffc221486a5ff51db6d5140b47ab8 Mon Sep 17 00:00:00 2001 From: Tsung-Ju Chiang <71379180+tsung-ju@users.noreply.github.com> Date: Sun, 7 Jul 2024 11:07:54 -0400 Subject: [PATCH 25/25] Fix list comparison error --- autoload/vimtex/compiler/texpresso.vim | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/autoload/vimtex/compiler/texpresso.vim b/autoload/vimtex/compiler/texpresso.vim index 38ea1ac805..a9b0fea8fe 100644 --- a/autoload/vimtex/compiler/texpresso.vim +++ b/autoload/vimtex/compiler/texpresso.vim @@ -126,7 +126,8 @@ endfunction function! s:compiler.texpresso_synctex_forward() abort dict "{{{1 let l:path = fnamemodify(bufname(), ":p") let l:lnum = getpos('.')[1] - if get(self, 'texpresso_synctex_forward_previous', v:null) == [l:path, l:lnum] + let l:prev_key = 'texpresso_synctex_forward_previous' + if has_key(self, l:prev_key) && self[l:prev_key] == [l:path, l:lnum] return endif let self.texpresso_synctex_forward_previous = [l:path, l:lnum]