summaryrefslogtreecommitdiffstats
path: root/runtime/doc/change.txt
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-05-13 00:02:36 +0200
committerBram Moolenaar <Bram@vim.org>2018-05-13 00:02:36 +0200
commit7db25fed5de1be922b8cbb0328149469606a0424 (patch)
treead7a588d2f32740df2fb5d23ae41e06eac36be16 /runtime/doc/change.txt
parent52ecaaa63d8d4c6d2ae9072e944a45d8d4e2ac76 (diff)
Update runtime files.
Diffstat (limited to 'runtime/doc/change.txt')
-rw-r--r--runtime/doc/change.txt51
1 files changed, 50 insertions, 1 deletions
diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt
index ab820b0662..ffc5abde77 100644
--- a/runtime/doc/change.txt
+++ b/runtime/doc/change.txt
@@ -1,4 +1,4 @@
-*change.txt* For Vim version 8.0. Last change: 2018 May 06
+*change.txt* For Vim version 8.0. Last change: 2018 May 12
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -1445,6 +1445,55 @@ to the name of an external program for Vim to use for text formatting. The
'textwidth' and other options have no effect on formatting by an external
program.
+ *format-formatexpr*
+The 'formatexpr' option can be set to a Vim Script function that performs
+reformatting of the buffer. This should usually happen in an |ftplugin|,
+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
+when actually needed and the script should be called <filetype>format.vim.
+
+For example, the XML filetype plugin distributed with Vim in the $VIMRUNTIME
+directory, sets the 'formatexpr' option to: >
+
+ setlocal formatexpr=xmlformat#Format()
+
+That means, you will find the corresponding script, defining the
+xmlformat#Format() function, in the directory:
+`$VIMRUNTIME/autoload/xmlformat.vim`
+
+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: >
+
+ func! format#Format()
+ " only reformat on explicit gq command
+ if mode() != 'n'
+ " fall back to Vims internal reformatting
+ return 1
+ endif
+ let lines = getline(v:lnum, v:lnum + v:count - 1)
+ call map(lines, {key, val -> substitute(val, '\s\+$', '', 'g')})
+ call setline('.', lines)
+
+ " do not run internal formatter!
+ return 0
+ endfunc
+
+You can then enable the formatting by executing: >
+ setlocal formatexpr=format#Format()
+>
+Note: this function explicitly returns non-zero when called from insert mode
+(which basically means, text is inserted beyond the 'textwidth' limit). This
+causes Vim to fall back to reformat the text by using the internal formatter.
+
+However, if the |gq| command is used to reformat the text, the function
+will receive the selected lines, trim trailing whitespace from those lines and
+put them back in place. If you are going to split single lines into multiple
+lines, be careful not to overwrite anything.
+
+If you want to allow reformatting of text from insert or replace mode, one has
+to be very careful, because the function might be called recursively. For
+debugging it helps to set the 'debug' option.
+
*right-justify*
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