mini.comment documentation
Generated from the main
branch of ‘mini.nvim’
mini.comment Comment lines
MIT License Copyright (c) 2021 Evgeni Chasnovski
Module
Features:
Commenting in Normal mode respects count and is dot-repeatable.
Comment structure by default is inferred from ‘commentstring’: either from current buffer or from locally active tree-sitter language. It can be customized via
options.custom_commentstring
(see MiniComment.config for details).Allows custom hooks before and after successful commenting.
Configurable options for some nuanced behavior.
What it doesn’t do:
Block and sub-line comments. This will only support per-line commenting.
Handle indentation with mixed tab and space.
Preserve trailing whitespace in empty lines.
Notes:
- To use tree-sitter aware commenting, global value of ‘commentstring’ should be
''
(empty string). This is the default value, so make sure to not set it manually to a different value.
Setup
This module needs a setup with require('mini.comment').setup({})
(replace {}
with your config
table). It will create global Lua table MiniComment
which you can use for scripting or manually (with :lua MiniComment.*
).
See MiniComment.config for config
structure and default values.
You can override runtime config settings locally to buffer inside vim.b.minicomment_config
which should have same structure as MiniComment.config
. See mini.nvim-buffer-local-config for more details.
Disabling
To disable core functionality, set vim.g.minicomment_disable
(globally) or vim.b.minicomment_disable
(for a buffer) to true
. Considering high number of different scenarios and customization intentions, writing exact rules for disabling module’s functionality is left to user. See mini.nvim-disabling-recipes for common recipes.
setup()
MiniComment.setup
({config})
Module setup
Parameters
{config} (table|nil)
Module config table. See MiniComment.config.
Usage
require('mini.comment').setup() -- use default config
-- OR
require('mini.comment').setup({}) -- replace {} with your config table
config
MiniComment.config
Defaults
MiniComment.config = {
-- Options which control module behavior
options = {
-- Function to compute custom 'commentstring' (optional)
custom_commentstring = nil,
-- Whether to ignore blank lines in actions and textobject
ignore_blank_line = false,
-- Whether to recognize as comment only lines without indent
start_of_line = false,
-- Whether to force single space inner padding for comment parts
pad_comment_parts = true,
},
-- Module mappings. Use `''` (empty string) to disable one.
mappings = {
-- Toggle comment (like `gcip` - comment inner paragraph) for both
-- Normal and Visual modes
comment = 'gc',
-- Toggle comment on current line
comment_line = 'gcc',
-- Toggle comment on visual selection
comment_visual = 'gc',
-- Define 'comment' textobject (like `dgc` - delete whole comment block)
-- Works also in Visual mode if mapping differs from `comment_visual`
textobject = 'gc',
},
-- Hook functions to be executed at certain stage of commenting
hooks = {
-- Before successful commenting. Does nothing by default.
pre = function() end,
-- After successful commenting. Does nothing by default.
post = function() end,
},
}
Options
Custom commentstring
options.custom_commentstring
can be a function customizing ‘commentstring’ option used to infer comment structure. It is called once before every commenting action with the following arguments:
ref_position
- position at which to compute ‘commentstring’ (might be relevant for a text with locally different commenting rules). Its structure is the same asopts.ref_position
in MiniComment.toggle_lines().
Its output should be a valid ‘commentstring’ (string containing %s
).
If not set or the output is nil
, MiniComment.get_commentstring() is used.
For example, this option can be used to always use buffer ‘commentstring’ even in case of present active tree-sitter parser:
require('mini.comment').setup({
options = {
custom_commentstring = function() return vim.bo.commentstring end,
}
})
Hooks
hooks.pre
and hooks.post
functions are executed before and after successful commenting action (toggle or computing textobject). They will be called with a single table argument which has the following fields:
<action>
(string)
- action name. One of “toggle” (when actual toggle direction is yet unknown), “comment”, “uncomment”, “textobject”.<line_start>
(number|nil)
- action start line. Can be absent if yet unknown.<line_end>
(number|nil)
- action end line. Can be absent if yet unknown.<ref_position>
(table|nil)
- reference position.
Notes:
Changing ‘commentstring’ in
hooks.pre
is allowed and will take effect.If hook returns
false
, any further action is terminated.
operator()
MiniComment.operator
({mode})
Main function to be mapped
It is meant to be used in expression mappings (see :map-<expr>) to enable dot-repeatability and commenting on range. There is no need to do this manually, everything is done inside MiniComment.setup().
It has a somewhat unintuitive logic (because of how expression mapping with dot-repeatability works): it should be called without arguments inside expression mapping and with argument when action should be performed.
Parameters
{mode} (string|nil)
Optional string with ‘operatorfunc’ mode (see g@).
Return
(string|nil)
‘g@’ if called without argument, ’’ otherwise (but after performing action).
toggle_lines()
MiniComment.toggle_lines
({line_start}, {line_end}, {opts})
Toggle comments between two line numbers
It uncomments if lines are comment (every line is a comment or blank) and comments otherwise. It respects indentation and doesn’t insert trailing whitespace. Toggle commenting not in visual mode is also dot-repeatable and respects count.
Notes
Comment structure is inferred from buffer’s ‘commentstring’ option or local language of tree-sitter parser (if active).
Call to this function will remove all extmarks from target range.
Parameters
{line_start} (number)
Start line number (inclusive from 1 to number of lines).
{line_end} (number)
End line number (inclusive from 1 to number of lines).
{opts} (table|nil)
Options. Possible fields:
- <ref_position>
(table)
- A two-value array with{ row, col }
(both starting at 1) of reference position at which ‘commentstring’ value will be computed. Default:{ line_start, 1 }
.
textobject()
MiniComment.textobject
()
Select comment textobject
This selects all commented lines adjacent to cursor line. If ignore_blank_line
option is enabled (see MiniComment.config), blank lines between commented lines are treated as part of textobject. Designed to be used with operator mode mappings (see mapmode-o).
get_commentstring()
MiniComment.get_commentstring
({ref_position})
Get ‘commentstring’
This function represents default approach of computing relevant ‘commentstring’ option in current buffer. Used to infer comment structure.
It has the following logic:
If there is an active tree-sitter parser, try to get ‘commentstring’ from the local language at
ref_position
.If first step is not successful, use buffer’s ‘commentstring’ directly.
Parameters
{ref_position} (table)
Reference position inside current buffer at which to compute ‘commentstring’. Same structure as opts.ref_position
in MiniComment.toggle_lines().
Return
(string)
Relevant value of ‘commentstring’.