view runtime/doc/usr_50.txt @ 35769:4f48d5d327ea v9.1.0609

patch 9.1.0609: outdated comments in Makefile Commit: https://github.com/vim/vim/commit/4c3616d7a2c8c3b828e4d4ebbcd43e4a22154262 Author: Shane Harper <shane@shaneharper.net> Date: Mon Jul 22 20:09:26 2024 +0200 patch 9.1.0609: outdated comments in Makefile Problem: outdated comments in Makefile Solution: update outdated comments, update rule for vimtags (Shane Harper) related: commit b81109192f Here are the changes and the reasons for them: - Delete the comment preceding the assignment to VIMPROG. Since b81109192f there's no need for VIMPROG to be set to something else when this is executed from src/Makefile. (The comment was wrong anyway; VIMPROG was being set to "$$BUILD_DIR/$(VIMTARGET)".) ``` # Set to $(VIMTARGET) when executed from src/Makefile. VIMPROG = ../../src/vim ``` - Delete "`and installed`" in the following comment; The vimtags rule doesn't require that Vim has been installed. ``` # Use Vim to generate the tags file. Can only be used when Vim has been # compiled and installed. Supports multiple languages. vimtags: $(DOCS) ``` - With commit b81109192f there is no longer a need to set VIMPROG here: ``` -@BUILD_DIR="`pwd`"; cd $(HELPSOURCE); if test -z "$(CROSS_COMPILING)"; then \ $(MAKE) VIMPROG="$$BUILD_DIR/$(VIMTARGET)" vimtags; fi ``` The new code below will use the same vim executable as the old code: ``` -@cd $(HELPSOURCE); if test -z "$(CROSS_COMPILING)"; then \ $(MAKE) vimtags; fi ``` - Delete the following comment which was related to setting VIMPROG as it no longer has any value: ``` # We can assume Vim was build, but it may not have been installed, # thus use the executable in the current directory. ``` Note: this comment used to be (unnecessarily) echoed to the terminal (because it was indented) when making installrtbase. closes: #15320 Signed-off-by: Shane Harper <shane@shaneharper.net> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Mon, 22 Jul 2024 20:30:07 +0200
parents 4635e43f2c6f
children
line wrap: on
line source

*usr_50.txt*	For Vim version 9.1.  Last change: 2022 Jun 20

		     VIM USER MANUAL - by Bram Moolenaar

			 Advanced Vim script writing


|50.1|	Exceptions
|50.2|	Function with variable number of arguments
|50.3|	Restoring the view

     Next chapter: |usr_51.txt|  Create a plugin
 Previous chapter: |usr_45.txt|  Select your language (local)
Table of contents: |usr_toc.txt|

==============================================================================
*50.1*	Exceptions

Let's start with an example: >

	try
	   read ~/templates/pascal.tmpl
	catch /E484:/
	   echo "Sorry, the Pascal template file cannot be found."
	endtry

The `read` command will fail if the file does not exist.  Instead of
generating an error message, this code catches the error and gives the user a
message with more information.

For the commands in between `try` and `endtry` errors are turned into
exceptions.  An exception is a string.  In the case of an error the string
contains the error message.  And every error message has a number.  In this
case, the error we catch contains "E484:".  This number is guaranteed to stay
the same (the text may change, e.g., it may be translated).

Besides being able to give a nice error message, Vim will also continue
executing commands after the `:endtry`.  Otherwise, once an uncaught error is
encountered, execution of the script/function/mapping will be aborted.

When the `read` command causes another error, the pattern "E484:" will not
match in it.  Thus this exception will not be caught and result in the usual
error message and execution is aborted.

You might be tempted to do this: >

	try
	   read ~/templates/pascal.tmpl
	catch
	   echo "Sorry, the Pascal template file cannot be found."
	endtry

This means all errors are caught.  But then you will not see an error that
would indicate a completely different problem, such as "E21: Cannot make
changes, 'modifiable' is off".  Think twice before you catch any error!

Another useful mechanism is the `finally` command: >

	var tmp = tempname()
	try
	   exe ":.,$write " .. tmp
	   exe "!filter " .. tmp
	   :.,$delete
	   exe ":$read " .. tmp
	finally
	   delete(tmp)
	endtry

This filters the lines from the cursor until the end of the file through the
"filter" command, which takes a file name argument.  No matter if the
filtering works, if something goes wrong in between `try` and `finally` or the
user cancels the filtering by pressing CTRL-C, the `delete(tmp)` call is
always executed.  This makes sure you don't leave the temporary file behind.

The `finally` does not catch the exception, the error will still abort
further execution.

More information about exception handling can be found in the reference
manual: |exception-handling|.

==============================================================================
*50.2*	Function with variable number of arguments

Vim enables you to define functions that have a variable number of arguments.
The following command, for instance, defines a function that must have 1
argument (start) and can have up to 20 additional arguments: >

	def Show(start: string, ...items: list<string>)

The variable "items" will be a list in the function containing the extra
arguments.  You can use it like any list, for example: >

	def Show(start: string, ...items: list<string>)
	  echohl Title
	  echo "start is " .. start
	  echohl None
	  for index in range(len(items))
	    echon $"  Arg {index} is {items[index]}"
	  endfor
	  echo
	enddef

You can call it like this: >

	Show('Title', 'one', 'two', 'three')
<	start is Title  Arg 0 is one  Arg 1 is two  Arg 2 is three ~

This uses the `echohl` command to specify the highlighting used for the
following `echo` command.  `echohl None` stops it again.  The `echon` command
works like `echo`, but doesn't output a line break.

If you call it with one argument the "items" list will be empty.
`range(len(items))` returns a list with the indexes, what `for` loops over,
we'll explain that further down.

==============================================================================
*50.3*	Restoring the view

Sometimes you want to jump around, make a change and then go back to the same
position and view.  For example to change something in the file header.  This
can be done with two functions: >

	var view = winsaveview()
	# Move around, make changes
	winrestview(view)

==============================================================================

Next chapter: |usr_51.txt|  Create a plugin

Copyright: see |manual-copyright|  vim:tw=78:ts=8:noet:ft=help:norl: