Vim Python的buffer.append(line)切换窗口焦点

2 投票
1 回答
778 浏览
提问于 2025-04-15 13:49

我正在尝试通过这段Python代码从一个单独的线程中填充Vim的缓冲区。

python << PYTHON_CODE

import vim
import time

buffer_number = -1
class AppendLineTest( Thread ):
   def run(self):
      buffer = vim.buffers[buffer_number - 1]

      for i in range(10):
         buffer.append('Line number %s' % i)
         time.sleep(1)

PYTHON_CODE

function! s:test()
   split TestBuffer
   exec 'python buffer_number = '.bufnr('%')

   setlocal noswapfile
   setlocal bufhidden=delete
   setlocal buftype=nofile
   setlocal nobuflisted
   setlocal nonumber
   setlocal nowrap
   setlocal nocursorline

   python AppendLineTest().start()
endfunction

command! -nargs=0 PythonAppendTest call s:test()

我不确定从不同的线程访问Vim的缓冲区是否被允许,也想知道有没有安全的方式来处理这个问题。 不过如果是被允许的,我希望在添加行的时候能避免光标跳动。

为了重现这个行为,先把代码保存为某个名字的.vim文件,然后在Vim中打开它。接着

:source %

然后

PythonAppendTest

会有10行被添加到临时缓冲区。只需把光标移回你之前所在的窗口,你就会明白我在说什么。

如果你想知道为什么有人需要从单独的线程向缓冲区添加行,这里有几个例子:

  • unix top
  • unix tail
  • rss
  • email

在你工作的时候,它们会出现在某个预定义的缓冲区里。

提前谢谢你。

1 个回答

2

我觉得Vim对多线程的支持不是很好,除非进行一些修改。关于这个话题的讨论有很多细节,可以在这个链接找到。不过我怀疑你想要的东西并不简单。

撰写回答