π Cargo with less noise:
- errors have highest priority
- they never appear in the middle of warnings
- warnings are skipped by default until errors are fixed
- external path dependencies' warnings are skipped by default
- all messages come in reversed order by default
- to avoid extra scrolling
- messages are grouped by filenames
- number of messages can be limited
- after encountering first error the rest of build time is limited by default
- files can be automatically opened in your text editor on affected lines
Initially this project was a workaround for this issue, which was closed with no adequate solution.
Check out roadmap, issues and ποΈ Rustacean Station podcast episode for more.
cargo install --locked cargo-limit
cargo install --locked --force --git https://github.com/cargo-limit/cargo-limit
Run any of these in your project directory:
cargo lbench
cargo lbuild
cargo lcheck
cargo lclippy
cargo ldoc
cargo lfix
cargo lrun
cargo lrustc
cargo lrustdoc
cargo ltest
Also llcheck
, llrun
, etc. to auto-open text editor for warnings as well, not just for errors.
This tool is especially useful in combination with cargo-watch.
π‘ Environment Variables ποΈ
- limit compiler messages number
0
means no limit, which is default
cargo
execution time limit in seconds after encountering first compiling error1
is default0
means no limit
- show compiler messages in ascending order
false
is default
- show warnings even if errors still exist
false
is default
- show external path dependencies' warnings
false
is default
- opens affected files in external app
- empty (
""
) means don't run external app "_cargo-limit-open-in-nvim"
is default
π‘ Neovim Plugin ποΈ
Requires nvim >= 0.7.0
and git
to be installed.
This plugin is LSP-independent, it will keep working even when rust-analyzer fails to produce diagnostics!
Using vim-plug:
Plug 'alopatindev/cargo-limit', { 'do': 'cargo install --locked cargo-limit nvim-send' }
and run
nvim +PlugInstall +UpdateRemotePlugins +qa
π‘ Using other Neovim Plugin Managers ποΈ
{ 'alopatindev/cargo-limit', build = 'cargo install --locked cargo-limit nvim-send' },
and run
nvim --headless "+Lazy! sync" +qa
{ 'alopatindev/cargo-limit', build = ':!cargo install --locked cargo-limit nvim-send' },
and run
nvim +PaqSync +qa
{ use 'alopatindev/cargo-limit', run = ':!cargo install --locked cargo-limit nvim-send' }
and run
nvim +PackerUpdate +qa
dein:
call dein#add('alopatindev/cargo-limit', { 'rev': 'master', 'hook_post_update': '!cargo install --locked cargo-limit nvim-send' })
and run
nvim --cmd '!call dein#install()'
fun! SaveAllFilesOrOpenNextLocation()
let l:all_files_are_saved = v:true
for i in getbufinfo({'bufmodified': 1})
if i.name !=# ''
let l:all_files_are_saved = v:false
break
endif
endfor
if l:all_files_are_saved
if exists('*CargoLimitOpenNextLocation')
call g:CargoLimitOpenNextLocation()
endif
else
execute 'wa!'
endif
endf
nmap <F2> :call SaveAllFilesOrOpenNextLocation()<cr>
vmap <F2> <esc>:call SaveAllFilesOrOpenNextLocation()<cr>v
imap <F2> <esc>:call SaveAllFilesOrOpenNextLocation()<cr>i
let g:CargoLimitVerbosity = 2 " warnings level
π‘ Test the plugin! ποΈ
- Open two terminals (or tmux windows, etc.)
cd your/project/directory
in both of them- Run
nvim
in one of them - Run
cargo lrun
in the other - In case of compiling errors
nvim
opens new or existing tabs with the files on affected lines and columns - Fix the error, save the file and
nvim
will jump to the next error location cargo llrun
(cargo llcheck
, etc.) will open them in case of warnings as well.
β οΈ Known Limitations! ποΈ
- current mode is normal
- current buffer is either empty or contains some existing and unmodified (saved) file
This is by design, in order to not disrupt from active text editing or file navigation process.
- it may jump to a wrong line if it moved
- it may not jump at all, if the next affected line is supposed to be modified already
For precise jump please rerun cargo ll{check,run,etc.}
.
- that's required so cargo-limit could figure out which exact
nvim
instance should be controlled - only first
nvim
instance with current project (sub)directory will be controlled by cargo-limit.
Add a custom open handler to your init.vim
if you want other Neovim behavior.
π‘ See examples! ποΈ
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
endf
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
endf
π‘ Other Text Editors/IDEs ποΈ
cargo-limit can run external app/script and provide affected locations to stdin in the following JSON format:
{
"protocol_version": "0.0.11",
"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"
}
]
}
Theoretically this can be used for any text editor or IDE, especially if it supports client/server communication. To do that you need a wrapper app/script that parses the files
and gives them to the text editor or IDE client.
π‘ Example: Gedit! ποΈ
- Install
jq
- Create
open-in-gedit.sh
:
#!/bin/bash
jq --raw-output '.files |= unique_by(.path) | .files[] | [
"gedit",
.path,
"+" + (.line | tostring) + ":" + (.column | tostring),
"&"
] | join(" ")' | bash
chmod +x open-in-gedit.sh
- Set
CARGO_EDITOR=/path/to/open-in-gedit.sh
environment variable - Run
cargo lrun
in your project directory - In case of compiling errors
open-in-gedit.sh
will open files ingedit
on affected lines and columns cargo llrun
(cargo llcheck
, etc.) will open them in case of warnings as well.
- bacon is a background rust code checker
- cargo-firstpage shows only the first page of rustc output
- ograc like cargo, but backwards
If this project improved your workflow β please consider:
- pressing β
- sharing this project with your friends/colleges
- buying me some
coffeeveggies π₯
Your donations will help me allocate more time to resolve issues and to finish all the planned features! β€οΈ
-
Bitcoin (BTC)
1Afgvdz1oPaugFcLgDaAzCYYdHexV6tTvH
-
TRON (TRX, USDT-TRC20, etc.)
TVxE2HyryNyNReMvw9HRQ3BkYePCszXSrc
-
Ethereum (ETH, DAI, etc.)
0xa879cdb1d7d859e6e425f8e50c4ee49f4b3a7b06
-
TON:
EQApceYoD6FDKn4azXrUxOIyT8VF4NIV_PRE7x9KsTJC9h0q
-
Zcash (ZEC):
t1NiwnuUQC1tENTY2aPDDhKEA3pykF582TP
-
Litecoin (LTC):
Le3yFbk854T1nrRUjWHkqTNrwz1zgDFqVX
-
Monero (XMR):
46pRHmFpqzUBA8SLrdjW73H6ainCqRGpe8shjqQJ4UoBFAbegkAwqvjTSCBvBL71NZXYhriSuKPBkGxc1FjCeiut2EvFvxk
For general donations dedicated to all my projects please check out β‘ here.
Thank you for your support! ππΌ
β€οΈ Special thanks to Danil Suetin for sponsoring this project! β€οΈ
Also thanks everyone for code contributions and bug reporting. Special thanks to Casey Rodarmor for providing VimL code for quickfix populator and Otavio Salvador for NixOS package!
MIT/Apache-2.0