我在开发中使用 Vim。还使用 :vimgrep 在 Vim 中搜索文件中的文本。但是当 vimgrep 正在搜索时,我无法在 Vim 中执行任何操作,直到它完成为止。
很久以前,我在 Youtube 上看到一个视频,其中你可以在 Vim 内部进行 grep 操作而不会阻塞文本编辑器。可惜现在找不到这个视频了。
如何在 vim 中运行 grep,在缓冲区中显示结果(在 quickfix 或其他程序中),类似于 vimgrep,且不阻塞编辑器?有什么想法吗?
答案1
这是自 vim 8 以来使用的一个好方法异步运行插件运行你的 shell 命令并实时读取 quickfix 窗口中的输出。
一旦安装,grep 就可以用':AsyncRun grep'异步运行。输出显示在 quickfix 窗口中,您可以立即探索匹配输出或在执行时继续在 vim 中工作。
答案2
有几种方法。
最简单的方法是安装插件。例如,http://www.vim.org/scripts/script.php?script_id=3431具有 grep、make 和一些其他命令的内置命令。
另一种方法(如果您了解 Python、Perl、TCL 或类似的东西)是使用支持线程的外部脚本语言,然后使用 Vim 的该语言接口调用它。这可能会变得很复杂,并且依赖于 Vim 是否支持该脚本语言。
最后,内置方法使用 Vim 的“客户端-服务器”功能。其思路是调用外部命令(使用system()
或:!start cmd
),其中cmd
将运行搜索然后回调到 Vim使用--remote-expr
和预定义的文件名。让 Vim 执行的表达式应该是一个函数,它使用:cfile
或类似的方法读取文件以获取搜索结果。请参阅http://vim.wikia.com/wiki/Execute_external_programs_asynchronously_under_Windows#Getting_results_back_into_Vim请参阅此方法的完整示例。我认为在 Linux 上,您可以使用!cmd &
在后台运行命令的方法,而不是!start cmd
Windows 上的方法。
答案3
Dispatch 也是一个很好的异步操作插件:
充分利用 Vim 编译器插件的强大功能,不受同步性的约束。使用多个异步适配器之一(包括 tmux、screen、iTerm、Windows 和无头模式)启动构建和测试套件,作业完成后,将自动加载和解析错误。
答案4
Vim 8 具有原生的异步作业:
Vim 作业以通道开始,您可以使用
job-options
通道将输出重定向到缓冲区。例如:
:let job = job_start('ls -alh', {'out_io': 'buffer', 'out_name': 'mybuffer'})
然后
:sbuf mybuffer
阅读它。
参考:
:h job-start
来源:一个答案来自 Vi 和 Vim StackExchange 网站