Nu-Lint
Linter for the innovative Nu shell.
Learning to use a new shell is a radical change that can use some assistance. This project is aimed at helping new and intermediate users of the Nu shell. Nu shell has a lot of useful features not found in other scripting languages. This linter will give you hints to use all of them and even offer automatic fixes.
All rules are optional and can be disabled with a configuration file. The rule definitions are designed to be compatible with:
- The standard Nu parser nu-check.
- The standard Nu formatter topiary-nushell.
Example
The rule positional_to_pipeline recommends to use pipelines instead of positional arguments:
def filter-positive [numbers] {
$numbers | where $it > 0
}
def filter-positive [] {
where $it > 0
}
This encourages lazy pipeline input: a positional list argument loads all data into memory at once, while implicit pipeline input processes elements one at a time.
CLI usage
For all available options and usage information, run:
More than 90 rules are available on The CLI. Some of them need further testing and improvement. Please make an issue on the issue tracker to report any bugs.
documentation - Improve relevance of actionability of user-facing messages.
add_doc_comment_exported_fndescriptive_error_messagesadd_label_to_erroradd_help_to_erroradd_span_to_labeladd_url_to_errormain_positional_args_docsmain_named_args_docsmax_positional_params
error-handling - Error handling best practices
check_complete_exit_codedescriptive_error_messagesescape_string_interpolation_operatorsexit_only_in_mainmissing_stdin_in_shebang(auto-fix)non_final_failure_checkuse_error_make_for_catch(auto-fix)try_instead_of_doerrors_to_stderrunsafe_dynamic_record_access(auto-fix)
external-tools - Replace common external CLI tools.
use_builtin_curl(auto-fix)use_builtin_eza(auto-fix)use_builtin_fd(auto-fix)replace_jq_with_nu_get(auto-fix)use_builtin_rg(auto-fix)unnecessary_hat(auto-fix)use_builtin_wget(auto-fix)use_builtin_which(auto-fix)
formatting - Formatting according to Nushell guidelines.
collapsible_if(auto-fix)forbid_excessive_nestingmax_function_body_lengthreplace_if_else_chain_with_match(auto-fix)brace_spacingno_trailing_spacesomit_list_commaspipe_spacing(auto-fix)reflow_wide_pipelines(auto-fix)reflow_wide_listswrap_wide_records
naming - Follow official naming conventions
kebab_case_commandsscreaming_snake_constantssnake_case_variables(auto-fix)
performance - May yield performance improvements
avoid_self_importavoid_nu_subprocessuse_builtin_is_not_empty(auto-fix)dispatch_with_subcommandsshorten_with_compound_assignment(auto-fix)unnecessary_accumulatelines_instead_of_split(auto-fix)parse_instead_of_split(auto-fix)turn_positional_into_stream_input(auto-fix)while_counterloop_counterwhere_instead_each_then_iffilter_collect_with_whereremove_redundant_in(auto-fix)row_condition_above_closure(auto-fix)unnecessary_variable_before_return(auto-fix)inline_single_use_functionitems_instead_of_transpose_each(auto-fix)merge_get_cell_path(auto-fix)merge_multiline_print(auto-fix)redundant_ignore(auto-fix)unnecessary_mut(auto-fix)unused_helper_functions(auto-fix)
posix-tools - Replace common bash/POSIX commands.
ignore_over_dev_null(auto-fix)use_builtin_awk(auto-fix)use_builtin_cat(auto-fix)use_builtin_cut(auto-fix)use_builtin_date(auto-fix)use_builtin_echo(auto-fix)use_builtin_find(auto-fix)use_builtin_grep(auto-fix)use_builtin_head(auto-fix)use_builtin_cd(auto-fix)use_builtin_ls(auto-fix)use_builtin_read(auto-fix)use_builtin_sed(auto-fix)use_builtin_sort(auto-fix)use_builtin_tail(auto-fix)use_builtin_uniq(auto-fix)use_builtin_wc(auto-fix)
side-effects - Handle risky and unpredictable commands.
dangerous_file_operationsseparate_local_remote_ioprint_and_return_data
systemd - When used in combination with systemd services
add_journal_prefix(auto-fix)attach_loglevel_to_log_statement(auto-fix)
type-safety - Encourage annotations with type hints.
external_script_as_argumentmissing_type_annotation(auto-fix)prefer_path_type(auto-fix)typed_pipeline_io(auto-fix)avoid_nu_subprocess
upstream - Forward warnings and errors of the upstream Nushell parser.
nu_deprecatednu_parse_error
Installation
From crates.io:
Source
Build from source:
Nix
Run without installing (using flakes):
Editor extension
VS Code extension
Available at VS Code Marketplace.
Helix
Add to your ~/.config/helix/languages.toml:
[]
= "nu-lint"
= ["--lsp"]
[[]]
= "nu"
= ["nu-lint"]
Neovim
Add to your Neovim configuration (Lua):
vim.. =
vim..
Emacs
Add to your Emacs configuration (with Eglot, built-in since Emacs 29):
(with-eval-after-load 'eglot
(add-to-list 'eglot-server-programs
'(nushell-mode "nu-lint" "--lsp")))
Kate
Add to your ~/.config/kate/lspclient/settings.json:
Other
You can also implement your own editor extensions using the --lsp flag as in: nu-lint --lsp. This will spawn a language server compliant with the Language Server Protocol.
Configuration
Create .nu-lint.toml in your project root:
# This rule is ignored
= ["snake_case_variables"]
# Set lint level of a set of rules at once.
[]
= "warning"
= "error"
# Override a single rule lievel
[]
= "hint"
License
MIT