mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	doc + extmarks tweaks #11421
- nvim_buf_get_extmarks: rename "amount" => "limit" - rename `set_extmark_index_from_obj`
This commit is contained in:
		| @@ -19,6 +19,7 @@ API Usage						*api-rpc* *RPC* *rpc* | |||||||
| 							*msgpack-rpc* | 							*msgpack-rpc* | ||||||
| RPC is the typical way to control Nvim programmatically.  Nvim implements the | RPC is the typical way to control Nvim programmatically.  Nvim implements the | ||||||
| MessagePack-RPC protocol: | MessagePack-RPC protocol: | ||||||
|  |   https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md | ||||||
|   https://github.com/msgpack/msgpack/blob/0b8f5ac/spec.md |   https://github.com/msgpack/msgpack/blob/0b8f5ac/spec.md | ||||||
|  |  | ||||||
| Many clients use the API: user interfaces (GUIs), remote plugins, scripts like | Many clients use the API: user interfaces (GUIs), remote plugins, scripts like | ||||||
| @@ -935,8 +936,8 @@ nvim_open_win({buffer}, {enter}, {config})                   *nvim_open_win()* | |||||||
|                                   'list' options. 'signcolumn' is changed to |                                   'list' options. 'signcolumn' is changed to | ||||||
|                                   `auto` and 'colorcolumn' is cleared. The |                                   `auto` and 'colorcolumn' is cleared. The | ||||||
|                                   end-of-buffer region is hidden by setting |                                   end-of-buffer region is hidden by setting | ||||||
|                                   `eob` flag of 'fillchars' to a space char, and |                                   `eob` flag of 'fillchars' to a space char, | ||||||
|                                   clearing the |EndOfBuffer| region in |                                   and clearing the |EndOfBuffer| region in | ||||||
|                                   'winhighlight'. |                                   'winhighlight'. | ||||||
|  |  | ||||||
|                 Return: ~ |                 Return: ~ | ||||||
| @@ -1022,7 +1023,7 @@ nvim_put({lines}, {type}, {after}, {follow})                      *nvim_put()* | |||||||
|                     {type}    Edit behavior: any |getregtype()| result, or: |                     {type}    Edit behavior: any |getregtype()| result, or: | ||||||
|                               • "b" |blockwise-visual| mode (may include |                               • "b" |blockwise-visual| mode (may include | ||||||
|                                 width, e.g. "b3") |                                 width, e.g. "b3") | ||||||
|                               • "c" |characterwise| mode |                               • "c" |charwise| mode | ||||||
|                               • "l" |linewise| mode |                               • "l" |linewise| mode | ||||||
|                               • "" guess by contents, see |setreg()| |                               • "" guess by contents, see |setreg()| | ||||||
|                     {after}   Insert after cursor (like |p|), or before (like |                     {after}   Insert after cursor (like |p|), or before (like | ||||||
| @@ -1797,81 +1798,93 @@ nvim_buf_get_extmark_by_id({buffer}, {ns_id}, {id}) | |||||||
|                 Returns position for a given extmark id |                 Returns position for a given extmark id | ||||||
|  |  | ||||||
|                 Parameters: ~ |                 Parameters: ~ | ||||||
|                     {buffer}     The buffer handle |                     {buffer}  Buffer handle, or 0 for current buffer | ||||||
|                     {namespace}  a identifier returned previously with |                     {ns_id}   Namespace id from |nvim_create_namespace()| | ||||||
|                                  nvim_create_namespace |                     {id}      Extmark id | ||||||
|                     {id}         the extmark id |  | ||||||
|  |  | ||||||
|                 Return: ~ |                 Return: ~ | ||||||
|                     (row, col) tuple or empty list () if extmark id was absent |                     (row, col) tuple or empty list () if extmark id was absent | ||||||
|  |  | ||||||
|                                                      *nvim_buf_get_extmarks()* |                                                      *nvim_buf_get_extmarks()* | ||||||
| nvim_buf_get_extmarks({buffer}, {ns_id}, {start}, {end}, {opts}) | nvim_buf_get_extmarks({buffer}, {ns_id}, {start}, {end}, {opts}) | ||||||
|                 List extmarks in a range (inclusive) |                 Gets extmarks in "traversal order" from a |charwise| region | ||||||
|  |                 defined by buffer positions (inclusive, 0-indexed | ||||||
|  |                 |api-indexing|). | ||||||
|  |  | ||||||
|                 range ends can be specified as (row, col) tuples, as well as |                 Region can be given as (row,col) tuples, or valid extmark ids | ||||||
|                 extmark ids in the same namespace. In addition, 0 and -1 works |                 (whose positions define the bounds). 0 and -1 are understood | ||||||
|                 as shorthands for (0,0) and (-1,-1) respectively, so that all |                 as (0,0) and (-1,-1) respectively, thus the following are | ||||||
|                 marks in the buffer can be queried as: |                 equivalent: | ||||||
|  | > | ||||||
|  |                   nvim_buf_get_extmarks(0, my_ns, 0, -1, {}) | ||||||
|  |                   nvim_buf_get_extmarks(0, my_ns, [0,0], [-1,-1], {}) | ||||||
|  | < | ||||||
|  |  | ||||||
|                 all_marks = nvim_buf_get_extmarks(0, my_ns, 0, -1, {}) |                 If `end` is less than `start` , traversal works backwards. | ||||||
|  |                 (Useful with `limit` , to get the first marks prior to a given | ||||||
|  |                 position.) | ||||||
|  |  | ||||||
|                 If end is a lower position than start, then the range will be |                 Example: | ||||||
|                 traversed backwards. This is mostly useful with limited | > | ||||||
|                 amount, to be able to get the first marks prior to a given |                   local a   = vim.api | ||||||
|                 position. |                   local pos = a.nvim_win_get_cursor(0) | ||||||
|  |                   local ns  = a.nvim_create_namespace('my-plugin') | ||||||
|  |                   -- Create new extmark at line 1, column 1. | ||||||
|  |                   local m1  = a.nvim_buf_set_extmark(0, ns, 0, 0, 0, {}) | ||||||
|  |                   -- Create new extmark at line 3, column 1. | ||||||
|  |                   local m2  = a.nvim_buf_set_extmark(0, ns, 0, 2, 0, {}) | ||||||
|  |                   -- Get extmarks only from line 3. | ||||||
|  |                   local ms  = a.nvim_buf_get_extmarks(0, ns, {2,0}, {2,0}, {}) | ||||||
|  |                   -- Get all marks in this buffer + namespace. | ||||||
|  |                   local all = a.nvim_buf_get_extmarks(0, ns, 0, -1, {}) | ||||||
|  |                   print(vim.inspect(ms)) | ||||||
|  | < | ||||||
|  |  | ||||||
|                 Parameters: ~ |                 Parameters: ~ | ||||||
|                     {buffer}  The buffer handle |                     {buffer}  Buffer handle, or 0 for current buffer | ||||||
|                     {ns_id}   An id returned previously from |                     {ns_id}   Namespace id from |nvim_create_namespace()| | ||||||
|                               nvim_create_namespace |                     {start}   Start of range, given as (row, col) or valid | ||||||
|                     {start}   One of: extmark id, (row, col) or 0, -1 for |                               extmark id (whose position defines the bound) | ||||||
|                               buffer ends |                     {end}     End of range, given as (row, col) or valid | ||||||
|                     {end}     One of: extmark id, (row, col) or 0, -1 for |                               extmark id (whose position defines the bound) | ||||||
|                               buffer ends |                     {opts}    Optional parameters. Keys: | ||||||
|                     {opts}    additional options. Supports the keys: |                               • limit: Maximum number of marks to return | ||||||
|                               • amount: Maximum number of marks to return |  | ||||||
|  |  | ||||||
|                 Return: ~ |                 Return: ~ | ||||||
|                     [[extmark_id, row, col], ...] |                     List of [extmark_id, row, col] tuples in "traversal | ||||||
|  |                     order". | ||||||
|  |  | ||||||
|                                                       *nvim_buf_set_extmark()* |                                                       *nvim_buf_set_extmark()* | ||||||
| nvim_buf_set_extmark({buffer}, {ns_id}, {id}, {line}, {col}, {opts}) | nvim_buf_set_extmark({buffer}, {ns_id}, {id}, {line}, {col}, {opts}) | ||||||
|                 Create or update an extmark at a position |                 Creates or updates an extmark. | ||||||
|  |  | ||||||
|                 If an invalid namespace is given, an error will be raised. |                 To create a new extmark, pass id=0. The extmark id will be | ||||||
|  |                 returned. It is also allowed to create a new mark by passing | ||||||
|                 To create a new extmark, pass in id=0. The new extmark id will |                 in a previously unused id, but the caller must then keep track | ||||||
|                 be returned. To move an existing mark, pass in its id. |                 of existing and unused ids itself. (Useful over RPC, to avoid | ||||||
|  |                 waiting for the return value.) | ||||||
|                 It is also allowed to create a new mark by passing in a |  | ||||||
|                 previously unused id, but the caller must then keep track of |  | ||||||
|                 existing and unused ids itself. This is mainly useful over |  | ||||||
|                 RPC, to avoid needing to wait for the return value. |  | ||||||
|  |  | ||||||
|                 Parameters: ~ |                 Parameters: ~ | ||||||
|                     {buffer}  The buffer handle |                     {buffer}  Buffer handle, or 0 for current buffer | ||||||
|                     {ns_id}   a identifier returned previously with |                     {ns_id}   Namespace id from |nvim_create_namespace()| | ||||||
|                               nvim_create_namespace |                     {id}      Extmark id, or 0 to create new | ||||||
|                     {id}      The extmark's id or 0 to create a new mark. |                     {line}    Line number where to place the mark | ||||||
|                     {line}    The row to set the extmark to. |                     {col}     Column where to place the mark | ||||||
|                     {col}     The column to set the extmark to. |  | ||||||
|                     {opts}    Optional parameters. Currently not used. |                     {opts}    Optional parameters. Currently not used. | ||||||
|  |  | ||||||
|                 Return: ~ |                 Return: ~ | ||||||
|                     the id of the extmark. |                     Id of the created/updated extmark | ||||||
|  |  | ||||||
| nvim_buf_del_extmark({buffer}, {ns_id}, {id})         *nvim_buf_del_extmark()* | nvim_buf_del_extmark({buffer}, {ns_id}, {id})         *nvim_buf_del_extmark()* | ||||||
|                 Remove an extmark |                 Removes an extmark. | ||||||
|  |  | ||||||
|                 Parameters: ~ |                 Parameters: ~ | ||||||
|                     {buffer}  The buffer handle |                     {buffer}  Buffer handle, or 0 for current buffer | ||||||
|                     {ns_id}   a identifier returned previously with |                     {ns_id}   Namespace id from |nvim_create_namespace()| | ||||||
|                               nvim_create_namespace |                     {id}      Extmark id | ||||||
|                     {id}      The extmarks's id |  | ||||||
|  |  | ||||||
|                 Return: ~ |                 Return: ~ | ||||||
|                     true on success, false if the extmark was not found. |                     true if the extmark was found, else false | ||||||
|  |  | ||||||
|                                                     *nvim_buf_add_highlight()* |                                                     *nvim_buf_add_highlight()* | ||||||
| nvim_buf_add_highlight({buffer}, {ns_id}, {hl_group}, {line}, | nvim_buf_add_highlight({buffer}, {ns_id}, {hl_group}, {line}, | ||||||
| @@ -1916,8 +1929,8 @@ nvim_buf_add_highlight({buffer}, {ns_id}, {hl_group}, {line}, | |||||||
|  |  | ||||||
|                                                   *nvim_buf_clear_namespace()* |                                                   *nvim_buf_clear_namespace()* | ||||||
| nvim_buf_clear_namespace({buffer}, {ns_id}, {line_start}, {line_end}) | nvim_buf_clear_namespace({buffer}, {ns_id}, {line_start}, {line_end}) | ||||||
|                 Clears namespaced objects, highlights and virtual text, from a |                 Clears namespaced objects (highlights, extmarks, virtual text) | ||||||
|                 line range |                 from a region. | ||||||
|  |  | ||||||
|                 Lines are 0-indexed. |api-indexing| To clear the namespace in |                 Lines are 0-indexed. |api-indexing| To clear the namespace in | ||||||
|                 the entire buffer, specify line_start=0 and line_end=-1. |                 the entire buffer, specify line_start=0 and line_end=-1. | ||||||
|   | |||||||
| @@ -90,7 +90,7 @@ start and end of the motion are not in the same line, and there are only | |||||||
| blanks before the start and there are no non-blanks after the end of the | blanks before the start and there are no non-blanks after the end of the | ||||||
| motion, the delete becomes linewise.  This means that the delete also removes | motion, the delete becomes linewise.  This means that the delete also removes | ||||||
| the line of blanks that you might expect to remain. Use the |o_v| operator to | the line of blanks that you might expect to remain. Use the |o_v| operator to | ||||||
| force the motion to be characterwise. | force the motion to be charwise. | ||||||
|  |  | ||||||
| Trying to delete an empty region of text (e.g., "d0" in the first column) | Trying to delete an empty region of text (e.g., "d0" in the first column) | ||||||
| is an error when 'cpoptions' includes the 'E' flag. | is an error when 'cpoptions' includes the 'E' flag. | ||||||
| @@ -1074,7 +1074,7 @@ also use these commands to move text from one file to another, because Vim | |||||||
| preserves all registers when changing buffers (the CTRL-^ command is a quick | preserves all registers when changing buffers (the CTRL-^ command is a quick | ||||||
| way to toggle between two files). | way to toggle between two files). | ||||||
|  |  | ||||||
| 				*linewise-register* *characterwise-register* | 				*linewise-register* *charwise-register* | ||||||
| You can repeat the put commands with "." (except for :put) and undo them.  If | You can repeat the put commands with "." (except for :put) and undo them.  If | ||||||
| the command that was used to get the text into the register was |linewise|, | the command that was used to get the text into the register was |linewise|, | ||||||
| Vim inserts the text below ("p") or above ("P") the line where the cursor is. | Vim inserts the text below ("p") or above ("P") the line where the cursor is. | ||||||
| @@ -1116,10 +1116,9 @@ this happen.  However, if the width of the block is not a multiple of a <Tab> | |||||||
| width and the text after the inserted block contains <Tab>s, that text may be | width and the text after the inserted block contains <Tab>s, that text may be | ||||||
| misaligned. | misaligned. | ||||||
|  |  | ||||||
| Note that after a characterwise yank command, Vim leaves the cursor on the | Note that after a charwise yank command, Vim leaves the cursor on the first | ||||||
| first yanked character that is closest to the start of the buffer.  This means | yanked character that is closest to the start of the buffer.  This means that | ||||||
| that "yl" doesn't move the cursor, but "yh" moves the cursor one character | "yl" doesn't move the cursor, but "yh" moves the cursor one character left. | ||||||
| left. |  | ||||||
| Rationale:	In Vi the "y" command followed by a backwards motion would | Rationale:	In Vi the "y" command followed by a backwards motion would | ||||||
| 		sometimes not move the cursor to the first yanked character, | 		sometimes not move the cursor to the first yanked character, | ||||||
| 		because redisplaying was skipped.  In Vim it always moves to | 		because redisplaying was skipped.  In Vim it always moves to | ||||||
|   | |||||||
| @@ -4727,7 +4727,7 @@ getreg([{regname} [, 1 [, {list}]]])			*getreg()* | |||||||
| getregtype([{regname}])					*getregtype()* | getregtype([{regname}])					*getregtype()* | ||||||
| 		The result is a String, which is type of register {regname}. | 		The result is a String, which is type of register {regname}. | ||||||
| 		The value will be one of: | 		The value will be one of: | ||||||
| 		    "v"			for |characterwise| text | 		    "v"			for |charwise| text | ||||||
| 		    "V"			for |linewise| text | 		    "V"			for |linewise| text | ||||||
| 		    "<CTRL-V>{width}"	for |blockwise-visual| text | 		    "<CTRL-V>{width}"	for |blockwise-visual| text | ||||||
| 		    ""			for an empty or unknown register | 		    ""			for an empty or unknown register | ||||||
| @@ -6131,7 +6131,7 @@ mode([expr])	Return a string that indicates the current mode. | |||||||
|  |  | ||||||
| 		   n	    Normal | 		   n	    Normal | ||||||
| 		   no	    Operator-pending | 		   no	    Operator-pending | ||||||
| 		   nov	    Operator-pending (forced characterwise |o_v|) | 		   nov	    Operator-pending (forced charwise |o_v|) | ||||||
| 		   noV	    Operator-pending (forced linewise |o_V|) | 		   noV	    Operator-pending (forced linewise |o_V|) | ||||||
| 		   noCTRL-V Operator-pending (forced blockwise |o_CTRL-V|) | 		   noCTRL-V Operator-pending (forced blockwise |o_CTRL-V|) | ||||||
| 		   niI	    Normal using |i_CTRL-O| in |Insert-mode| | 		   niI	    Normal using |i_CTRL-O| in |Insert-mode| | ||||||
| @@ -7441,7 +7441,7 @@ setreg({regname}, {value} [, {options}]) | |||||||
| 		If {options} contains "a" or {regname} is upper case, | 		If {options} contains "a" or {regname} is upper case, | ||||||
| 		then the value is appended. | 		then the value is appended. | ||||||
| 		{options} can also contain a register type specification: | 		{options} can also contain a register type specification: | ||||||
| 		    "c" or "v"	      |characterwise| mode | 		    "c" or "v"	      |charwise| mode | ||||||
| 		    "l" or "V"	      |linewise| mode | 		    "l" or "V"	      |linewise| mode | ||||||
| 		    "b" or "<CTRL-V>" |blockwise-visual| mode | 		    "b" or "<CTRL-V>" |blockwise-visual| mode | ||||||
| 		If a number immediately follows "b" or "<CTRL-V>" then this is | 		If a number immediately follows "b" or "<CTRL-V>" then this is | ||||||
| @@ -9708,7 +9708,7 @@ This does NOT work: > | |||||||
| 			register, "@/" for the search pattern. | 			register, "@/" for the search pattern. | ||||||
| 			If the result of {expr1} ends in a <CR> or <NL>, the | 			If the result of {expr1} ends in a <CR> or <NL>, the | ||||||
| 			register will be linewise, otherwise it will be set to | 			register will be linewise, otherwise it will be set to | ||||||
| 			characterwise. | 			charwise. | ||||||
| 			This can be used to clear the last search pattern: > | 			This can be used to clear the last search pattern: > | ||||||
| 				:let @/ = "" | 				:let @/ = "" | ||||||
| <			This is different from searching for an empty string, | <			This is different from searching for an empty string, | ||||||
|   | |||||||
| @@ -404,7 +404,7 @@ tag		char	      note action in Normal mode	~ | |||||||
| |t|		t{char}		1  cursor till before Nth occurrence of {char} | |t|		t{char}		1  cursor till before Nth occurrence of {char} | ||||||
| 				   to the right | 				   to the right | ||||||
| |u|		u		2  undo changes | |u|		u		2  undo changes | ||||||
| |v|		v		   start characterwise Visual mode | |v|		v		   start charwise Visual mode | ||||||
| |w|		w		1  cursor N words forward | |w|		w		1  cursor N words forward | ||||||
| |x|		["x]x		2  delete N characters under and after the | |x|		["x]x		2  delete N characters under and after the | ||||||
| 				   cursor [into register x] | 				   cursor [into register x] | ||||||
| @@ -866,7 +866,7 @@ These can be used after an operator, but before a {motion} has been entered. | |||||||
|  |  | ||||||
| tag		char		action in Operator-pending mode	~ | tag		char		action in Operator-pending mode	~ | ||||||
| ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ||||||
| |o_v|		v		force operator to work characterwise | |o_v|		v		force operator to work charwise | ||||||
| |o_V|		V		force operator to work linewise | |o_V|		V		force operator to work linewise | ||||||
| |o_CTRL-V|	CTRL-V		force operator to work blockwise | |o_CTRL-V|	CTRL-V		force operator to work blockwise | ||||||
|  |  | ||||||
| @@ -978,7 +978,7 @@ tag		command	      note action in Visual mode	~ | |||||||
| |v_r|		r		2  replace highlighted area with a character | |v_r|		r		2  replace highlighted area with a character | ||||||
| |v_s|		s		2  delete highlighted area and start insert | |v_s|		s		2  delete highlighted area and start insert | ||||||
| |v_u|		u		2  make highlighted area lowercase | |v_u|		u		2  make highlighted area lowercase | ||||||
| |v_v|		v		   make Visual mode characterwise or stop | |v_v|		v		   make Visual mode charwise or stop | ||||||
| 				   Visual mode | 				   Visual mode | ||||||
| |v_x|		x		2  delete the highlighted area | |v_x|		x		2  delete the highlighted area | ||||||
| |v_y|		y		   yank the highlighted area | |v_y|		y		   yank the highlighted area | ||||||
|   | |||||||
| @@ -271,7 +271,7 @@ and <> are part of what you type, the context should make this clear. | |||||||
| 		  operator is pending. | 		  operator is pending. | ||||||
| 		- Ex commands can be used to move the cursor.  This can be | 		- Ex commands can be used to move the cursor.  This can be | ||||||
| 		  used to call a function that does some complicated motion. | 		  used to call a function that does some complicated motion. | ||||||
| 		  The motion is always characterwise exclusive, no matter | 		  The motion is always charwise exclusive, no matter | ||||||
| 		  what ":" command is used.  This means it's impossible to | 		  what ":" command is used.  This means it's impossible to | ||||||
| 		  include the last character of a line without the line break | 		  include the last character of a line without the line break | ||||||
| 		  (unless 'virtualedit' is set). | 		  (unless 'virtualedit' is set). | ||||||
|   | |||||||
| @@ -1,18 +1,18 @@ | |||||||
| *lsp.txt* The Language Server Protocol | *lsp.txt*   Nvim LSP API | ||||||
|  |  | ||||||
|                             NVIM REFERENCE MANUAL |                             NVIM REFERENCE MANUAL | ||||||
|  |  | ||||||
|  |  | ||||||
| Neovim Language Server Protocol (LSP) API | Nvim Language Server Protocol (LSP) API                                *lsp* | ||||||
|  |  | ||||||
| Neovim exposes a powerful API that conforms to Microsoft's published Language | Nvim is a client to the Language Server Protocol: | ||||||
| Server Protocol specification. The documentation can be found here: |  | ||||||
|  |  | ||||||
|   https://microsoft.github.io/language-server-protocol/ |   https://microsoft.github.io/language-server-protocol/ | ||||||
|  |  | ||||||
|  |                                       Type |gO| to see the table of contents. | ||||||
|  |  | ||||||
| ================================================================================ | ================================================================================ | ||||||
|                                                                        *lsp-api* | LSP API                                                                *lsp-api* | ||||||
|  |  | ||||||
| Neovim exposes a API for the language server protocol. To get the real benefits | Neovim exposes a API for the language server protocol. To get the real benefits | ||||||
| of this API, a language server must be installed. | of this API, a language server must be installed. | ||||||
| @@ -261,13 +261,16 @@ vim.lsp.rpc_response_error({code}, [{message}], [{data}]) | |||||||
|   the server. |   the server. | ||||||
|  |  | ||||||
| ================================================================================ | ================================================================================ | ||||||
|  | LSP CALLBACKS                                           *lsp-callbacks* | ||||||
|  |  | ||||||
|  | DEFAULT CALLBACKS ~ | ||||||
|                                                    *vim.lsp.default_callbacks* |                                                    *vim.lsp.default_callbacks* | ||||||
|  | The `vim.lsp.default_callbacks` table defines default callbacks used when | ||||||
|  | creating a new client. Keys are LSP method names: > | ||||||
|  |  | ||||||
| The |vim.lsp.default_callbacks| table contains the default |lsp-callbacks| |   :lua print(vim.inspect(vim.tbl_keys(vim.lsp.default_callbacks))) | ||||||
| that are used when creating a new client. The keys are the LSP method names. |  | ||||||
|  |  | ||||||
| The following requests and notifications have built-in callbacks defined to | These LSP requests/notifications are defined by default: | ||||||
| handle the response in an idiomatic way. |  | ||||||
|  |  | ||||||
|   textDocument/publishDiagnostics |   textDocument/publishDiagnostics | ||||||
|   window/logMessage |   window/logMessage | ||||||
| @@ -290,38 +293,40 @@ Use cases: | |||||||
| Any callbacks passed directly to `request` methods on a server client will | Any callbacks passed directly to `request` methods on a server client will | ||||||
| have the highest precedence, followed by the `default_callbacks`. | have the highest precedence, followed by the `default_callbacks`. | ||||||
|  |  | ||||||
| More information about callbacks can be found in |lsp-callbacks|. | You can override the default handlers, | ||||||
|  | - globally: by modifying the `vim.lsp.default_callbacks` table | ||||||
|  | - per-client: by passing the {callbacks} table parameter to | ||||||
|  |   |vim.lsp.start_client| | ||||||
|  |  | ||||||
| ================================================================================ | Each handler has this signature: > | ||||||
|                                                                  *lsp-callbacks* |  | ||||||
|  |   function(err, method, params, client_id) | ||||||
|  |  | ||||||
| Callbacks are functions which are called in a variety of situations by the | Callbacks are functions which are called in a variety of situations by the | ||||||
| client. Their signature is `function(err, method, params, client_id)` They can | client. Their signature is `function(err, method, params, client_id)` They can | ||||||
| be set by the {callbacks} parameter for |vim.lsp.start_client| or via the | be set by the {callbacks} parameter for |vim.lsp.start_client| or via the | ||||||
| |vim.lsp.default_callbacks|. | |vim.lsp.default_callbacks|. | ||||||
|  |  | ||||||
| This will be called for: | Handlers are called for: | ||||||
| - notifications from the server, where `err` will always be `nil` | - Notifications from the server (`err` is always `nil`). | ||||||
| - requests initiated by the server. The parameter `err` will be `nil` here as | - Requests initiated by the server (`err` is always `nil`). | ||||||
|   well. |   The handler can respond by returning two values: `result, err` | ||||||
|   For these, you can respond by returning two values: `result, err` The |   where `err` must be shaped like an RPC error: | ||||||
|   err must be in the format of an RPC error, which is |  | ||||||
|     `{ code, message, data? }` |     `{ code, message, data? }` | ||||||
|   You can use |vim.lsp.rpc_response_error()| to help with creating this object. |   You can use |vim.lsp.rpc_response_error()| to create this object. | ||||||
| - as a callback for requests initiated by the client if the request doesn't | - Handling requests initiated by the client if the request doesn't explicitly | ||||||
|   explicitly specify a callback (such as in |vim.lsp.buf_request|). |   specify a callback (such as in |vim.lsp.buf_request|). | ||||||
|  |  | ||||||
| ================================================================================ | ================================================================================ | ||||||
|                                                               *vim.lsp.protocol* | VIM.LSP.PROTOCOL                                              *vim.lsp.protocol* | ||||||
| vim.lsp.protocol |  | ||||||
|  |  | ||||||
|   Contains constants as described in the Language Server Protocol | The `vim.lsp.protocol` module provides constants defined in the LSP | ||||||
|   specification and helper functions for creating protocol related objects. | specification, and helper functions for creating protocol-related objects. | ||||||
|  |  | ||||||
|   https://github.com/microsoft/language-server-protocol/raw/gh-pages/_specifications/specification-3-14.md |   https://github.com/microsoft/language-server-protocol/raw/gh-pages/_specifications/specification-3-14.md | ||||||
|  |  | ||||||
|   Useful examples are `vim.lsp.protocol.ErrorCodes`. These objects allow | Useful examples are `vim.lsp.protocol.ErrorCodes`. These objects allow reverse | ||||||
|   reverse lookup by either the number or string name. | lookup by either the number or string name. | ||||||
|  |  | ||||||
|   e.g. vim.lsp.protocol.TextDocumentSyncKind.Full == 1 |   e.g. vim.lsp.protocol.TextDocumentSyncKind.Full == 1 | ||||||
|        vim.lsp.protocol.TextDocumentSyncKind[1] == "Full" |        vim.lsp.protocol.TextDocumentSyncKind[1] == "Full" | ||||||
| @@ -441,7 +446,7 @@ To configure omnifunc, add the following in your init.vim: | |||||||
|   autocmd CompleteDone * pclose |   autocmd CompleteDone * pclose | ||||||
| < | < | ||||||
| ================================================================================ | ================================================================================ | ||||||
|                                                              *lsp-vim-functions* | LSP FUNCTIONS                                                *lsp-vim-functions* | ||||||
|  |  | ||||||
| To use the functions from vim, it is recommended to use |v:lua| to interface | To use the functions from vim, it is recommended to use |v:lua| to interface | ||||||
| with the Lua functions. No direct vim functions are provided, but the | with the Lua functions. No direct vim functions are provided, but the | ||||||
| @@ -461,7 +466,7 @@ request from lua as follows: | |||||||
|   nnoremap <silent> ;td <cmd>lua vim.lsp.buf.type_definition()<CR> |   nnoremap <silent> ;td <cmd>lua vim.lsp.buf.type_definition()<CR> | ||||||
| < | < | ||||||
| ================================================================================ | ================================================================================ | ||||||
|                                                        *lsp-advanced-js-example* | LSP EXAMPLE                                            *lsp-advanced-js-example* | ||||||
|  |  | ||||||
| For more advanced configurations where just filtering by filetype isn't | For more advanced configurations where just filtering by filetype isn't | ||||||
| sufficient, you can use the `vim.lsp.start_client()` and | sufficient, you can use the `vim.lsp.start_client()` and | ||||||
|   | |||||||
| @@ -876,16 +876,23 @@ tbl_add_reverse_lookup({o})                     *vim.tbl_add_reverse_lookup()* | |||||||
|                 Parameters: ~ |                 Parameters: ~ | ||||||
|                     {o}  table The table to add the reverse to. |                     {o}  table The table to add the reverse to. | ||||||
|  |  | ||||||
| list_extend({dst}, {src})                                  *vim.list_extend()* | list_extend({dst}, {src}, {start}, {finish})               *vim.list_extend()* | ||||||
|                 Extends a list-like table with the values of another list-like |                 Extends a list-like table with the values of another list-like | ||||||
|                 table. |                 table. | ||||||
|  |  | ||||||
|  |                 NOTE: This mutates dst! | ||||||
|  |  | ||||||
|                 Parameters: ~ |                 Parameters: ~ | ||||||
|                     {dst}  The list which will be modified and appended to. |                     {dst}     list which will be modified and appended to. | ||||||
|                     {src}  The list from which values will be inserted. |                     {src}     list from which values will be inserted. | ||||||
|  |                     {start}   Start index on src. defaults to 1 | ||||||
|  |                     {finish}  Final index on src. defaults to #src | ||||||
|  |  | ||||||
|  |                 Return: ~ | ||||||
|  |                     dst | ||||||
|  |  | ||||||
|                 See also: ~ |                 See also: ~ | ||||||
|                     |extend()| |                     |vim.tbl_extend()| | ||||||
|  |  | ||||||
| tbl_flatten({t})                                           *vim.tbl_flatten()* | tbl_flatten({t})                                           *vim.tbl_flatten()* | ||||||
|                 Creates a copy of a list-like table such that any nested |                 Creates a copy of a list-like table such that any nested | ||||||
|   | |||||||
| @@ -786,7 +786,7 @@ g@{motion}		Call the function set by the 'operatorfunc' option. | |||||||
| 			character of the text. | 			character of the text. | ||||||
| 			The function is called with one String argument: | 			The function is called with one String argument: | ||||||
| 			    "line"	{motion} was |linewise| | 			    "line"	{motion} was |linewise| | ||||||
| 			    "char"	{motion} was |characterwise| | 			    "char"	{motion} was |charwise| | ||||||
| 			    "block"	{motion} was |blockwise-visual| | 			    "block"	{motion} was |blockwise-visual| | ||||||
| 			Although "block" would rarely appear, since it can | 			Although "block" would rarely appear, since it can | ||||||
| 			only result from Visual mode where "g@" is not useful. | 			only result from Visual mode where "g@" is not useful. | ||||||
|   | |||||||
| @@ -679,8 +679,8 @@ no argument has been specified. | |||||||
|   Invalid argument: {arg} |   Invalid argument: {arg} | ||||||
|   Duplicate argument: {arg} |   Duplicate argument: {arg} | ||||||
|  |  | ||||||
| An Ex command or function has been executed, but an invalid argument has been | Ex command or function has been executed, but an invalid argument was | ||||||
| specified. | specified.  Or a non-executable command was given to |system()|. | ||||||
|  |  | ||||||
| 							*E488*  > | 							*E488*  > | ||||||
|   Trailing characters |   Trailing characters | ||||||
|   | |||||||
| @@ -60,11 +60,11 @@ After applying the operator the cursor is mostly left at the start of the text | |||||||
| that was operated upon.  For example, "yfe" doesn't move the cursor, but "yFe" | that was operated upon.  For example, "yfe" doesn't move the cursor, but "yFe" | ||||||
| moves the cursor leftwards to the "e" where the yank started. | moves the cursor leftwards to the "e" where the yank started. | ||||||
|  |  | ||||||
| 						*linewise* *characterwise* | 						*linewise* *charwise* *characterwise* | ||||||
| The operator either affects whole lines, or the characters between the start | The operator either affects whole lines, or the characters between the start | ||||||
| and end position.  Generally, motions that move between lines affect lines | and end position.  Generally, motions that move between lines affect lines | ||||||
| (are linewise), and motions that move within a line affect characters (are | (are linewise), and motions that move within a line affect characters (are | ||||||
| characterwise).  However, there are some exceptions. | charwise).  However, there are some exceptions. | ||||||
|  |  | ||||||
| 						*exclusive* *inclusive* | 						*exclusive* *inclusive* | ||||||
| Character motion is either inclusive or exclusive.  When inclusive, the | Character motion is either inclusive or exclusive.  When inclusive, the | ||||||
| @@ -106,10 +106,10 @@ This cannot be repeated: > | |||||||
| 	d:if 1<CR> | 	d:if 1<CR> | ||||||
| 	   call search("f")<CR> | 	   call search("f")<CR> | ||||||
| 	endif<CR> | 	endif<CR> | ||||||
| Note that when using ":" any motion becomes characterwise exclusive. | Note that when using ":" any motion becomes charwise exclusive. | ||||||
|  |  | ||||||
| 								*forced-motion* | 								*forced-motion* | ||||||
| FORCING A MOTION TO BE LINEWISE, CHARACTERWISE OR BLOCKWISE | FORCING A MOTION TO BE LINEWISE, CHARWISE OR BLOCKWISE | ||||||
|  |  | ||||||
| When a motion is not of the type you would like to use, you can force another | When a motion is not of the type you would like to use, you can force another | ||||||
| type by using "v", "V" or CTRL-V just after the operator. | type by using "v", "V" or CTRL-V just after the operator. | ||||||
| @@ -121,22 +121,22 @@ deletes from the cursor position until the character below the cursor > | |||||||
| 	d<C-V>j | 	d<C-V>j | ||||||
| deletes the character under the cursor and the character below the cursor. > | deletes the character under the cursor and the character below the cursor. > | ||||||
|  |  | ||||||
| Be careful with forcing a linewise movement to be used characterwise or | Be careful with forcing a linewise movement to be used charwise or blockwise, | ||||||
| blockwise, the column may not always be defined. | the column may not always be defined. | ||||||
|  |  | ||||||
| 							*o_v* | 							*o_v* | ||||||
| v		When used after an operator, before the motion command: Force | v		When used after an operator, before the motion command: Force | ||||||
| 		the operator to work characterwise, also when the motion is | 		the operator to work charwise, also when the motion is | ||||||
| 		linewise.  If the motion was linewise, it will become | 		linewise.  If the motion was linewise, it will become | ||||||
| 		|exclusive|. | 		|exclusive|. | ||||||
| 		If the motion already was characterwise, toggle | 		If the motion already was charwise, toggle | ||||||
| 		inclusive/exclusive.  This can be used to make an exclusive | 		inclusive/exclusive.  This can be used to make an exclusive | ||||||
| 		motion inclusive and an inclusive motion exclusive. | 		motion inclusive and an inclusive motion exclusive. | ||||||
|  |  | ||||||
| 							*o_V* | 							*o_V* | ||||||
| V		When used after an operator, before the motion command: Force | V		When used after an operator, before the motion command: Force | ||||||
| 		the operator to work linewise, also when the motion is | 		the operator to work linewise, also when the motion is | ||||||
| 		characterwise. | 		charwise. | ||||||
|  |  | ||||||
| 							*o_CTRL-V* | 							*o_CTRL-V* | ||||||
| CTRL-V		When used after an operator, before the motion command: Force | CTRL-V		When used after an operator, before the motion command: Force | ||||||
| @@ -508,36 +508,36 @@ aw			"a word", select [count] words (see |word|). | |||||||
| 			Leading or trailing white space is included, but not | 			Leading or trailing white space is included, but not | ||||||
| 			counted. | 			counted. | ||||||
| 			When used in Visual linewise mode "aw" switches to | 			When used in Visual linewise mode "aw" switches to | ||||||
| 			Visual characterwise mode. | 			Visual charwise mode. | ||||||
|  |  | ||||||
| 							*v_iw* *iw* | 							*v_iw* *iw* | ||||||
| iw			"inner word", select [count] words (see |word|). | iw			"inner word", select [count] words (see |word|). | ||||||
| 			White space between words is counted too. | 			White space between words is counted too. | ||||||
| 			When used in Visual linewise mode "iw" switches to | 			When used in Visual linewise mode "iw" switches to | ||||||
| 			Visual characterwise mode. | 			Visual charwise mode. | ||||||
|  |  | ||||||
| 							*v_aW* *aW* | 							*v_aW* *aW* | ||||||
| aW			"a WORD", select [count] WORDs (see |WORD|). | aW			"a WORD", select [count] WORDs (see |WORD|). | ||||||
| 			Leading or trailing white space is included, but not | 			Leading or trailing white space is included, but not | ||||||
| 			counted. | 			counted. | ||||||
| 			When used in Visual linewise mode "aW" switches to | 			When used in Visual linewise mode "aW" switches to | ||||||
| 			Visual characterwise mode. | 			Visual charwise mode. | ||||||
|  |  | ||||||
| 							*v_iW* *iW* | 							*v_iW* *iW* | ||||||
| iW			"inner WORD", select [count] WORDs (see |WORD|). | iW			"inner WORD", select [count] WORDs (see |WORD|). | ||||||
| 			White space between words is counted too. | 			White space between words is counted too. | ||||||
| 			When used in Visual linewise mode "iW" switches to | 			When used in Visual linewise mode "iW" switches to | ||||||
| 			Visual characterwise mode. | 			Visual charwise mode. | ||||||
|  |  | ||||||
| 							*v_as* *as* | 							*v_as* *as* | ||||||
| as			"a sentence", select [count] sentences (see | as			"a sentence", select [count] sentences (see | ||||||
| 			|sentence|). | 			|sentence|). | ||||||
| 			When used in Visual mode it is made characterwise. | 			When used in Visual mode it is made charwise. | ||||||
|  |  | ||||||
| 							*v_is* *is* | 							*v_is* *is* | ||||||
| is			"inner sentence", select [count] sentences (see | is			"inner sentence", select [count] sentences (see | ||||||
| 			|sentence|). | 			|sentence|). | ||||||
| 			When used in Visual mode it is made characterwise. | 			When used in Visual mode it is made charwise. | ||||||
|  |  | ||||||
| 							*v_ap* *ap* | 							*v_ap* *ap* | ||||||
| ap			"a paragraph", select [count] paragraphs (see | ap			"a paragraph", select [count] paragraphs (see | ||||||
| @@ -558,14 +558,14 @@ a[			"a [] block", select [count] '[' ']' blocks.  This | |||||||
| 			goes backwards to the [count] unclosed '[', and finds | 			goes backwards to the [count] unclosed '[', and finds | ||||||
| 			the matching ']'.  The enclosed text is selected, | 			the matching ']'.  The enclosed text is selected, | ||||||
| 			including the '[' and ']'. | 			including the '[' and ']'. | ||||||
| 			When used in Visual mode it is made characterwise. | 			When used in Visual mode it is made charwise. | ||||||
|  |  | ||||||
| i]						*v_i]* *v_i[* *i]* *i[* | i]						*v_i]* *v_i[* *i]* *i[* | ||||||
| i[			"inner [] block", select [count] '[' ']' blocks.  This | i[			"inner [] block", select [count] '[' ']' blocks.  This | ||||||
| 			goes backwards to the [count] unclosed '[', and finds | 			goes backwards to the [count] unclosed '[', and finds | ||||||
| 			the matching ']'.  The enclosed text is selected, | 			the matching ']'.  The enclosed text is selected, | ||||||
| 			excluding the '[' and ']'. | 			excluding the '[' and ']'. | ||||||
| 			When used in Visual mode it is made characterwise. | 			When used in Visual mode it is made charwise. | ||||||
|  |  | ||||||
| a)							*v_a)* *a)* *a(* | a)							*v_a)* *a)* *a(* | ||||||
| a(							*vab* *v_ab* *v_a(* *ab* | a(							*vab* *v_ab* *v_a(* *ab* | ||||||
| @@ -573,54 +573,54 @@ ab			"a block", select [count] blocks, from "[count] [(" to | |||||||
| 			the matching ')', including the '(' and ')' (see | 			the matching ')', including the '(' and ')' (see | ||||||
| 			|[(|).  Does not include white space outside of the | 			|[(|).  Does not include white space outside of the | ||||||
| 			parenthesis. | 			parenthesis. | ||||||
| 			When used in Visual mode it is made characterwise. | 			When used in Visual mode it is made charwise. | ||||||
|  |  | ||||||
| i)							*v_i)* *i)* *i(* | i)							*v_i)* *i)* *i(* | ||||||
| i(							*vib* *v_ib* *v_i(* *ib* | i(							*vib* *v_ib* *v_i(* *ib* | ||||||
| ib			"inner block", select [count] blocks, from "[count] [(" | ib			"inner block", select [count] blocks, from "[count] [(" | ||||||
| 			to the matching ')', excluding the '(' and ')' (see | 			to the matching ')', excluding the '(' and ')' (see | ||||||
| 			|[(|). | 			|[(|). | ||||||
| 			When used in Visual mode it is made characterwise. | 			When used in Visual mode it is made charwise. | ||||||
|  |  | ||||||
| a>						*v_a>* *v_a<* *a>* *a<* | a>						*v_a>* *v_a<* *a>* *a<* | ||||||
| a<			"a <> block", select [count] <> blocks, from the | a<			"a <> block", select [count] <> blocks, from the | ||||||
| 			[count]'th unmatched '<' backwards to the matching | 			[count]'th unmatched '<' backwards to the matching | ||||||
| 			'>', including the '<' and '>'. | 			'>', including the '<' and '>'. | ||||||
| 			When used in Visual mode it is made characterwise. | 			When used in Visual mode it is made charwise. | ||||||
|  |  | ||||||
| i>						*v_i>* *v_i<* *i>* *i<* | i>						*v_i>* *v_i<* *i>* *i<* | ||||||
| i<			"inner <> block", select [count] <> blocks, from | i<			"inner <> block", select [count] <> blocks, from | ||||||
| 			the [count]'th unmatched '<' backwards to the matching | 			the [count]'th unmatched '<' backwards to the matching | ||||||
| 			'>', excluding the '<' and '>'. | 			'>', excluding the '<' and '>'. | ||||||
| 			When used in Visual mode it is made characterwise. | 			When used in Visual mode it is made charwise. | ||||||
|  |  | ||||||
| 						*v_at* *at* | 						*v_at* *at* | ||||||
| at			"a tag block", select [count] tag blocks, from the | at			"a tag block", select [count] tag blocks, from the | ||||||
| 			[count]'th unmatched "<aaa>" backwards to the matching | 			[count]'th unmatched "<aaa>" backwards to the matching | ||||||
| 			"</aaa>", including the "<aaa>" and "</aaa>". | 			"</aaa>", including the "<aaa>" and "</aaa>". | ||||||
| 			See |tag-blocks| about the details. | 			See |tag-blocks| about the details. | ||||||
| 			When used in Visual mode it is made characterwise. | 			When used in Visual mode it is made charwise. | ||||||
|  |  | ||||||
| 						*v_it* *it* | 						*v_it* *it* | ||||||
| it			"inner tag block", select [count] tag blocks, from the | it			"inner tag block", select [count] tag blocks, from the | ||||||
| 			[count]'th unmatched "<aaa>" backwards to the matching | 			[count]'th unmatched "<aaa>" backwards to the matching | ||||||
| 			"</aaa>", excluding the "<aaa>" and "</aaa>". | 			"</aaa>", excluding the "<aaa>" and "</aaa>". | ||||||
| 			See |tag-blocks| about the details. | 			See |tag-blocks| about the details. | ||||||
| 			When used in Visual mode it is made characterwise. | 			When used in Visual mode it is made charwise. | ||||||
|  |  | ||||||
| a}							*v_a}* *a}* *a{* | a}							*v_a}* *a}* *a{* | ||||||
| a{							*v_aB* *v_a{* *aB* | a{							*v_aB* *v_a{* *aB* | ||||||
| aB			"a Block", select [count] Blocks, from "[count] [{" to | aB			"a Block", select [count] Blocks, from "[count] [{" to | ||||||
| 			the matching '}', including the '{' and '}' (see | 			the matching '}', including the '{' and '}' (see | ||||||
| 			|[{|). | 			|[{|). | ||||||
| 			When used in Visual mode it is made characterwise. | 			When used in Visual mode it is made charwise. | ||||||
|  |  | ||||||
| i}							*v_i}* *i}* *i{* | i}							*v_i}* *i}* *i{* | ||||||
| i{							*v_iB* *v_i{* *iB* | i{							*v_iB* *v_i{* *iB* | ||||||
| iB			"inner Block", select [count] Blocks, from "[count] [{" | iB			"inner Block", select [count] Blocks, from "[count] [{" | ||||||
| 			to the matching '}', excluding the '{' and '}' (see | 			to the matching '}', excluding the '{' and '}' (see | ||||||
| 			|[{|). | 			|[{|). | ||||||
| 			When used in Visual mode it is made characterwise. | 			When used in Visual mode it is made charwise. | ||||||
|  |  | ||||||
| a"							*v_aquote* *aquote* | a"							*v_aquote* *aquote* | ||||||
| a'							*v_a'* *a'* | a'							*v_a'* *a'* | ||||||
| @@ -634,7 +634,7 @@ a`							*v_a`* *a`* | |||||||
| 			start of the line. | 			start of the line. | ||||||
| 			Any trailing white space is included, unless there is | 			Any trailing white space is included, unless there is | ||||||
| 			none, then leading white space is included. | 			none, then leading white space is included. | ||||||
| 			When used in Visual mode it is made characterwise. | 			When used in Visual mode it is made charwise. | ||||||
| 			Repeating this object in Visual mode another string is | 			Repeating this object in Visual mode another string is | ||||||
| 			included.  A count is currently not used. | 			included.  A count is currently not used. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1270,7 +1270,7 @@ exactly four MessagePack objects: | |||||||
|                        Key  Type             Def   Description ~ |                        Key  Type             Def   Description ~ | ||||||
|                        rt   UInteger         0     Register type: |                        rt   UInteger         0     Register type: | ||||||
|                                                    No  Description ~ |                                                    No  Description ~ | ||||||
|                                                    0   |characterwise-register| |                                                    0   |charwise-register| | ||||||
|                                                    1   |linewise-register| |                                                    1   |linewise-register| | ||||||
|                                                    2   |blockwise-register| |                                                    2   |blockwise-register| | ||||||
|                        rw   UInteger         0     Register width. Only valid |                        rw   UInteger         0     Register width. Only valid | ||||||
|   | |||||||
| @@ -48,7 +48,7 @@ position. | |||||||
| ============================================================================== | ============================================================================== | ||||||
| 2. Starting and stopping Visual mode			*visual-start* | 2. Starting and stopping Visual mode			*visual-start* | ||||||
|  |  | ||||||
| 						*v* *characterwise-visual* | 						*v* *charwise-visual* | ||||||
| [count]v		Start Visual mode per character. | [count]v		Start Visual mode per character. | ||||||
| 			With [count] select the same number of characters or | 			With [count] select the same number of characters or | ||||||
| 			lines as used for the last Visual operation, but at | 			lines as used for the last Visual operation, but at | ||||||
| @@ -74,7 +74,7 @@ position. | |||||||
|  |  | ||||||
| If you use <Esc>, click the left mouse button or use any command that | If you use <Esc>, click the left mouse button or use any command that | ||||||
| does a jump to another buffer while in Visual mode, the highlighting stops | does a jump to another buffer while in Visual mode, the highlighting stops | ||||||
| and no text is affected.  Also when you hit "v" in characterwise Visual mode, | and no text is affected.  Also when you hit "v" in charwise Visual mode, | ||||||
| "CTRL-V" in blockwise Visual mode or "V" in linewise Visual mode.  If you hit | "CTRL-V" in blockwise Visual mode or "V" in linewise Visual mode.  If you hit | ||||||
| CTRL-Z the highlighting stops and the editor is suspended or a new shell is | CTRL-Z the highlighting stops and the editor is suspended or a new shell is | ||||||
| started |CTRL-Z|. | started |CTRL-Z|. | ||||||
| @@ -477,7 +477,7 @@ Commands in Select mode: | |||||||
| Otherwise, typed characters are handled as in Visual mode. | Otherwise, typed characters are handled as in Visual mode. | ||||||
|  |  | ||||||
| When using an operator in Select mode, and the selection is linewise, the | When using an operator in Select mode, and the selection is linewise, the | ||||||
| selected lines are operated upon, but like in characterwise selection.  For | selected lines are operated upon, but like in charwise selection.  For | ||||||
| example, when a whole line is deleted, it can later be pasted in the middle of | example, when a whole line is deleted, it can later be pasted in the middle of | ||||||
| a line. | a line. | ||||||
|  |  | ||||||
| @@ -510,7 +510,7 @@ gV			Avoid the automatic reselection of the Visual area | |||||||
| 			selection. | 			selection. | ||||||
|  |  | ||||||
| 							*gh* | 							*gh* | ||||||
| gh			Start Select mode, characterwise.  This is like "v", | gh			Start Select mode, charwise.  This is like "v", | ||||||
| 			but starts Select mode instead of Visual mode. | 			but starts Select mode instead of Visual mode. | ||||||
| 			Mnemonic: "get highlighted". | 			Mnemonic: "get highlighted". | ||||||
|  |  | ||||||
|   | |||||||
| @@ -226,11 +226,12 @@ function vim.tbl_add_reverse_lookup(o) | |||||||
|   return o |   return o | ||||||
| end | end | ||||||
|  |  | ||||||
| -- Extends a list-like table with the values of another list-like table. | --- Extends a list-like table with the values of another list-like table. | ||||||
| -- | --- | ||||||
| -- NOTE: This *mutates* dst! | --- NOTE: This mutates dst! | ||||||
| -- @see |extend()| | --- | ||||||
| -- | --@see |vim.tbl_extend()| | ||||||
|  | --- | ||||||
| --@param dst list which will be modified and appended to. | --@param dst list which will be modified and appended to. | ||||||
| --@param src list from which values will be inserted. | --@param src list from which values will be inserted. | ||||||
| --@param start Start index on src. defaults to 1 | --@param start Start index on src. defaults to 1 | ||||||
|   | |||||||
| @@ -1013,10 +1013,10 @@ ArrayOf(Integer, 2) nvim_buf_get_mark(Buffer buffer, String name, Error *err) | |||||||
|  |  | ||||||
| /// Returns position for a given extmark id | /// Returns position for a given extmark id | ||||||
| /// | /// | ||||||
| /// @param buffer The buffer handle | /// @param buffer  Buffer handle, or 0 for current buffer | ||||||
| /// @param namespace a identifier returned previously with nvim_create_namespace | /// @param ns_id  Namespace id from |nvim_create_namespace()| | ||||||
| /// @param id the extmark id | /// @param id  Extmark id | ||||||
| /// @param[out] err Details of an error that may have occurred | /// @param[out] err   Error details, if any | ||||||
| /// @return (row, col) tuple or empty list () if extmark id was absent | /// @return (row, col) tuple or empty list () if extmark id was absent | ||||||
| ArrayOf(Integer) nvim_buf_get_extmark_by_id(Buffer buffer, Integer ns_id, | ArrayOf(Integer) nvim_buf_get_extmark_by_id(Buffer buffer, Integer ns_id, | ||||||
|                                             Integer id, Error *err) |                                             Integer id, Error *err) | ||||||
| @@ -1044,30 +1044,50 @@ ArrayOf(Integer) nvim_buf_get_extmark_by_id(Buffer buffer, Integer ns_id, | |||||||
|   return rv; |   return rv; | ||||||
| } | } | ||||||
|  |  | ||||||
| /// List extmarks in a range (inclusive) | /// Gets extmarks in "traversal order" from a |charwise| region defined by | ||||||
|  | /// buffer positions (inclusive, 0-indexed |api-indexing|). | ||||||
| /// | /// | ||||||
| /// range ends can be specified as (row, col) tuples, as well as extmark | /// Region can be given as (row,col) tuples, or valid extmark ids (whose | ||||||
| /// ids in the same namespace. In addition, 0 and -1 works as shorthands | /// positions define the bounds). 0 and -1 are understood as (0,0) and (-1,-1) | ||||||
| /// for (0,0) and (-1,-1) respectively, so that all marks in the buffer can be | /// respectively, thus the following are equivalent: | ||||||
| /// queried as: |  | ||||||
| /// | /// | ||||||
| ///    all_marks = nvim_buf_get_extmarks(0, my_ns, 0, -1, {}) | /// <pre> | ||||||
|  | ///   nvim_buf_get_extmarks(0, my_ns, 0, -1, {}) | ||||||
|  | ///   nvim_buf_get_extmarks(0, my_ns, [0,0], [-1,-1], {}) | ||||||
|  | /// </pre> | ||||||
| /// | /// | ||||||
| /// If end is a lower position than start, then the range will be traversed | /// If `end` is less than `start`, traversal works backwards. (Useful | ||||||
| /// backwards. This is mostly useful with limited amount, to be able to get the | /// with `limit`, to get the first marks prior to a given position.) | ||||||
| /// first marks prior to a given position. |  | ||||||
| /// | /// | ||||||
| /// @param buffer The buffer handle | /// Example: | ||||||
| /// @param ns_id An id returned previously from nvim_create_namespace | /// | ||||||
| /// @param start One of:  extmark id, (row, col) or 0, -1 for buffer ends | /// <pre> | ||||||
| /// @param end One of: extmark id, (row, col) or 0, -1 for buffer ends | ///   local a   = vim.api | ||||||
| /// @param opts additional options. Supports the keys: | ///   local pos = a.nvim_win_get_cursor(0) | ||||||
| ///          - amount:  Maximum number of marks to return | ///   local ns  = a.nvim_create_namespace('my-plugin') | ||||||
| /// @param[out] err Details of an error that may have occurred | ///   -- Create new extmark at line 1, column 1. | ||||||
| /// @return [[extmark_id, row, col], ...] | ///   local m1  = a.nvim_buf_set_extmark(0, ns, 0, 0, 0, {}) | ||||||
| Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id, | ///   -- Create new extmark at line 3, column 1. | ||||||
|                             Object start, Object end, Dictionary opts, | ///   local m2  = a.nvim_buf_set_extmark(0, ns, 0, 2, 0, {}) | ||||||
|                             Error *err) | ///   -- Get extmarks only from line 3. | ||||||
|  | ///   local ms  = a.nvim_buf_get_extmarks(0, ns, {2,0}, {2,0}, {}) | ||||||
|  | ///   -- Get all marks in this buffer + namespace. | ||||||
|  | ///   local all = a.nvim_buf_get_extmarks(0, ns, 0, -1, {}) | ||||||
|  | ///   print(vim.inspect(ms)) | ||||||
|  | /// </pre> | ||||||
|  | /// | ||||||
|  | /// @param buffer  Buffer handle, or 0 for current buffer | ||||||
|  | /// @param ns_id  Namespace id from |nvim_create_namespace()| | ||||||
|  | /// @param start  Start of range, given as (row, col) or valid extmark id | ||||||
|  | ///               (whose position defines the bound) | ||||||
|  | /// @param end  End of range, given as (row, col) or valid extmark id | ||||||
|  | ///             (whose position defines the bound) | ||||||
|  | /// @param opts  Optional parameters. Keys: | ||||||
|  | ///          - limit:  Maximum number of marks to return | ||||||
|  | /// @param[out] err   Error details, if any | ||||||
|  | /// @return List of [extmark_id, row, col] tuples in "traversal order". | ||||||
|  | Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id, Object start, | ||||||
|  |                             Object end, Dictionary opts, Error *err) | ||||||
|   FUNC_API_SINCE(7) |   FUNC_API_SINCE(7) | ||||||
| { | { | ||||||
|   Array rv = ARRAY_DICT_INIT; |   Array rv = ARRAY_DICT_INIT; | ||||||
| @@ -1081,17 +1101,17 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id, | |||||||
|     api_set_error(err, kErrorTypeValidation, _("Invalid ns_id")); |     api_set_error(err, kErrorTypeValidation, _("Invalid ns_id")); | ||||||
|     return rv; |     return rv; | ||||||
|   } |   } | ||||||
|   Integer amount = -1; |   Integer limit = -1; | ||||||
|  |  | ||||||
|   for (size_t i = 0; i < opts.size; i++) { |   for (size_t i = 0; i < opts.size; i++) { | ||||||
|     String k = opts.items[i].key; |     String k = opts.items[i].key; | ||||||
|     Object *v = &opts.items[i].value; |     Object *v = &opts.items[i].value; | ||||||
|     if (strequal("amount", k.data)) { |     if (strequal("limit", k.data)) { | ||||||
|       if (v->type != kObjectTypeInteger) { |       if (v->type != kObjectTypeInteger) { | ||||||
|         api_set_error(err, kErrorTypeValidation, "amount is not an integer"); |         api_set_error(err, kErrorTypeValidation, "limit is not an integer"); | ||||||
|         return rv; |         return rv; | ||||||
|       } |       } | ||||||
|       amount = v->data.integer; |       limit = v->data.integer; | ||||||
|       v->data.integer = LUA_NOREF; |       v->data.integer = LUA_NOREF; | ||||||
|     } else { |     } else { | ||||||
|       api_set_error(err, kErrorTypeValidation, "unexpected key: %s", k.data); |       api_set_error(err, kErrorTypeValidation, "unexpected key: %s", k.data); | ||||||
| @@ -1099,7 +1119,7 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id, | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if (amount == 0) { |   if (limit == 0) { | ||||||
|     return rv; |     return rv; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -1108,13 +1128,13 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id, | |||||||
|  |  | ||||||
|   linenr_T l_lnum; |   linenr_T l_lnum; | ||||||
|   colnr_T l_col; |   colnr_T l_col; | ||||||
|   if (!set_extmark_index_from_obj(buf, ns_id, start, &l_lnum, &l_col, err)) { |   if (!extmark_get_index_from_obj(buf, ns_id, start, &l_lnum, &l_col, err)) { | ||||||
|     return rv; |     return rv; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   linenr_T u_lnum; |   linenr_T u_lnum; | ||||||
|   colnr_T u_col; |   colnr_T u_col; | ||||||
|   if (!set_extmark_index_from_obj(buf, ns_id, end, &u_lnum, &u_col, err)) { |   if (!extmark_get_index_from_obj(buf, ns_id, end, &u_lnum, &u_col, err)) { | ||||||
|     return rv; |     return rv; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -1129,9 +1149,8 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id, | |||||||
|   } |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|   ExtmarkArray marks = extmark_get(buf, (uint64_t)ns_id, l_lnum, l_col, |   ExtmarkArray marks = extmark_get(buf, (uint64_t)ns_id, l_lnum, l_col, u_lnum, | ||||||
|                                    u_lnum, u_col, (int64_t)amount, |                                    u_col, (int64_t)limit, reverse); | ||||||
|                                    reverse); |  | ||||||
|  |  | ||||||
|   for (size_t i = 0; i < kv_size(marks); i++) { |   for (size_t i = 0; i < kv_size(marks); i++) { | ||||||
|     Array mark = ARRAY_DICT_INIT; |     Array mark = ARRAY_DICT_INIT; | ||||||
| @@ -1146,26 +1165,23 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id, | |||||||
|   return rv; |   return rv; | ||||||
| } | } | ||||||
|  |  | ||||||
| /// Create or update an extmark at a position | /// Creates or updates an extmark. | ||||||
| /// | /// | ||||||
| /// If an invalid namespace is given, an error will be raised. | /// To create a new extmark, pass id=0. The extmark id will be returned. | ||||||
| /// | //  To move an existing mark, pass its id. | ||||||
| /// To create a new extmark, pass in id=0. The new extmark id will be |  | ||||||
| /// returned. To move an existing mark, pass in its id. |  | ||||||
| /// | /// | ||||||
| /// It is also allowed to create a new mark by passing in a previously unused | /// It is also allowed to create a new mark by passing in a previously unused | ||||||
| /// id, but the caller must then keep track of existing and unused ids itself. | /// id, but the caller must then keep track of existing and unused ids itself. | ||||||
| /// This is mainly useful over RPC, to avoid needing to wait for the return | /// (Useful over RPC, to avoid waiting for the return value.) | ||||||
| /// value. |  | ||||||
| /// | /// | ||||||
| /// @param buffer The buffer handle | /// @param buffer  Buffer handle, or 0 for current buffer | ||||||
| /// @param ns_id a identifier returned previously with nvim_create_namespace | /// @param ns_id  Namespace id from |nvim_create_namespace()| | ||||||
| /// @param id The extmark's id or 0 to create a new mark. | /// @param id  Extmark id, or 0 to create new | ||||||
| /// @param line The row to set the extmark to. | /// @param line  Line number where to place the mark | ||||||
| /// @param col The column to set the extmark to. | /// @param col  Column where to place the mark | ||||||
| /// @param opts  Optional parameters. Currently not used. | /// @param opts  Optional parameters. Currently not used. | ||||||
| /// @param[out] err Details of an error that may have occurred | /// @param[out]  err   Error details, if any | ||||||
| /// @return the id of the extmark. | /// @return Id of the created/updated extmark | ||||||
| Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer id, | Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer id, | ||||||
|                              Integer line, Integer col, |                              Integer line, Integer col, | ||||||
|                              Dictionary opts, Error *err) |                              Dictionary opts, Error *err) | ||||||
| @@ -1217,13 +1233,13 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer id, | |||||||
|   return (Integer)id_num; |   return (Integer)id_num; | ||||||
| } | } | ||||||
|  |  | ||||||
| /// Remove an extmark | /// Removes an extmark. | ||||||
| /// | /// | ||||||
| /// @param buffer The buffer handle | /// @param buffer Buffer handle, or 0 for current buffer | ||||||
| /// @param ns_id a identifier returned previously with nvim_create_namespace | /// @param ns_id Namespace id from |nvim_create_namespace()| | ||||||
| /// @param id The extmarks's id | /// @param id Extmark id | ||||||
| /// @param[out] err Details of an error that may have occurred | /// @param[out] err   Error details, if any | ||||||
| /// @return true on success, false if the extmark was not found. | /// @return true if the extmark was found, else false | ||||||
| Boolean nvim_buf_del_extmark(Buffer buffer, | Boolean nvim_buf_del_extmark(Buffer buffer, | ||||||
|                              Integer ns_id, |                              Integer ns_id, | ||||||
|                              Integer id, |                              Integer id, | ||||||
| @@ -1309,7 +1325,8 @@ Integer nvim_buf_add_highlight(Buffer buffer, | |||||||
|   return ns_id; |   return ns_id; | ||||||
| } | } | ||||||
|  |  | ||||||
| /// Clears namespaced objects, highlights and virtual text, from a line range | /// Clears namespaced objects (highlights, extmarks, virtual text) from | ||||||
|  | /// a region. | ||||||
| /// | /// | ||||||
| /// Lines are 0-indexed. |api-indexing|  To clear the namespace in the entire | /// Lines are 0-indexed. |api-indexing|  To clear the namespace in the entire | ||||||
| /// buffer, specify line_start=0 and line_end=-1. | /// buffer, specify line_start=0 and line_end=-1. | ||||||
|   | |||||||
| @@ -1512,7 +1512,7 @@ ArrayOf(Dictionary) keymap_array(String mode, buf_T *buf) | |||||||
| // If throw == true then an error will be raised if nothing | // If throw == true then an error will be raised if nothing | ||||||
| // was found | // was found | ||||||
| // Returns NULL if something went wrong | // Returns NULL if something went wrong | ||||||
| Extmark *extmark_from_id_or_pos(Buffer buffer, Integer namespace, Object id, | Extmark *extmark_from_id_or_pos(Buffer buffer, Integer ns, Object id, | ||||||
|                                 Error *err, bool throw) |                                 Error *err, bool throw) | ||||||
| { | { | ||||||
|   buf_T *buf = find_buffer_by_handle(buffer, err); |   buf_T *buf = find_buffer_by_handle(buffer, err); | ||||||
| @@ -1536,7 +1536,7 @@ Extmark *extmark_from_id_or_pos(Buffer buffer, Integer namespace, Object id, | |||||||
|       } |       } | ||||||
|       return NULL; |       return NULL; | ||||||
|     } |     } | ||||||
|     extmark = extmark_from_pos(buf, (uint64_t)namespace, row, col); |     extmark = extmark_from_pos(buf, (uint64_t)ns, row, col); | ||||||
|   } else if (id.type != kObjectTypeInteger) { |   } else if (id.type != kObjectTypeInteger) { | ||||||
|     if (throw) { |     if (throw) { | ||||||
|       api_set_error(err, kErrorTypeValidation, |       api_set_error(err, kErrorTypeValidation, | ||||||
| @@ -1550,7 +1550,7 @@ Extmark *extmark_from_id_or_pos(Buffer buffer, Integer namespace, Object id, | |||||||
|     return NULL; |     return NULL; | ||||||
|   } else { |   } else { | ||||||
|     extmark = extmark_from_id(buf, |     extmark = extmark_from_id(buf, | ||||||
|                               (uint64_t)namespace, |                               (uint64_t)ns, | ||||||
|                               (uint64_t)id.data.integer); |                               (uint64_t)id.data.integer); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -1572,17 +1572,17 @@ bool ns_initialized(uint64_t ns) | |||||||
|   return ns < (uint64_t)next_namespace_id; |   return ns < (uint64_t)next_namespace_id; | ||||||
| } | } | ||||||
|  |  | ||||||
| /// Get line and column from extmark object | /// Gets the line and column of an extmark. | ||||||
| /// | /// | ||||||
| /// Extmarks may be queried from position or name or even special names | /// Extmarks may be queried by position, name or even special names | ||||||
| /// in the future such as "cursor". This function sets the line and col | /// in the future such as "cursor". | ||||||
| /// to make the extmark functions recognize what's required |  | ||||||
| /// | /// | ||||||
| /// @param[out] lnum lnum to be set | /// @param[out] lnum extmark line | ||||||
| /// @param[out] colnr col to be set | /// @param[out] colnr extmark column | ||||||
| bool set_extmark_index_from_obj(buf_T *buf, Integer namespace, | /// | ||||||
|                                 Object obj, linenr_T *lnum, colnr_T *colnr, | /// @return true if the extmark was found, else false | ||||||
|                                 Error *err) | bool extmark_get_index_from_obj(buf_T *buf, Integer ns, Object obj, linenr_T | ||||||
|  |                                 *lnum, colnr_T *colnr, Error *err) | ||||||
| { | { | ||||||
|   // Check if it is mark id |   // Check if it is mark id | ||||||
|   if (obj.type == kObjectTypeInteger) { |   if (obj.type == kObjectTypeInteger) { | ||||||
| @@ -1600,7 +1600,7 @@ bool set_extmark_index_from_obj(buf_T *buf, Integer namespace, | |||||||
|       return false; |       return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     Extmark *extmark = extmark_from_id(buf, (uint64_t)namespace, (uint64_t)id); |     Extmark *extmark = extmark_from_id(buf, (uint64_t)ns, (uint64_t)id); | ||||||
|     if (extmark) { |     if (extmark) { | ||||||
|       *lnum = extmark->line->lnum; |       *lnum = extmark->line->lnum; | ||||||
|       *colnr = extmark->col; |       *colnr = extmark->col; | ||||||
|   | |||||||
| @@ -1291,7 +1291,7 @@ theend: | |||||||
| /// @param lines  |readfile()|-style list of lines. |channel-lines| | /// @param lines  |readfile()|-style list of lines. |channel-lines| | ||||||
| /// @param type  Edit behavior: any |getregtype()| result, or: | /// @param type  Edit behavior: any |getregtype()| result, or: | ||||||
| ///              - "b" |blockwise-visual| mode (may include width, e.g. "b3") | ///              - "b" |blockwise-visual| mode (may include width, e.g. "b3") | ||||||
| ///              - "c" |characterwise| mode | ///              - "c" |charwise| mode | ||||||
| ///              - "l" |linewise| mode | ///              - "l" |linewise| mode | ||||||
| ///              - ""  guess by contents, see |setreg()| | ///              - ""  guess by contents, see |setreg()| | ||||||
| /// @param after  Insert after cursor (like |p|), or before (like |P|). | /// @param after  Insert after cursor (like |p|), or before (like |P|). | ||||||
|   | |||||||
| @@ -1422,12 +1422,12 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank) | |||||||
|       if (oap->motion_type == kMTLineWise) { |       if (oap->motion_type == kMTLineWise) { | ||||||
|         oap->inclusive = false; |         oap->inclusive = false; | ||||||
|       } else if (oap->motion_type == kMTCharWise) { |       } else if (oap->motion_type == kMTCharWise) { | ||||||
|         // If the motion already was characterwise, toggle "inclusive" |         // If the motion already was charwise, toggle "inclusive" | ||||||
|         oap->inclusive = !oap->inclusive; |         oap->inclusive = !oap->inclusive; | ||||||
|       } |       } | ||||||
|       oap->motion_type = kMTCharWise; |       oap->motion_type = kMTCharWise; | ||||||
|     } else if (oap->motion_force == Ctrl_V) { |     } else if (oap->motion_force == Ctrl_V) { | ||||||
|       // Change line- or characterwise motion into Visual block mode. |       // Change line- or charwise motion into Visual block mode. | ||||||
|       if (!VIsual_active) { |       if (!VIsual_active) { | ||||||
|         VIsual_active = true; |         VIsual_active = true; | ||||||
|         VIsual = oap->start; |         VIsual = oap->start; | ||||||
| @@ -1516,7 +1516,7 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank) | |||||||
|       } |       } | ||||||
|  |  | ||||||
|       // In Select mode, a linewise selection is operated upon like a |       // In Select mode, a linewise selection is operated upon like a | ||||||
|       // characterwise selection. |       // charwise selection. | ||||||
|       // Special case: gH<Del> deletes the last line. |       // Special case: gH<Del> deletes the last line. | ||||||
|       if (VIsual_select && VIsual_mode == 'V' |       if (VIsual_select && VIsual_mode == 'V' | ||||||
|           && cap->oap->op_type != OP_DELETE) { |           && cap->oap->op_type != OP_DELETE) { | ||||||
| @@ -4588,7 +4588,7 @@ static void nv_colon(cmdarg_T *cap) | |||||||
|     nv_operator(cap); |     nv_operator(cap); | ||||||
|   } else { |   } else { | ||||||
|     if (cap->oap->op_type != OP_NOP) { |     if (cap->oap->op_type != OP_NOP) { | ||||||
|       // Using ":" as a movement is characterwise exclusive. |       // Using ":" as a movement is charwise exclusive. | ||||||
|       cap->oap->motion_type = kMTCharWise; |       cap->oap->motion_type = kMTCharWise; | ||||||
|       cap->oap->inclusive = false; |       cap->oap->inclusive = false; | ||||||
|     } else if (cap->count0 && !is_cmdkey) { |     } else if (cap->count0 && !is_cmdkey) { | ||||||
| @@ -6372,8 +6372,8 @@ static void nv_visual(cmdarg_T *cap) | |||||||
|   if (cap->cmdchar == Ctrl_Q) |   if (cap->cmdchar == Ctrl_Q) | ||||||
|     cap->cmdchar = Ctrl_V; |     cap->cmdchar = Ctrl_V; | ||||||
|  |  | ||||||
|   /* 'v', 'V' and CTRL-V can be used while an operator is pending to make it |   // 'v', 'V' and CTRL-V can be used while an operator is pending to make it | ||||||
|    * characterwise, linewise, or blockwise. */ |   // charwise, linewise, or blockwise. | ||||||
|   if (cap->oap->op_type != OP_NOP) { |   if (cap->oap->op_type != OP_NOP) { | ||||||
|     motion_force = cap->oap->motion_force = cap->cmdchar; |     motion_force = cap->oap->motion_force = cap->cmdchar; | ||||||
|     finish_op = false;          // operator doesn't finish now but later |     finish_op = false;          // operator doesn't finish now but later | ||||||
| @@ -7887,15 +7887,17 @@ static void nv_put_opt(cmdarg_T *cap, bool fix_indent) | |||||||
|         cap->oap->regname = regname; |         cap->oap->regname = regname; | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       /* When deleted a linewise Visual area, put the register as |       // When deleted a linewise Visual area, put the register as | ||||||
|        * lines to avoid it joined with the next line.  When deletion was |       // lines to avoid it joined with the next line.  When deletion was | ||||||
|        * characterwise, split a line when putting lines. */ |       // charwise, split a line when putting lines. | ||||||
|       if (VIsual_mode == 'V') |       if (VIsual_mode == 'V') { | ||||||
|         flags |= PUT_LINE; |         flags |= PUT_LINE; | ||||||
|       else if (VIsual_mode == 'v') |       } else if (VIsual_mode == 'v') { | ||||||
|         flags |= PUT_LINE_SPLIT; |         flags |= PUT_LINE_SPLIT; | ||||||
|       if (VIsual_mode == Ctrl_V && dir == FORWARD) |       } | ||||||
|  |       if (VIsual_mode == Ctrl_V && dir == FORWARD) { | ||||||
|         flags |= PUT_LINE_FORWARD; |         flags |= PUT_LINE_FORWARD; | ||||||
|  |       } | ||||||
|       dir = BACKWARD; |       dir = BACKWARD; | ||||||
|       if ((VIsual_mode != 'V' |       if ((VIsual_mode != 'V' | ||||||
|            && curwin->w_cursor.col < curbuf->b_op_start.col) |            && curwin->w_cursor.col < curbuf->b_op_start.col) | ||||||
|   | |||||||
| @@ -5204,8 +5204,7 @@ void write_reg_contents_lst(int name, char_u **strings, | |||||||
|  |  | ||||||
| /// write_reg_contents_ex - store `str` in register `name` | /// write_reg_contents_ex - store `str` in register `name` | ||||||
| /// | /// | ||||||
| /// If `str` ends in '\n' or '\r', use linewise, otherwise use | /// If `str` ends in '\n' or '\r', use linewise, otherwise use charwise. | ||||||
| /// characterwise. |  | ||||||
| /// | /// | ||||||
| /// @warning when `name` is '/', `len` and `must_append` are ignored. This | /// @warning when `name` is '/', `len` and `must_append` are ignored. This | ||||||
| ///          means that `str` MUST be NUL-terminated. | ///          means that `str` MUST be NUL-terminated. | ||||||
|   | |||||||
| @@ -156,7 +156,7 @@ char *get_mode(void) | |||||||
|     buf[0] = 'n'; |     buf[0] = 'n'; | ||||||
|     if (finish_op) { |     if (finish_op) { | ||||||
|       buf[1] = 'o'; |       buf[1] = 'o'; | ||||||
|       // to be able to detect force-linewise/blockwise/characterwise operations |       // to be able to detect force-linewise/blockwise/charwise operations | ||||||
|       buf[2] = (char)motion_force; |       buf[2] = (char)motion_force; | ||||||
|     } else if (restart_edit == 'I' || restart_edit == 'R' |     } else if (restart_edit == 'I' || restart_edit == 'R' | ||||||
|                || restart_edit == 'V') { |                || restart_edit == 'V') { | ||||||
|   | |||||||
| @@ -36,7 +36,7 @@ local function get_extmarks(ns_id, start, end_, opts) | |||||||
|   return curbufmeths.get_extmarks(ns_id, start, end_, opts) |   return curbufmeths.get_extmarks(ns_id, start, end_, opts) | ||||||
| end | end | ||||||
|  |  | ||||||
| describe('Extmarks buffer api', function() | describe('API/extmarks', function() | ||||||
|   local screen |   local screen | ||||||
|   local marks, positions, ns_string2, ns_string, init_text, row, col |   local marks, positions, ns_string2, ns_string, init_text, row, col | ||||||
|   local ns, ns2 |   local ns, ns2 | ||||||
| @@ -153,26 +153,26 @@ describe('Extmarks buffer api', function() | |||||||
|     end |     end | ||||||
|  |  | ||||||
|     -- next with mark id |     -- next with mark id | ||||||
|     rv = get_extmarks(ns, marks[1], {-1, -1}, {amount=1}) |     rv = get_extmarks(ns, marks[1], {-1, -1}, {limit=1}) | ||||||
|     eq({{marks[1], positions[1][1], positions[1][2]}}, rv) |     eq({{marks[1], positions[1][1], positions[1][2]}}, rv) | ||||||
|     rv = get_extmarks(ns, marks[2], {-1, -1}, {amount=1}) |     rv = get_extmarks(ns, marks[2], {-1, -1}, {limit=1}) | ||||||
|     eq({{marks[2], positions[2][1], positions[2][2]}}, rv) |     eq({{marks[2], positions[2][1], positions[2][2]}}, rv) | ||||||
|     -- next with positional when mark exists at position |     -- next with positional when mark exists at position | ||||||
|     rv = get_extmarks(ns, positions[1], {-1, -1}, {amount=1}) |     rv = get_extmarks(ns, positions[1], {-1, -1}, {limit=1}) | ||||||
|     eq({{marks[1], positions[1][1], positions[1][2]}}, rv) |     eq({{marks[1], positions[1][1], positions[1][2]}}, rv) | ||||||
|     -- next with positional index (no mark at position) |     -- next with positional index (no mark at position) | ||||||
|     rv = get_extmarks(ns, {positions[1][1], positions[1][2] +1}, {-1, -1}, {amount=1}) |     rv = get_extmarks(ns, {positions[1][1], positions[1][2] +1}, {-1, -1}, {limit=1}) | ||||||
|     eq({{marks[2], positions[2][1], positions[2][2]}}, rv) |     eq({{marks[2], positions[2][1], positions[2][2]}}, rv) | ||||||
|     -- next with Extremity index |     -- next with Extremity index | ||||||
|     rv = get_extmarks(ns, {0,0}, {-1, -1}, {amount=1}) |     rv = get_extmarks(ns, {0,0}, {-1, -1}, {limit=1}) | ||||||
|     eq({{marks[1], positions[1][1], positions[1][2]}}, rv) |     eq({{marks[1], positions[1][1], positions[1][2]}}, rv) | ||||||
|  |  | ||||||
|     -- nextrange with mark id |     -- nextrange with mark id | ||||||
|     rv = get_extmarks(ns, marks[1], marks[3]) |     rv = get_extmarks(ns, marks[1], marks[3]) | ||||||
|     eq({marks[1], positions[1][1], positions[1][2]}, rv[1]) |     eq({marks[1], positions[1][1], positions[1][2]}, rv[1]) | ||||||
|     eq({marks[2], positions[2][1], positions[2][2]}, rv[2]) |     eq({marks[2], positions[2][1], positions[2][2]}, rv[2]) | ||||||
|     -- nextrange with amount |     -- nextrange with `limit` | ||||||
|     rv = get_extmarks(ns, marks[1], marks[3], {amount=2}) |     rv = get_extmarks(ns, marks[1], marks[3], {limit=2}) | ||||||
|     eq(2, table.getn(rv)) |     eq(2, table.getn(rv)) | ||||||
|     -- nextrange with positional when mark exists at position |     -- nextrange with positional when mark exists at position | ||||||
|     rv = get_extmarks(ns, positions[1], positions[3]) |     rv = get_extmarks(ns, positions[1], positions[3]) | ||||||
| @@ -196,18 +196,18 @@ describe('Extmarks buffer api', function() | |||||||
|     eq({{marks[3], positions[3][1], positions[3][2]}}, rv) |     eq({{marks[3], positions[3][1], positions[3][2]}}, rv) | ||||||
|  |  | ||||||
|     -- prev with mark id |     -- prev with mark id | ||||||
|     rv = get_extmarks(ns, marks[3], {0, 0}, {amount=1}) |     rv = get_extmarks(ns, marks[3], {0, 0}, {limit=1}) | ||||||
|     eq({{marks[3], positions[3][1], positions[3][2]}}, rv) |     eq({{marks[3], positions[3][1], positions[3][2]}}, rv) | ||||||
|     rv = get_extmarks(ns, marks[2], {0, 0}, {amount=1}) |     rv = get_extmarks(ns, marks[2], {0, 0}, {limit=1}) | ||||||
|     eq({{marks[2], positions[2][1], positions[2][2]}}, rv) |     eq({{marks[2], positions[2][1], positions[2][2]}}, rv) | ||||||
|     -- prev with positional when mark exists at position |     -- prev with positional when mark exists at position | ||||||
|     rv = get_extmarks(ns, positions[3], {0, 0}, {amount=1}) |     rv = get_extmarks(ns, positions[3], {0, 0}, {limit=1}) | ||||||
|     eq({{marks[3], positions[3][1], positions[3][2]}}, rv) |     eq({{marks[3], positions[3][1], positions[3][2]}}, rv) | ||||||
|     -- prev with positional index (no mark at position) |     -- prev with positional index (no mark at position) | ||||||
|     rv = get_extmarks(ns, {positions[1][1], positions[1][2] +1}, {0, 0}, {amount=1}) |     rv = get_extmarks(ns, {positions[1][1], positions[1][2] +1}, {0, 0}, {limit=1}) | ||||||
|     eq({{marks[1], positions[1][1], positions[1][2]}}, rv) |     eq({{marks[1], positions[1][1], positions[1][2]}}, rv) | ||||||
|     -- prev with Extremity index |     -- prev with Extremity index | ||||||
|     rv = get_extmarks(ns, {-1,-1}, {0,0}, {amount=1}) |     rv = get_extmarks(ns, {-1,-1}, {0,0}, {limit=1}) | ||||||
|     eq({{marks[3], positions[3][1], positions[3][2]}}, rv) |     eq({{marks[3], positions[3][1], positions[3][2]}}, rv) | ||||||
|  |  | ||||||
|     -- prevrange with mark id |     -- prevrange with mark id | ||||||
| @@ -215,8 +215,8 @@ describe('Extmarks buffer api', function() | |||||||
|     eq({marks[3], positions[3][1], positions[3][2]}, rv[1]) |     eq({marks[3], positions[3][1], positions[3][2]}, rv[1]) | ||||||
|     eq({marks[2], positions[2][1], positions[2][2]}, rv[2]) |     eq({marks[2], positions[2][1], positions[2][2]}, rv[2]) | ||||||
|     eq({marks[1], positions[1][1], positions[1][2]}, rv[3]) |     eq({marks[1], positions[1][1], positions[1][2]}, rv[3]) | ||||||
|     -- prevrange with amount |     -- prevrange with limit | ||||||
|     rv = get_extmarks(ns, marks[3], marks[1], {amount=2}) |     rv = get_extmarks(ns, marks[3], marks[1], {limit=2}) | ||||||
|     eq(2, table.getn(rv)) |     eq(2, table.getn(rv)) | ||||||
|     -- prevrange with positional when mark exists at position |     -- prevrange with positional when mark exists at position | ||||||
|     rv = get_extmarks(ns, positions[3], positions[1]) |     rv = get_extmarks(ns, positions[3], positions[1]) | ||||||
| @@ -241,7 +241,7 @@ describe('Extmarks buffer api', function() | |||||||
|     eq({{marks[1], positions[1][1], positions[1][2]}}, rv) |     eq({{marks[1], positions[1][1], positions[1][2]}}, rv) | ||||||
|   end) |   end) | ||||||
|  |  | ||||||
|   it('querying for information with amount #extmarks', function() |   it('querying for information with limit #extmarks', function() | ||||||
|     -- add some more marks |     -- add some more marks | ||||||
|     for i, m in ipairs(marks) do |     for i, m in ipairs(marks) do | ||||||
|       if positions[i] ~= nil then |       if positions[i] ~= nil then | ||||||
| @@ -250,19 +250,19 @@ describe('Extmarks buffer api', function() | |||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     local rv = get_extmarks(ns, {0, 0}, {-1, -1}, {amount=1}) |     local rv = get_extmarks(ns, {0, 0}, {-1, -1}, {limit=1}) | ||||||
|     eq(1, table.getn(rv)) |     eq(1, table.getn(rv)) | ||||||
|     rv = get_extmarks(ns, {0, 0}, {-1, -1}, {amount=2}) |     rv = get_extmarks(ns, {0, 0}, {-1, -1}, {limit=2}) | ||||||
|     eq(2, table.getn(rv)) |     eq(2, table.getn(rv)) | ||||||
|     rv = get_extmarks(ns, {0, 0}, {-1, -1}, {amount=3}) |     rv = get_extmarks(ns, {0, 0}, {-1, -1}, {limit=3}) | ||||||
|     eq(3, table.getn(rv)) |     eq(3, table.getn(rv)) | ||||||
|  |  | ||||||
|     -- now in reverse |     -- now in reverse | ||||||
|     rv = get_extmarks(ns, {0, 0}, {-1, -1}, {amount=1}) |     rv = get_extmarks(ns, {0, 0}, {-1, -1}, {limit=1}) | ||||||
|     eq(1, table.getn(rv)) |     eq(1, table.getn(rv)) | ||||||
|     rv = get_extmarks(ns, {0, 0}, {-1, -1}, {amount=2}) |     rv = get_extmarks(ns, {0, 0}, {-1, -1}, {limit=2}) | ||||||
|     eq(2, table.getn(rv)) |     eq(2, table.getn(rv)) | ||||||
|     rv = get_extmarks(ns, {0, 0}, {-1, -1}, {amount=3}) |     rv = get_extmarks(ns, {0, 0}, {-1, -1}, {limit=3}) | ||||||
|     eq(3, table.getn(rv)) |     eq(3, table.getn(rv)) | ||||||
|   end) |   end) | ||||||
|  |  | ||||||
| @@ -295,9 +295,9 @@ describe('Extmarks buffer api', function() | |||||||
|        rv) |        rv) | ||||||
|   end) |   end) | ||||||
|  |  | ||||||
|   it('get_marks amount 0 returns nothing #extmarks', function() |   it('get_marks limit=0 returns nothing #extmarks', function() | ||||||
|     set_extmark(ns, marks[1], positions[1][1], positions[1][2]) |     set_extmark(ns, marks[1], positions[1][1], positions[1][2]) | ||||||
|     local rv = get_extmarks(ns, {-1, -1}, {-1, -1}, {amount=0}) |     local rv = get_extmarks(ns, {-1, -1}, {-1, -1}, {limit=0}) | ||||||
|     eq({}, rv) |     eq({}, rv) | ||||||
|   end) |   end) | ||||||
|  |  | ||||||
| @@ -730,7 +730,7 @@ describe('Extmarks buffer api', function() | |||||||
|     -- Test updates |     -- Test updates | ||||||
|     feed('o<esc>') |     feed('o<esc>') | ||||||
|     set_extmark(ns, marks[1], positions[1][1], positions[1][2]) |     set_extmark(ns, marks[1], positions[1][1], positions[1][2]) | ||||||
|     rv = get_extmarks(ns, marks[1], marks[1], {amount=1}) |     rv = get_extmarks(ns, marks[1], marks[1], {limit=1}) | ||||||
|     eq(1, table.getn(rv)) |     eq(1, table.getn(rv)) | ||||||
|     feed("u") |     feed("u") | ||||||
|     feed("<c-r>") |     feed("<c-r>") | ||||||
| @@ -771,23 +771,23 @@ describe('Extmarks buffer api', function() | |||||||
|     set_extmark(ns2, marks[2], positions[2][1], positions[2][2]) |     set_extmark(ns2, marks[2], positions[2][1], positions[2][2]) | ||||||
|     set_extmark(ns2, marks[3], positions[3][1], positions[3][2]) |     set_extmark(ns2, marks[3], positions[3][1], positions[3][2]) | ||||||
|  |  | ||||||
|     -- get_next (amount set) |     -- get_next (limit set) | ||||||
|     rv = get_extmarks(ns, {0, 0}, positions[2], {amount=1}) |     rv = get_extmarks(ns, {0, 0}, positions[2], {limit=1}) | ||||||
|     eq(1, table.getn(rv)) |     eq(1, table.getn(rv)) | ||||||
|     rv = get_extmarks(ns2, {0, 0}, positions[2], {amount=1}) |     rv = get_extmarks(ns2, {0, 0}, positions[2], {limit=1}) | ||||||
|     eq(1, table.getn(rv)) |     eq(1, table.getn(rv)) | ||||||
|     -- get_prev (amount set) |     -- get_prev (limit set) | ||||||
|     rv = get_extmarks(ns, positions[1], {0, 0}, {amount=1}) |     rv = get_extmarks(ns, positions[1], {0, 0}, {limit=1}) | ||||||
|     eq(1, table.getn(rv)) |     eq(1, table.getn(rv)) | ||||||
|     rv = get_extmarks(ns2, positions[1], {0, 0}, {amount=1}) |     rv = get_extmarks(ns2, positions[1], {0, 0}, {limit=1}) | ||||||
|     eq(1, table.getn(rv)) |     eq(1, table.getn(rv)) | ||||||
|  |  | ||||||
|     -- get_next (amount not set) |     -- get_next (no limit) | ||||||
|     rv = get_extmarks(ns, positions[1], positions[2]) |     rv = get_extmarks(ns, positions[1], positions[2]) | ||||||
|     eq(2, table.getn(rv)) |     eq(2, table.getn(rv)) | ||||||
|     rv = get_extmarks(ns2, positions[1], positions[2]) |     rv = get_extmarks(ns2, positions[1], positions[2]) | ||||||
|     eq(2, table.getn(rv)) |     eq(2, table.getn(rv)) | ||||||
|     -- get_prev (amount not set) |     -- get_prev (no limit) | ||||||
|     rv = get_extmarks(ns, positions[2], positions[1]) |     rv = get_extmarks(ns, positions[2], positions[1]) | ||||||
|     eq(2, table.getn(rv)) |     eq(2, table.getn(rv)) | ||||||
|     rv = get_extmarks(ns2, positions[2], positions[1]) |     rv = get_extmarks(ns2, positions[2], positions[1]) | ||||||
| @@ -1250,7 +1250,7 @@ describe('Extmarks buffer api', function() | |||||||
|     eq("col value outside range", pcall_err(set_extmark, ns, marks[1], 0, invalid_col)) |     eq("col value outside range", pcall_err(set_extmark, ns, marks[1], 0, invalid_col)) | ||||||
|   end) |   end) | ||||||
|  |  | ||||||
|   it('when line > line_count, throw error #extmarks', function() |   it('fails when line > line_count #extmarks', function() | ||||||
|     local invalid_col = init_text:len() + 1 |     local invalid_col = init_text:len() + 1 | ||||||
|     local invalid_lnum = 3 |     local invalid_lnum = 3 | ||||||
|     eq('line value outside range', pcall_err(set_extmark, ns, marks[1], invalid_lnum, invalid_col)) |     eq('line value outside range', pcall_err(set_extmark, ns, marks[1], invalid_lnum, invalid_col)) | ||||||
| @@ -1258,10 +1258,9 @@ describe('Extmarks buffer api', function() | |||||||
|   end) |   end) | ||||||
|  |  | ||||||
|   it('bug from check_col in extmark_set #extmarks_sub', function() |   it('bug from check_col in extmark_set #extmarks_sub', function() | ||||||
|     -- This bug was caused by extmark_set always using |     -- This bug was caused by extmark_set always using check_col. check_col | ||||||
|     -- check_col. check_col always uses the current buffer. |     -- always uses the current buffer. This wasn't working during undo so we | ||||||
|     -- This wasn't working during undo so we now use |     -- now use check_col and check_lnum only when they are required. | ||||||
|     -- check_col and check_lnum only when they are required. |  | ||||||
|     feed('A<cr>67890<cr>xx<esc>') |     feed('A<cr>67890<cr>xx<esc>') | ||||||
|     feed('A<cr>12345<cr>67890<cr>xx<esc>') |     feed('A<cr>12345<cr>67890<cr>xx<esc>') | ||||||
|     set_extmark(ns, marks[1], 3, 4) |     set_extmark(ns, marks[1], 3, 4) | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ local request = helpers.request | |||||||
| local retry = helpers.retry | local retry = helpers.retry | ||||||
| local NIL = helpers.NIL | local NIL = helpers.NIL | ||||||
|  |  | ||||||
| describe('api', function() | describe('API', function() | ||||||
|   before_each(clear) |   before_each(clear) | ||||||
|  |  | ||||||
|   describe('nvim_get_proc_children', function() |   describe('nvim_get_proc_children', function() | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ describe('cmdline CTRL-R', function() | |||||||
|     -- <CR> inserted between lines, NOT after the final line. |     -- <CR> inserted between lines, NOT after the final line. | ||||||
|     eq('line1abc\rline2somemoretext', funcs.getcmdline()) |     eq('line1abc\rline2somemoretext', funcs.getcmdline()) | ||||||
|  |  | ||||||
|     -- Yank 2 lines characterwise, then paste to cmdline. |     -- Yank 2 lines charwise, then paste to cmdline. | ||||||
|     feed([[<C-\><C-N>gg05lyvj:<C-R>0]]) |     feed([[<C-\><C-N>gg05lyvj:<C-R>0]]) | ||||||
|     -- <CR> inserted between lines, NOT after the final line. |     -- <CR> inserted between lines, NOT after the final line. | ||||||
|     eq('abc\rline2', funcs.getcmdline()) |     eq('abc\rline2', funcs.getcmdline()) | ||||||
|   | |||||||
| @@ -307,7 +307,7 @@ describe('put command', function() | |||||||
|   -- }}} |   -- }}} | ||||||
|  |  | ||||||
|   -- Conversion functions {{{ |   -- Conversion functions {{{ | ||||||
|   local function convert_characterwise(expect_base, conversion_table, |   local function convert_charwise(expect_base, conversion_table, | ||||||
|                                        virtualedit_end, visual_put) |                                        virtualedit_end, visual_put) | ||||||
|     expect_base = dedent(expect_base) |     expect_base = dedent(expect_base) | ||||||
|     -- There is no difference between 'P' and 'p' when VIsual_active |     -- There is no difference between 'P' and 'p' when VIsual_active | ||||||
| @@ -335,7 +335,7 @@ describe('put command', function() | |||||||
|       expect_base = expect_base:gsub('(test_stringx?)"', '%1.') |       expect_base = expect_base:gsub('(test_stringx?)"', '%1.') | ||||||
|     end |     end | ||||||
|     return expect_base |     return expect_base | ||||||
|   end -- convert_characterwise() |   end -- convert_charwise() | ||||||
|  |  | ||||||
|   local function make_back(string) |   local function make_back(string) | ||||||
|     local prev_line |     local prev_line | ||||||
| @@ -500,7 +500,7 @@ describe('put command', function() | |||||||
|   local function run_normal_mode_tests(test_string, base_map, extra_setup, |   local function run_normal_mode_tests(test_string, base_map, extra_setup, | ||||||
|                                        virtualedit_end, selection_string) |                                        virtualedit_end, selection_string) | ||||||
|     local function convert_closure(e, c) |     local function convert_closure(e, c) | ||||||
|       return convert_characterwise(e, c, virtualedit_end, selection_string) |       return convert_charwise(e, c, virtualedit_end, selection_string) | ||||||
|     end |     end | ||||||
|     local function expect_normal_creator(expect_base, conversion_table) |     local function expect_normal_creator(expect_base, conversion_table) | ||||||
|       local test_expect = expect_creator(convert_closure, expect_base, conversion_table) |       local test_expect = expect_creator(convert_closure, expect_base, conversion_table) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Justin M. Keyes
					Justin M. Keyes