Merge pull request #31602 from zeertzjq/vim-0a4e57f

vim-patch: doc updates
This commit is contained in:
zeertzjq 2024-12-17 09:01:59 +08:00 committed by GitHub
commit 137308a3c9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 47 additions and 22 deletions

View File

@ -1443,18 +1443,17 @@ since formatting is highly dependent on the type of file. It makes
sense to use an |autoload| script, so the corresponding script is only loaded sense to use an |autoload| script, so the corresponding script is only loaded
when actually needed and the script should be called <filetype>format.vim. when actually needed and the script should be called <filetype>format.vim.
For example, the XML filetype plugin distributed with Vim in the $VIMRUNTIME For example, the XML filetype plugin distributed with Vim in the
directory, sets the 'formatexpr' option to: > $VIMRUNTIME/ftplugin directory, sets the 'formatexpr' option to: >
setlocal formatexpr=xmlformat#Format() setlocal formatexpr=xmlformat#Format()
That means, you will find the corresponding script, defining the That means, you will find the corresponding script, defining the
xmlformat#Format() function, in the directory: xmlformat#Format() function, in the file `$VIMRUNTIME/autoload/xmlformat.vim`
`$VIMRUNTIME/autoload/xmlformat.vim`
Here is an example script that removes trailing whitespace from the selected Here is an example script that removes trailing whitespace from the selected
text. Put it in your autoload directory, e.g. ~/.vim/autoload/format.vim: > text. Put it in your autoload directory, e.g. ~/.vim/autoload/format.vim:
>vim
func! format#Format() func! format#Format()
" only reformat on explicit gq command " only reformat on explicit gq command
if mode() != 'n' if mode() != 'n'
@ -1487,7 +1486,7 @@ debugging it helps to set the 'debug' option.
*right-justify* *right-justify*
There is no command in Vim to right justify text. You can do it with There is no command in Vim to right justify text. You can do it with
an external command, like "par" (e.g.: "!}par" to format until the end of the an external command, like "par" (e.g.: `:.,}!par` to format until the end of the
paragraph) or set 'formatprg' to "par". paragraph) or set 'formatprg' to "par".
*format-comments* *format-comments*
@ -1553,7 +1552,7 @@ type of comment string. A part consists of:
some indent for the start or end part that can be removed. some indent for the start or end part that can be removed.
When a string has none of the 'f', 's', 'm' or 'e' flags, Vim assumes the When a string has none of the 'f', 's', 'm' or 'e' flags, Vim assumes the
comment string repeats at the start of each line. The flags field may be comment string repeats at the start of each line. The {flags} field may be
empty. empty.
Any blank space in the text before and after the {string} is part of the Any blank space in the text before and after the {string} is part of the

View File

