#cargo-build #cargo #neovim #filter #wrapper #dedup #build-time

构建 cargo-limit

减少噪音的 Cargo:跳过警告直到错误被修复,Neovim 集成等

9 个版本

0.0.10 2023 年 1 月 14 日
0.0.9 2021 年 10 月 14 日
0.0.8 2021 年 3 月 22 日
0.0.7 2021 年 2 月 16 日
0.0.2 2020 年 9 月 14 日

87构建工具 中排名

Download history 32/week @ 2024-04-22 34/week @ 2024-04-29 25/week @ 2024-05-06 30/week @ 2024-05-13 41/week @ 2024-05-20 40/week @ 2024-05-27 39/week @ 2024-06-03 25/week @ 2024-06-10 33/week @ 2024-06-17 33/week @ 2024-06-24 34/week @ 2024-07-01 21/week @ 2024-07-08 21/week @ 2024-07-15 28/week @ 2024-07-22 28/week @ 2024-07-29 38/week @ 2024-08-05

117 每月下载量
用于 dawproject-rs

MIT/Apache

76KB
2K SLoC

Rust 1.5K SLoC // 0.0% comments Vim Script 204 SLoC

cargo-limit

Crates.io

🚀 减少噪音的 Cargo

  • 错误具有最高优先级
    • 它们永远不会出现在警告的中间
    • 默认跳过警告,直到错误被修复
    • 默认跳过外部 路径依赖 的警告
  • 所有消息默认按 倒序 显示
    • 以避免额外的滚动
  • 消息按文件名分组
  • 可以限制消息的数量
  • 遇到 第一个错误 后,默认限制剩余的 构建时间
  • 文件可以 自动 在你的文本编辑器中打开受影响的行

此工具与 cargo-watch 结合使用特别有用。

最初这个项目只是针对 这个问题 的一个解决方案。

asciicast

安装

从 crates.io

cargo install cargo-limit

从 git

cargo install --force --git https://github.com/alopatindev/cargo-limit

使用

在你的项目目录中运行以下任意命令

cargo lbench
cargo lbuild
cargo lcheck
cargo lclippy
cargo ldoc
cargo lfix
cargo lrun
cargo lrustc
cargo lrustdoc
cargo ltest

还有 llcheckllrun 等。

💡 环境变量 👁️

CARGO_MSG_LIMIT

  • 限制编译器消息的数量
  • 0 表示无限制,这是默认值

CARGO_TIME_LIMIT

  • 遇到第一个编译错误后,cargo 执行时间限制(以秒为单位)
  • 1 是默认值
  • 0 表示无限制

CARGO_ASC

  • 按升序显示编译器消息
  • false 是默认值

CARGO_FORCE_WARN

  • 即使存在错误也显示警告
  • false 是默认值

CARGO_DEPS_WARN

  • 显示外部路径依赖的警告
  • false 是默认值

CARGO_EDITOR

  • 在外部应用程序中打开受影响的文件
  • 空("")表示不运行外部应用程序
  • "_cargo-limit-open-in-nvim" 是默认设置

文本编辑器/IDE 集成

💡 Neovim 插件 👁️

在您的 init.vim 中启用插件。例如,对于 vim-plug

Plug 'alopatindev/cargo-limit', { 'do': 'cargo install cargo-limit nvim-send' }

然后使用以下命令安装

nvim +PlugInstall +UpdateRemotePlugins +qa

可选:按 F2 保存,再次按 F2 跳转到下一个受影响的行

function! SaveAllFilesOrOpenNextLocation()
  let l:all_files_are_saved = 1
  for i in getbufinfo({'bufmodified': 1})
    if i.name != ''
      let l:all_files_are_saved = 0
      break
    endif
  endfor

  if l:all_files_are_saved
    call g:CargoLimitOpenNextLocation()
  else
    execute 'wa'
  endif
endfunction

nmap <F2> :call SaveAllFilesOrOpenNextLocation()<cr>
vmap <F2> <esc>:call SaveAllFilesOrOpenNextLocation()<cr>v
imap <F2> <esc>:call SaveAllFilesOrOpenNextLocation()<cr>i
💡 测试插件! 👁️

  1. 打开两个终端(或 tmux 窗口等)
  2. 在它们两个中都在 cd your/project/directory
  3. 在其中一个中运行 nvim
  4. 在另一个中运行 cargo lrun
  5. 如果出现编译错误,nvim 将打开新或现有的标签页,显示受影响的行和列上的文件
  6. 修复错误,保存文件,nvim 将跳转到下一个错误位置
  7. cargo llruncargo llcheck 等)在出现警告时也会打开它们。

