12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076 |
- *repeat.txt* Nvim
- VIM REFERENCE MANUAL by Bram Moolenaar
- Repeating commands, Vim scripts and debugging *repeating*
- Chapter 26 of the user manual introduces repeating |usr_26.txt|.
- Type |gO| to see the table of contents.
- ==============================================================================
- Single repeats *single-repeat*
- *.*
- . Repeat last change, with count replaced with [count].
- Also repeat a yank command, when the 'y' flag is
- included in 'cpoptions'. Does not repeat a
- command-line command.
- Simple changes can be repeated with the "." command. Without a count, the
- count of the last change is used. If you enter a count, it will replace the
- last one. |v:count| and |v:count1| will be set.
- If the last change included a specification of a numbered register, the
- register number will be incremented. See |redo-register| for an example how
- to use this.
- Note that when repeating a command that used a Visual selection, the same SIZE
- of area is used, see |visual-repeat|.
- *@:*
- @: Repeat last command-line [count] times.
- ==============================================================================
- Multiple repeats *multi-repeat*
- *:g* *:global* *E148*
- :[range]g[lobal]/{pattern}/[cmd]
- Execute the Ex command [cmd] (default ":p") on the
- lines within [range] where {pattern} matches.
- :[range]g[lobal]!/{pattern}/[cmd]
- Execute the Ex command [cmd] (default ":p") on the
- lines within [range] where {pattern} does NOT match.
- *:v* *:vglobal*
- :[range]v[global]/{pattern}/[cmd]
- Same as :g!.
- Example: >
- :g/^Obsolete/d _
- Using the underscore after `:d` avoids clobbering registers or the clipboard.
- This also makes it faster.
- Instead of the '/' which surrounds the {pattern}, you can use any other
- single byte character, but not an alphabetic character, '\', '"' or '|'.
- This is useful if you want to include a '/' in the search pattern or
- replacement string.
- For the definition of a pattern, see |pattern|.
- NOTE [cmd] may contain a range; see |collapse| and |edit-paragraph-join| for
- examples.
- The global commands work by first scanning through the [range] lines and
- marking each line where a match occurs (for a multi-line pattern, only the
- start of the match matters).
- In a second scan the [cmd] is executed for each marked line, as if the cursor
- was in that line. For ":v" and ":g!" the command is executed for each not
- marked line. If a line is deleted its mark disappears.
- The default for [range] is the whole buffer (1,$). Use "CTRL-C" to interrupt
- the command. If an error message is given for a line, the command for that
- line is aborted and the global command continues with the next marked or
- unmarked line.
- *E147*
- When the command is used recursively, it only works on one line. Giving a
- range is then not allowed. This is useful to find all lines that match a
- pattern and do not match another pattern: >
- :g/found/v/notfound/{cmd}
- This first finds all lines containing "found", but only executes {cmd} when
- there is no match for "notfound".
- Any Ex command can be used, see |ex-cmd-index|. To execute a Normal mode
- command, you can use the `:normal` command: >
- :g/pat/normal {commands}
- Make sure that {commands} ends with a whole command, otherwise Vim will wait
- for you to type the rest of the command for each match. The screen will not
- have been updated, so you don't know what you are doing. See |:normal|.
- The undo/redo command will undo/redo the whole global command at once.
- The previous context mark will only be set once (with "''" you go back to
- where the cursor was before the global command).
- The global command sets both the last used search pattern and the last used
- substitute pattern (this is vi compatible). This makes it easy to globally
- replace a string:
- :g/pat/s//PAT/g
- This replaces all occurrences of "pat" with "PAT". The same can be done with:
- :%s/pat/PAT/g
- Which is two characters shorter!
- When using "global" in Ex mode, a special case is using ":visual" as a
- command. This will move to a matching line, go to Normal mode to let you
- execute commands there until you use |gQ| to return to Ex mode. This will be
- repeated for each matching line. While doing this you cannot use ":global".
- To abort this type CTRL-C twice.
- ==============================================================================
- Complex repeats *complex-repeat*
- *q* *recording*
- q{0-9a-zA-Z"} Record typed characters into register {0-9a-zA-Z"}
- (uppercase to append). The 'q' command is disabled
- while executing a register, and it doesn't work inside
- a mapping and |:normal|.
- Note: If the register being used for recording is also
- used for |y| and |p| the result is most likely not
- what is expected, because the put will paste the
- recorded macro and the yank will overwrite the
- recorded macro.
- Note: The recording happens while you type, replaying
- the register happens as if the keys come from a
- mapping. This matters, for example, for undo, which
- only syncs when commands were typed.
- q Stops recording.
- Implementation note: The 'q' that stops recording is
- not stored in the register, unless it was the result
- of a mapping
- *@*
- @{0-9a-z".=*+} Execute the contents of register {0-9a-z".=*+} [count]
- times. Note that register '%' (name of the current
- file) and '#' (name of the alternate file) cannot be
- used.
- The register is executed like a mapping, that means
- that the difference between 'wildchar' and 'wildcharm'
- applies, and undo might not be synced in the same way.
- For "@=" you are prompted to enter an expression. The
- result of the expression is then executed.
- See also |@:|.
- *@@* *E748*
- @@ Repeat the previous @{0-9a-z":*} [count] times.
- *Q*
- Q Repeat the last recorded register [count] times.
- See |reg_recorded()|.
- *:@*
- :[addr]@{0-9a-z".=*+} Execute the contents of register {0-9a-z".=*+} as an Ex
- command. First set cursor at line [addr] (default is
- current line). When the last line in the register does
- not have a <CR> it will be added automatically when
- the 'e' flag is present in 'cpoptions'.
- For ":@=" the last used expression is used. The
- result of evaluating the expression is executed as an
- Ex command.
- Mappings are not recognized in these commands.
- When the |line-continuation| character (\) is present
- at the beginning of a line in a linewise register,
- then it is combined with the previous line. This is
- useful for yanking and executing parts of a Vim
- script.
- *:@:*
- :[addr]@: Repeat last command-line. First set cursor at line
- [addr] (default is current line).
- :[addr]@ *:@@*
- :[addr]@@ Repeat the previous :@{register}. First set cursor at
- line [addr] (default is current line).
- ==============================================================================
- Using Vim scripts *using-scripts*
- For writing a Vim script, see chapter 41 of the user manual |usr_41.txt|.
- *:so* *:source* *load-vim-script*
- :[range]so[urce] [file] Runs |Ex| commands or Lua code (".lua" files) from
- [file], or current buffer if no [file].
- Triggers the |SourcePre| autocommand.
- *:source!*
- :[range]so[urce]! {file}
- Runs |Normal-mode| commands from {file}. When used
- after |:global|, |:argdo|, |:windo|, |:bufdo|, in
- a loop or when another command follows the display
- won't be updated while executing the commands.
- *:ru* *:runtime*
- :ru[ntime][!] [where] {file} ..
- Sources |Ex| commands or Lua code (".lua" files) read
- from {file} (a relative path) in each directory given
- by 'runtimepath' and/or 'packpath'.
- Ignores non-existing files.
- Example: >
- :runtime syntax/c.vim
- :runtime syntax/c.lua
- < There can be multiple space-separated {file}
- arguments. Each {file} is searched for in the first
- directory from 'runtimepath', then in the second
- directory, etc.
- When [!] is included, all found files are sourced.
- Else only the first found file is sourced.
- When [where] is omitted, first 'runtimepath' is
- searched, then directories under "start" in 'packpath'
- are searched.
- Other values:
- START search only under "start" in 'packpath'
- OPT search only under "opt" in 'packpath'
- PACK search under "start" and "opt" in
- 'packpath'
- ALL first use 'runtimepath', then search
- under "start" and "opt" in 'packpath'
- When {file} contains wildcards it is expanded to all
- matching files. Example: >
- :runtime! plugin/**/*.vim
- < This is what Vim uses to load the plugin files when
- starting up. This similar command: >
- :runtime plugin/**/*.vim
- < would source the first file only.
- When 'verbose' is one or higher, there is a message
- when no file could be found.
- When 'verbose' is two or higher, there is a message
- about each searched file.
- *:pa* *:packadd* *E919*
- :pa[ckadd][!] {name} Search for an optional plugin directory in 'packpath'
- and source any plugin files found. The directory must
- match:
- pack/*/opt/{name} ~
- The directory is added to 'runtimepath' if it wasn't
- there yet.
- If the directory pack/*/opt/{name}/after exists it is
- added at the end of 'runtimepath'.
- If loading packages from "pack/*/start" was skipped,
- then this directory is searched first:
- pack/*/start/{name} ~
- Note that {name} is the directory name, not the name
- of the .vim file. All the files matching the pattern
- pack/*/opt/{name}/plugin/**/*.vim ~
- and
- pack/*/opt/{name}/plugin/**/*.lua ~
- will be sourced. This allows for using subdirectories
- below "plugin", just like with plugins in
- 'runtimepath'.
- If the filetype detection was already enabled (this
- is usually done with a "syntax enable" or "filetype
- on" command in your |init.vim|, or automatically during
- |initialization|), and the package was found in
- "pack/*/opt/{name}", this command will also look
- for "{name}/ftdetect/*.vim" files.
- When the optional ! is added no plugin files or
- ftdetect scripts are loaded, only the matching
- directories are added to 'runtimepath'. This is
- useful in your |init.vim|. The plugins will then be
- loaded during |initialization|, see |load-plugins| (note
- that the loading order will be reversed, because each
- directory is inserted before others). In this case, the
- ftdetect scripts will be loaded during |initialization|,
- before the |load-plugins| step.
- Also see |pack-add|.
- *:packl* *:packloadall*
- :packl[oadall][!] Load all packages in the "start" directory under each
- entry in 'packpath'.
- First all the directories found are added to
- 'runtimepath', then the plugins found in the
- directories are sourced. This allows for a plugin to
- depend on something of another plugin, e.g. an
- "autoload" directory. See |packload-two-steps| for
- how this can be useful.
- This is normally done automatically during startup,
- after loading your .vimrc file. With this command it
- can be done earlier.
- Packages will be loaded only once. Using
- `:packloadall` a second time will have no effect.
- When the optional ! is added this command will load
- packages even when done before.
- Note that when using `:packloadall` in the |vimrc|
- file, the 'runtimepath' option is updated, and later
- all plugins in 'runtimepath' will be loaded, which
- means they are loaded again. Plugins are expected to
- handle that.
- An error only causes sourcing the script where it
- happens to be aborted, further plugins will be loaded.
- See |packages|.
- :scripte[ncoding] [encoding] *:scripte* *:scriptencoding* *E167*
- Specify the character encoding used in the script.
- The following lines will be converted from [encoding]
- to the value of the 'encoding' option, if they are
- different. Examples: >
- scriptencoding iso-8859-5
- scriptencoding cp932
- <
- When [encoding] is empty, no conversion is done. This
- can be used to restrict conversion to a sequence of
- lines: >
- scriptencoding euc-jp
- ... lines to be converted ...
- scriptencoding
- ... not converted ...
- < When conversion isn't supported by the system, there
- is no error message and no conversion is done. When a
- line can't be converted there is no error and the
- original line is kept.
- Don't use "ucs-2" or "ucs-4", scripts cannot be in
- these encodings (they would contain NUL bytes).
- When a sourced script starts with a BOM (Byte Order
- Mark) in utf-8 format Vim will recognize it, no need
- to use ":scriptencoding utf-8" then.
- *:scr* *:scriptnames*
- :scr[iptnames] List all sourced script names, in the order they were
- first sourced. The number is used for the script ID
- |<SID>|.
- :scr[iptnames][!] {scriptId} *:script*
- Edit script {scriptId}. Although ":scriptnames name"
- works, using ":script name" is recommended.
- When the current buffer can't be |abandon|ed and the !
- is not present, the command fails.
- *:fini* *:finish* *E168*
- :fini[sh] Stop sourcing a script. Can only be used in a Vim
- script file. This is a quick way to skip the rest of
- the file. If it is used after a |:try| but before the
- matching |:finally| (if present), the commands
- following the ":finally" up to the matching |:endtry|
- are executed first. This process applies to all
- nested ":try"s in the script. The outermost ":endtry"
- then stops sourcing the script.
- All commands and command sequences can be repeated by putting them in a named
- register and then executing it. There are two ways to get the commands in the
- register:
- - Use the record command "q". You type the commands once, and while they are
- being executed they are stored in a register. Easy, because you can see
- what you are doing. If you make a mistake, "p"ut the register into the
- file, edit the command sequence, and then delete it into the register
- again. You can continue recording by appending to the register (use an
- uppercase letter).
- - Delete or yank the command sequence into the register.
- Often used command sequences can be put under a function key with the ':map'
- command.
- An alternative is to put the commands in a file, and execute them with the
- ':source!' command. Useful for long command sequences. Can be combined with
- the ':map' command to put complicated commands under a function key.
- The ':source' command reads Ex commands from a file line by line. You will
- have to type any needed keyboard input. The ':source!' command reads from a
- script file character by character, interpreting each character as if you
- typed it.
- Example: When you give the ":!ls" command you get the |hit-enter| prompt. If
- you ':source' a file with the line "!ls" in it, you will have to type the
- <Enter> yourself. But if you ':source!' a file with the line ":!ls" in it,
- the next characters from that file are read until a <CR> is found. You will
- not have to type <CR> yourself, unless ":!ls" was the last line in the file.
- It is possible to put ':source[!]' commands in the script file, so you can
- make a top-down hierarchy of script files. The ':source' command can be
- nested as deep as the number of files that can be opened at one time (about
- 15). The ':source!' command can be nested up to 15 levels deep.
- You can use the "<sfile>" string (literally, this is not a special key) inside
- of the sourced file, in places where a file name is expected. It will be
- replaced by the file name of the sourced file. For example, if you have a
- "other.vimrc" file in the same directory as your |init.vim| file, you can
- source it from your |init.vim| file with this command: >
- :source <sfile>:h/other.vimrc
- In script files terminal-dependent key codes are represented by
- terminal-independent two character codes. This means that they can be used
- in the same way on different kinds of terminals. The first character of a
- key code is 0x80 or 128, shown on the screen as "~@". The second one can be
- found in the list |key-notation|. Any of these codes can also be entered
- with CTRL-V followed by the three digit decimal code.
- *:source_crnl* *W15*
- Windows: Files that are read with ":source" normally have <CR><NL> <EOL>s.
- These always work. If you are using a file with <NL> <EOL>s (for example, a
- file made on Unix), this will be recognized if 'fileformats' is not empty and
- the first line does not end in a <CR>. This fails if the first line has
- something like ":map <F1> :help^M", where "^M" is a <CR>. If the first line
- ends in a <CR>, but following ones don't, you will get an error message,
- because the <CR> from the first lines will be lost.
- On other systems, Vim expects ":source"ed files to end in a <NL>. These
- always work. If you are using a file with <CR><NL> <EOL>s (for example, a
- file made on MS-Windows), all lines will have a trailing <CR>. This may cause
- problems for some commands (e.g., mappings). There is no automatic <EOL>
- detection, because it's common to start with a line that defines a mapping
- that ends in a <CR>, which will confuse the automaton.
- *line-continuation*
- Long lines in a ":source"d Ex command script file can be split by inserting
- a line continuation symbol "\" (backslash) at the start of the next line.
- There can be white space before the backslash, which is ignored.
- Example: the lines >
- :set comments=sr:/*,mb:*,el:*/,
- \://,
- \b:#,
- \:%,
- \n:>,
- \fb:-
- are interpreted as if they were given in one line:
- :set comments=sr:/*,mb:*,el:*/,://,b:#,:%,n:>,fb:-
- All leading whitespace characters in the line before a backslash are ignored.
- Note however that trailing whitespace in the line before it cannot be
- inserted freely; it depends on the position where a command is split up
- whether additional whitespace is allowed or not.
- When a space is required it's best to put it right after the backslash. A
- space at the end of a line is hard to see and may be accidentally deleted. >
- :syn match Comment
- \ "very long regexp"
- \ keepend
- There is a problem with the ":append" and ":insert" commands: >
- :1append
- \asdf
- .
- The backslash is seen as a line-continuation symbol, thus this results in the
- command: >
- :1appendasdf
- .
- To avoid this, add the 'C' flag to the 'cpoptions' option: >
- :set cpo+=C
- :1append
- \asdf
- .
- :set cpo-=C
- Note that when the commands are inside a function, you need to add the 'C'
- flag when defining the function, it is not relevant when executing it. >
- :set cpo+=C
- :function Foo()
- :1append
- \asdf
- .
- :endfunction
- :set cpo-=C
- <
- *line-continuation-comment*
- To add a comment in between the lines start with `'"\ '`. Notice the space
- after the backslash. Example: >
- let array = [
- "\ first entry comment
- \ 'first',
- "\ second entry comment
- \ 'second',
- \ ]
- Rationale:
- Most programs work with a trailing backslash to indicate line
- continuation. Using this in Vim would cause incompatibility with Vi.
- For example for this Vi mapping: >
- :map xx asdf\
- < Therefore the unusual leading backslash is used.
- Starting a comment in a continuation line results in all following
- continuation lines to be part of the comment. Since it was like this
- for a long time, when making it possible to add a comment halfway a
- sequence of continuation lines, it was not possible to use \", since
- that was a valid continuation line. Using `'"\ '` comes closest, even
- though it may look a bit weird. Requiring the space after the
- backslash is to make it very unlikely this is a normal comment line.
- ==============================================================================
- Using Vim packages *packages*
- A Vim "package" is a directory that contains |plugin|s. Compared to normal
- plugins, a package can...
- - be downloaded as an archive and unpacked in its own directory, so the files
- are not mixed with files of other plugins.
- - be a git, mercurial, etc. repository, thus easy to update.
- - contain multiple plugins that depend on each other.
- - contain plugins that are automatically loaded on startup ("start" packages,
- located in "pack/*/start/*") and ones that are only loaded when needed with
- |:packadd| ("opt" packages, located in "pack/*/opt/*").
- *runtime-search-path*
- Nvim searches for |:runtime| files in:
- 1. all paths in 'runtimepath'
- 2. all "pack/*/start/*" dirs
- Note that the "pack/*/start/*" paths are not explicitly included in
- 'runtimepath', so they will not be reported by ":set rtp" or "echo &rtp".
- Scripts can use |nvim_list_runtime_paths()| to list all used directories, and
- |nvim_get_runtime_file()| to query for specific files or sub-folders within
- the runtime path. Example: >
- " List all runtime dirs and packages with Lua paths.
- :echo nvim_get_runtime_file("lua/", v:true)
- Using a package and loading automatically ~
- Let's assume your Nvim files are in "~/.local/share/nvim/site" and you want to
- add a package from a zip archive "/tmp/foopack.zip":
- % mkdir -p ~/.local/share/nvim/site/pack/foo
- % cd ~/.local/share/nvim/site/pack/foo
- % unzip /tmp/foopack.zip
- The directory name "foo" is arbitrary, you can pick anything you like.
- You would now have these files under ~/.local/share/nvim/site:
- pack/foo/README.txt
- pack/foo/start/foobar/plugin/foo.vim
- pack/foo/start/foobar/syntax/some.vim
- pack/foo/opt/foodebug/plugin/debugger.vim
- On startup after processing your |config|, Nvim scans all directories in
- 'packpath' for plugins in "pack/*/start/*", then loads the plugins.
- In the example Nvim will find "pack/foo/start/foobar/plugin/foo.vim" and load
- it.
- If the "foobar" plugin kicks in and sets the 'filetype' to "some", Nvim will
- find the syntax/some.vim file, because its directory is in the runtime search
- path.
- Nvim will also load ftdetect files, if there are any.
- Note that the files under "pack/foo/opt" are not loaded automatically, only the
- ones under "pack/foo/start". See |pack-add| below for how the "opt" directory
- is used.
- Loading packages automatically will not happen if loading plugins is disabled,
- see |load-plugins|.
- To load packages earlier, so that plugin/ files are sourced:
- :packloadall
- This also works when loading plugins is disabled. The automatic loading will
- only happen once.
- If the package has an "after" directory, that directory is added to the end of
- 'runtimepath', so that anything there will be loaded later.
- Using a single plugin and loading it automatically ~
- If you don't have a package but a single plugin, you need to create the extra
- directory level:
- % mkdir -p ~/.local/share/nvim/site/pack/foo/start/foobar
- % cd ~/.local/share/nvim/site/pack/foo/start/foobar
- % unzip /tmp/someplugin.zip
- You would now have these files:
- pack/foo/start/foobar/plugin/foo.vim
- pack/foo/start/foobar/syntax/some.vim
- From here it works like above.
- Optional plugins ~
- *pack-add*
- To load an optional plugin from a pack use the `:packadd` command: >
- :packadd foodebug
- This searches for "pack/*/opt/foodebug" in 'packpath' and will find
- ~/.local/share/nvim/site/pack/foo/opt/foodebug/plugin/debugger.vim and source
- it.
- This could be done if some conditions are met. For example, depending on
- whether Nvim supports a feature or a dependency is missing.
- You can also load an optional plugin at startup, by putting this command in
- your |config|: >
- :packadd! foodebug
- The extra "!" is so that the plugin isn't loaded if Nvim was started with
- |--noplugin|.
- It is perfectly normal for a package to only have files in the "opt"
- directory. You then need to load each plugin when you want to use it.
- Where to put what ~
- Since color schemes, loaded with `:colorscheme`, are found below
- "pack/*/start" and "pack/*/opt", you could put them anywhere. We recommend
- you put them below "pack/*/opt", for example
- "~/.config/nvim/pack/mycolors/opt/dark/colors/very_dark.vim".
- Filetype plugins should go under "pack/*/start", so that they are always
- found. Unless you have more than one plugin for a file type and want to
- select which one to load with `:packadd`. E.g. depending on the compiler
- version: >
- if foo_compiler_version > 34
- packadd foo_new
- else
- packadd foo_old
- endif
- The "after" directory is most likely not useful in a package. It's not
- disallowed though.
- ==============================================================================
- Creating Vim packages *package-create*
- This assumes you write one or more plugins that you distribute as a package.
- If you have two unrelated plugins you would use two packages, so that Vim
- users can choose what they include or not. Or you can decide to use one
- package with optional plugins, and tell the user to add the preferred ones with
- `:packadd`.
- Decide how you want to distribute the package. You can create an archive or
- you could use a repository. An archive can be used by more users, but is a
- bit harder to update to a new version. A repository can usually be kept
- up-to-date easily, but it requires a program like "git" to be available.
- You can do both, github can automatically create an archive for a release.
- Your directory layout would be like this:
- start/foobar/plugin/foo.vim " always loaded, defines commands
- start/foobar/plugin/bar.vim " always loaded, defines commands
- start/foobar/autoload/foo.vim " loaded when foo command used
- start/foobar/doc/foo.txt " help for foo.vim
- start/foobar/doc/tags " help tags
- opt/fooextra/plugin/extra.vim " optional plugin, defines commands
- opt/fooextra/autoload/extra.vim " loaded when extra command used
- opt/fooextra/doc/extra.txt " help for extra.vim
- opt/fooextra/doc/tags " help tags
- This allows for the user to do: >
- mkdir ~/.local/share/nvim/site/pack
- cd ~/.local/share/nvim/site/pack
- git clone https://github.com/you/foobar.git myfoobar
- Here "myfoobar" is a name that the user can choose, the only condition is that
- it differs from other packages.
- In your documentation you explain what the plugins do, and tell the user how
- to load the optional plugin: >
- :packadd! fooextra
- You could add this packadd command in one of your plugins, to be executed when
- the optional plugin is needed.
- Run the `:helptags` command to generate the doc/tags file. Including this
- generated file in the package means that the user can drop the package in the
- pack directory and the help command works right away. Don't forget to re-run
- the command after changing the plugin help: >
- :helptags path/start/foobar/doc
- :helptags path/opt/fooextra/doc
- Dependencies between plugins ~
- *packload-two-steps*
- Suppose you have two plugins that depend on the same functionality. You can
- put the common functionality in an autoload directory, so that it will be
- found automatically. Your package would have these files:
- pack/foo/start/one/plugin/one.vim >
- call foolib#getit()
- < pack/foo/start/two/plugin/two.vim >
- call foolib#getit()
- < pack/foo/start/lib/autoload/foolib.vim >
- func foolib#getit()
- This works, because start packages will be searchd for autoload files, when
- sourcing the plugins.
- ==============================================================================
- Debugging scripts *debug-scripts*
- Besides the obvious messages that you can add to your scripts to find out what
- they are doing, Vim offers a debug mode. This allows you to step through a
- sourced file or user function and set breakpoints.
- NOTE: The debugging mode is far from perfect. Debugging will have side
- effects on how Vim works. You cannot use it to debug everything. For
- example, the display is messed up by the debugging messages.
- An alternative to debug mode is setting the 'verbose' option. With a bigger
- number it will give more verbose messages about what Vim is doing.
- STARTING DEBUG MODE *debug-mode*
- To enter debugging mode use one of these methods:
- 1. Start Vim with the |-D| argument: >
- vim -D file.txt
- < Debugging will start as soon as the first vimrc file is sourced. This is
- useful to find out what is happening when Vim is starting up. A side
- effect is that Vim will switch the terminal mode before initialisations
- have finished, with unpredictable results.
- For a GUI-only version (Windows) the debugging will start as
- soon as the GUI window has been opened. To make this happen early, add a
- ":gui" command in the vimrc file.
- *:debug*
- 2. Run a command with ":debug" prepended. Debugging will only be done while
- this command executes. Useful for debugging a specific script or user
- function. And for scripts and functions used by autocommands. Example: >
- :debug edit test.txt.gz
- 3. Set a breakpoint in a sourced file or user function. You could do this in
- the command line: >
- vim -c "breakadd file */explorer.vim" .
- < This will run Vim and stop in the first line of the "explorer.vim" script.
- Breakpoints can also be set while in debugging mode.
- In debugging mode every executed command is displayed before it is executed.
- Comment lines, empty lines and lines that are not executed are skipped. When
- a line contains two commands, separated by "|", each command will be displayed
- separately.
- DEBUG MODE
- Once in debugging mode, the usual Ex commands can be used. For example, to
- inspect the value of a variable: >
- echo idx
- When inside a user function, this will print the value of the local variable
- "idx". Prepend "g:" to get the value of a global variable: >
- echo g:idx
- All commands are executed in the context of the current function or script.
- You can also set options, for example setting or resetting 'verbose' will show
- what happens, but you might want to set it just before executing the lines you
- are interested in: >
- :set verbose=20
- Commands that require updating the screen should be avoided, because their
- effect won't be noticed until after leaving debug mode. For example: >
- :help
- won't be very helpful.
- There is a separate command-line history for debug mode.
- The line number for a function line is relative to the start of the function.
- If you have trouble figuring out where you are, edit the file that defines
- the function in another Vim, search for the start of the function and do
- "99j". Replace "99" with the line number.
- Additionally, these commands can be used:
- *>cont*
- cont Continue execution until the next breakpoint is hit.
- *>quit*
- quit Abort execution. This is like using CTRL-C, some
- things might still be executed, doesn't abort
- everything. Still stops at the next breakpoint.
- *>next*
- next Execute the command and come back to debug mode when
- it's finished. This steps over user function calls
- and sourced files.
- *>step*
- step Execute the command and come back to debug mode for
- the next command. This steps into called user
- functions and sourced files.
- *>interrupt*
- interrupt This is like using CTRL-C, but unlike ">quit" comes
- back to debug mode for the next command that is
- executed. Useful for testing |:finally| and |:catch|
- on interrupt exceptions.
- *>finish*
- finish Finish the current script or user function and come
- back to debug mode for the command after the one that
- sourced or called it.
- *>bt*
- *>backtrace*
- *>where*
- backtrace Show the call stacktrace for current debugging session.
- bt
- where
- *>frame*
- frame N Goes to N backtrace level. + and - signs make movement
- relative. E.g., ":frame +3" goes three frames up.
- *>up*
- up Goes one level up from call stacktrace.
- *>down*
- down Goes one level down from call stacktrace.
- About the additional commands in debug mode:
- - There is no command-line completion for them, you get the completion for the
- normal Ex commands only.
- - You can shorten them, up to a single character, unless more than one command
- starts with the same letter. "f" stands for "finish", use "fr" for "frame".
- - Hitting <CR> will repeat the previous one. When doing another command, this
- is reset (because it's not clear what you want to repeat).
- - When you want to use the Ex command with the same name, prepend a colon:
- ":cont", ":next", ":finish" (or shorter).
- The backtrace shows the hierarchy of function calls, e.g.:
- >bt ~
- 3 function One[3] ~
- 2 Two[3] ~
- ->1 Three[3] ~
- 0 Four ~
- line 1: let four = 4 ~
- The "->" points to the current frame. Use "up", "down" and "frame N" to
- select another frame.
- In the current frame you can evaluate the local function variables. There is
- no way to see the command at the current line yet.
- DEFINING BREAKPOINTS
- *:breaka* *:breakadd*
- :breaka[dd] func [lnum] {name}
- Set a breakpoint in a function. Example: >
- :breakadd func Explore
- < Doesn't check for a valid function name, thus the breakpoint
- can be set before the function is defined.
- :breaka[dd] file [lnum] {name}
- Set a breakpoint in a sourced file. Example: >
- :breakadd file 43 init.vim
- :breaka[dd] here
- Set a breakpoint in the current line of the current file.
- Like doing: >
- :breakadd file <cursor-line> <current-file>
- < Note that this only works for commands that are executed when
- sourcing the file, not for a function defined in that file.
- :breaka[dd] expr {expression}
- Sets a breakpoint, that will break whenever the {expression}
- evaluates to a different value. Example: >
- :breakadd expr g:lnum
- < Will break, whenever the global variable lnum changes.
- Errors in evaluation are suppressed, you can use the name of a
- variable that does not exist yet. This also means you will
- not notice anything if the expression has a mistake.
- Note if you watch a |script-variable| this will break
- when switching scripts, since the script variable is only
- valid in the script where it has been defined and if that
- script is called from several other scripts, this will stop
- whenever that particular variable will become visible or
- inaccessible again.
- The [lnum] is the line number of the breakpoint. Vim will stop at or after
- this line. When omitted line 1 is used.
- *:debug-name*
- {name} is a pattern that is matched with the file or function name. The
- pattern is like what is used for autocommands. There must be a full match (as
- if the pattern starts with "^" and ends in "$"). A "*" matches any sequence
- of characters. 'ignorecase' is not used, but "\c" can be used in the pattern
- to ignore case |/\c|. Don't include the () for the function name!
- The match for sourced scripts is done against the full file name. If no path
- is specified the current directory is used. Examples: >
- breakadd file explorer.vim
- matches "explorer.vim" in the current directory. >
- breakadd file *explorer.vim
- matches ".../plugin/explorer.vim", ".../plugin/iexplorer.vim", etc. >
- breakadd file */explorer.vim
- matches ".../plugin/explorer.vim" and "explorer.vim" in any other directory.
- The match for functions is done against the name as it's shown in the output
- of ":function". For local functions this means that something like "<SNR>99_"
- is prepended.
- Note that functions are first loaded and later executed. When they are loaded
- the "file" breakpoints are checked, when they are executed the "func"
- breakpoints.
- DELETING BREAKPOINTS
- *:breakd* *:breakdel* *E161*
- :breakd[el] {nr}
- Delete breakpoint {nr}. Use |:breaklist| to see the number of
- each breakpoint.
- :breakd[el] *
- Delete all breakpoints.
- :breakd[el] func [lnum] {name}
- Delete a breakpoint in a function.
- :breakd[el] file [lnum] {name}
- Delete a breakpoint in a sourced file.
- :breakd[el] here
- Delete a breakpoint at the current line of the current file.
- When [lnum] is omitted, the first breakpoint in the function or file is
- deleted.
- The {name} must be exactly the same as what was typed for the ":breakadd"
- command. "explorer", "*explorer.vim" and "*explorer*" are different.
- LISTING BREAKPOINTS
- *:breakl* *:breaklist*
- :breakl[ist]
- List all breakpoints.
- OBSCURE
- *:debugg* *:debuggreedy*
- :debugg[reedy]
- Read debug mode commands from the normal input stream, instead
- of getting them directly from the user. Only useful for test
- scripts. Example: >
- echo 'q^Mq' | vim -e -s -c debuggreedy -c 'breakadd file script.vim' -S script.vim
- :0debugg[reedy]
- Undo ":debuggreedy": get debug mode commands directly from the
- user, don't use typeahead for debug commands.
- ==============================================================================
- Profiling *profile* *profiling*
- Profiling means that Vim measures the time that is spent on executing
- functions and/or scripts.
- You can also use the |reltime()| function to measure time.
- For profiling syntax highlighting see |:syntime|.
- For example, to profile the one_script.vim script file: >
- :profile start /tmp/one_script_profile
- :profile file one_script.vim
- :source one_script.vim
- :exit
- :prof[ile] start {fname} *:prof* *:profile* *E750*
- Start profiling, write the output in {fname} upon exit.
- "~/" and environment variables in {fname} will be expanded.
- If {fname} already exists it will be silently overwritten.
- The variable |v:profiling| is set to one.
- :prof[ile] stop
- Write the logfile and stop profiling.
- :prof[ile] pause
- Don't profile until the following ":profile continue". Can be
- used when doing something that should not be counted (e.g., an
- external command). Does not nest.
- :prof[ile] continue
- Continue profiling after ":profile pause".
- :prof[ile] func {pattern}
- Profile function that matches the pattern {pattern}.
- See |:debug-name| for how {pattern} is used.
- :prof[ile][!] file {pattern}
- Profile script file that matches the pattern {pattern}.
- See |:debug-name| for how {pattern} is used.
- This only profiles the script itself, not the functions
- defined in it.
- When the [!] is added then all functions defined in the script
- will also be profiled.
- Note that profiling only starts when the script is loaded
- after this command. A :profile command in the script itself
- won't work.
- :prof[ile] dump
- Don't wait until exiting Vim and write the current state of
- profiling to the log immediately.
- :profd[el] ... *:profd* *:profdel*
- Stop profiling for the arguments specified. See |:breakdel|
- for the arguments.
- You must always start with a ":profile start fname" command. The resulting
- file is written when Vim exits. Here is an example of the output, with line
- numbers prepended for the explanation:
- 1 FUNCTION Test2() ~
- 2 Called 1 time ~
- 3 Total time: 0.155251 ~
- 4 Self time: 0.002006 ~
- 5 ~
- 6 count total (s) self (s) ~
- 7 9 0.000096 for i in range(8) ~
- 8 8 0.153655 0.000410 call Test3() ~
- 9 8 0.000070 endfor ~
- 10 " Ask a question ~
- 11 1 0.001341 echo input("give me an answer: ") ~
- The header (lines 1-4) gives the time for the whole function. The "Total"
- time is the time passed while the function was executing. The "Self" time is
- the "Total" time reduced by time spent in:
- - other user defined functions
- - sourced scripts
- - executed autocommands
- - external (shell) commands
- Lines 7-11 show the time spent in each executed line. Lines that are not
- executed do not count. Thus a comment line is never counted.
- The Count column shows how many times a line was executed. Note that the
- "for" command in line 7 is executed one more time as the following lines.
- That is because the line is also executed to detect the end of the loop.
- The time Vim spends waiting for user input isn't counted at all. Thus how
- long you take to respond to the input() prompt is irrelevant.
- Profiling should give a good indication of where time is spent, but keep in
- mind there are various things that may clobber the results:
- - Real elapsed time is measured, if other processes are busy they may cause
- delays at unpredictable moments. You may want to run the profiling several
- times and use the lowest results.
- - If you have several commands in one line you only get one time. Split the
- line to see the time for the individual commands.
- - The time of the lines added up is mostly less than the time of the whole
- function. There is some overhead in between.
- - Functions that are deleted before Vim exits will not produce profiling
- information. You can check the |v:profiling| variable if needed: >
- :if !v:profiling
- : delfunc MyFunc
- :endif
- <
- - Profiling may give weird results on multi-processor systems, when sleep
- mode kicks in or the processor frequency is reduced to save power.
- - The "self" time is wrong when a function is used recursively.
- ==============================================================================
- Context *Context* *context*
- The editor state is represented by the Context concept. This includes things
- like the current |jumplist|, values of |registers|, and more, described below.
- *context-types*
- The following Context items are supported:
- "jumps" |jumplist|
- "regs" |registers|
- "bufs" |buffer-list|
- "gvars" |global-variable|s
- "sfuncs" |script-local| functions
- "funcs" global and |script-local| functions
- *context-dict*
- Context objects are dictionaries with the following key-value pairs:
- - "jumps", "regs", "bufs", "gvars":
- |readfile()|-style |List| representation of corresponding msgpack
- objects (see |msgpackdump()| and |msgpackparse()|).
- - "funcs" (includes |script-local| functions as well):
- |List| of |:function| definitions.
- *context-stack*
- An initially-empty internal Context stack is maintained by the ctx-family
- functions (see |ctx-functions|).
- vim:tw=78:ts=8:noet:ft=help:norl:
|