@ -82,9 +82,11 @@ The most efficient is to call a function without arguments: >
The function must use v:lnum. See |expr-option-function|. The function must use v:lnum. See |expr-option-function|.
These are the conditions with which the expression is evaluated: These are the conditions with which the expression is evaluated:
- The current buffer and window are set for the line. - The current buffer and window are set for the line.
- The variable "v:lnum" is set to the line number. - The variable "v:lnum" is set to the line number.
- The result is used for the fold level in this way:
The result of foldexpr then determines the fold level as follows:
value meaning ~ value meaning ~
0 the line is not in a fold 0 the line is not in a fold
1, 2, .. the line is in a fold with this level 1, 2, .. the line is in a fold with this level
@ -99,6 +101,8 @@ These are the conditions with which the expression is evaluated:
"<1", "<2", .. a fold with this level ends at this line "<1", "<2", .. a fold with this level ends at this line
">1", ">2", .. a fold with this level starts at this line ">1", ">2", .. a fold with this level starts at this line
The result values "=", "s" and "a" are more expensive, please see |fold-expr-slow|.
It is not required to mark the start (end) of a fold with ">1" ("<1"), a fold It is not required to mark the start (end) of a fold with ">1" ("<1"), a fold
will also start (end) when the fold level is higher (lower) than the fold will also start (end) when the fold level is higher (lower) than the fold
level of the previous line. level of the previous line.
@ -112,12 +116,6 @@ recognized, there is no error message and the fold level will be zero.
For debugging the 'debug' option can be set to "msg", the error messages will For debugging the 'debug' option can be set to "msg", the error messages will
be visible then. be visible then.
Note: Since the expression has to be evaluated for every line, this fold
method can be very slow!
Try to avoid the "=", "a" and "s" return values, since Vim often has to search
backwards for a line for which the fold level is defined. This can be slow.
If the 'foldexpr' expression starts with s: or |<SID>|, then it is replaced If the 'foldexpr' expression starts with s: or |<SID>|, then it is replaced
with the script ID (|local-function|). Examples: > with the script ID (|local-function|). Examples: >
set foldexpr=s:MyFoldExpr() set foldexpr=s:MyFoldExpr()
@ -143,6 +141,35 @@ end in that line.
It may happen that folds are not updated properly. You can use |zx| or |zX| It may happen that folds are not updated properly. You can use |zx| or |zX|
to force updating folds. to force updating folds.
Minimizing Computational Cost *fold-expr-slow*
Due to its computational cost, this fold method can make Vim unresponsive,
especially when the fold level of all lines have to be initially computed.
Afterwards, after each change, Vim restricts the computation of foldlevels
to those lines whose fold level was affected by it (and reuses the known
foldlevels of all the others).
The fold expression should therefore strive to minimize the number of dependent
lines needed for the computation of a given line: For example, try to avoid the
"=", "a" and "s" return values, because these will require the evaluation of the
fold levels on previous lines until an independent fold level is found.
If this proves difficult, the next best thing could be to cache all fold levels
in a buffer-local variable (b:foldlevels) that is only updated on |b:changedtick|:
>vim
func MyFoldFunc()
if b:lasttick == b:changedtick
return b:foldlevels[v:lnum - 1]
endif
let b:lasttick = b:changedtick
let b:foldlevels = []
" compute foldlevels ...
return b:foldlevels[v:lnum - 1]
enddef
set foldexpr=s:MyFoldFunc()
<
In above example further speedup was gained by using a function without
arguments (that must still use v:lnum). See |expr-option-function|.
SYNTAX *fold-syntax* SYNTAX *fold-syntax*

View File

@ -86,13 +86,6 @@ command. There are however, two general exceptions:
end of the motion is moved to the end of the previous line and the motion end of the motion is moved to the end of the previous line and the motion
becomes inclusive. Example: "}" moves to the first line after a paragraph, becomes inclusive. Example: "}" moves to the first line after a paragraph,
but "d}" will not include that line. but "d}" will not include that line.
*inclusive-motion-selection-exclusive*
When 'selection' is "exclusive", |Visual| mode is active and an inclusive
motion has been used, the cursor position will be adjusted by another
character to the right, so that visual selction includes the expected text and
can be acted upon.
*exclusive-linewise* *exclusive-linewise*
2. If the motion is exclusive, the end of the motion is in column 1 and the 2. If the motion is exclusive, the end of the motion is in column 1 and the
start of the motion was at or before the first non-blank in the line, the start of the motion was at or before the first non-blank in the line, the
@ -122,6 +115,12 @@ This cannot be repeated: >
endif<CR> endif<CR>
Note that when using ":" any motion becomes charwise exclusive. Note that when using ":" any motion becomes charwise exclusive.
*inclusive-motion-selection-exclusive*
When 'selection' is "exclusive", |Visual| mode is active and an inclusive
motion has been used, the cursor position will be adjusted by another
character to the right, so that visual selction includes the expected text and
can be acted upon.
*forced-motion* *forced-motion*
FORCING A MOTION TO BE LINEWISE, CHARWISE OR BLOCKWISE FORCING A MOTION TO BE LINEWISE, CHARWISE OR BLOCKWISE