如何在 vim 中异步运行 grep?

如何在 vim 中异步运行 grep?

我在开发中使用 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 cmdWindows 上的方法。

答案3

Dispatch 也是一个很好的异步操作插件:

充分利用 Vim 编译器插件的强大功能,不受同步性的约束。使用多个异步适配器之一(包括 tmux、screen、iTerm、Windows 和无头模式)启动构建和测试套件,作业完成后,将自动加载和解析错误。

https://github.com/tpope/vim-dispatch

答案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 网站

相关内容