⚠️ 已知限制! 👁️

1. 自动跳转只有在以下情况下才会工作

  • 当前 模式是正常模式
  • 当前缓冲区是空的或者包含一些现有的未修改的(已保存)文件

这是出于设计,为了 不会干扰 活跃的文本编辑或文件导航过程。

2. 在每次文件保存时的自动跳转目前不够精确

  • 如果它移动了,它可能跳转到错误的行
  • 如果下一行已经打算修改,它可能根本不会跳转

为了精确跳转,请重新运行 cargo ll{check,run,etc.}

3. 在运行 nvim 之前:当前目录应该是项目(子)目录

  • 这是必需的,以便 cargo-limit 能够 确定 应该控制哪个具体的 nvim 实例
  • 只有 第一个具有当前项目(子)目录的 nvim 实例才会被 cargo-limit 控制。

自定义设置

如果您想有其他 Neovim 行为,请在您的 init.vim 中添加一个 自定义打开处理程序

💡 查看示例! 👁️

在缓冲区而不是标签页中打开文件

function! g:CargoLimitOpen(editor_data)
  let l:current_file = resolve(expand('%:p'))
  if l:current_file != '' && !filereadable(l:current_file)
    return
  endif
  for location in reverse(a:editor_data.files)
    let l:path = fnameescape(location.path)
    if mode() == 'n' && &l:modified == 0
      execute 'edit ' . l:path
      call cursor((location.line), (location.column))
    else
      break
    endif
  endfor
endfunction

填充快速修复列表

set errorformat =%f:%l:%c:%m

function! g:CargoLimitOpen(editor_data)
  let l:winnr = winnr()

  cgetexpr []
  for file in a:editor_data['files']
    caddexpr file['path'] . ':' . file['line'] . ':' . file['column'] . ':' . file['message']
  endfor

  if empty(a:editor_data['files'])
    cclose
  else
    copen
  endif

  if l:winnr !=# winnr()
    wincmd p
  endif
endfunction

💡 其他文本编辑器/IDE 👁️

cargo-limit 可以运行外部应用程序/脚本,并以以下 JSON 格式将受影响的地址提供给 stdin

{
  "workspace_root": "/full/path/to/project",
  "files": [
    {
      "path": "/full/path/to/project/file.rs",
      "line": 4,
      "column": 1,
      "message": "unused import: `diagnostic::DiagnosticSpan`",
      "level": "warning"
    }
  ]
}

理论上这可以用于任何文本编辑器或 IDE,特别是如果它支持客户端/服务器通信。为此,您需要一个 包装器应用程序/脚本,该脚本解析 files 并将它们提供给文本编辑器或 IDE 客户端。

💡 示例:Gedit! 👁️

  1. 安装 jq
  2. 创建 open-in-gedit.sh
#!/bin/bash

jq --raw-output '.files |= unique_by(.path) | .files[] | [
    "gedit",
    .path,
    "+" + (.line | tostring) + ":" + (.column | tostring),
    "&"
] | join(" ")' | bash
  1. chmod +x open-in-gedit.sh
  2. 设置环境变量 CARGO_EDITOR=/path/to/open-in-gedit.sh
  3. 在您的项目目录中运行 cargo lrun
  4. 如果在编译过程中出现错误,open-in-gedit.sh 将在受影响的行和列中打开 gedit 文件
  5. cargo llruncargo llcheck 等)在出现警告时也会打开它们。

类似项目

bacon 是一个后台 Rust 代码检查器。

感谢所有贡献者 ❤️

感谢大家的代码贡献和错误报告。特别感谢 Casey Rodarmor 提供的 VimL 代码以快速填充 quickfix 以及 Otavio Salvador 提供的 NixOS 软件包

想要贡献吗?

请查看 问题看板。您还可以为您的操作系统发行版制作一个软件包。

支持

请通过加密货币支持本项目

🪙 比特币 👁️

1Afgvdz1oPaugFcLgDaAzCYYdHexV6tTvH

🪙 波场币 (TRX, USDT-TRC20, 等.) 👁️

TVxE2HyryNyNReMvw9HRQ3BkYePCszXSrc

🪙 以太坊 (ETH, DAI, 等.) 👁️

0xa879cdb1d7d859e6e425f8e50c4ee49f4b3a7b06

许可证

MIT/Apache-2.0

依赖项

~5–12MB
~150K SLoC