mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	API: nvim_create_buf: add scratch parameter
				
					
				
			Creating a scratch buffer is a chore/ritual, and would be more useful/common if formally exposed.
This commit is contained in:
		| @@ -1256,6 +1256,7 @@ directory	Displays directory contents.  Can be used by a file explorer | |||||||
| <		The buffer name is the name of the directory and is adjusted | <		The buffer name is the name of the directory and is adjusted | ||||||
| 		when using the |:cd| command. | 		when using the |:cd| command. | ||||||
|  |  | ||||||
|  | 						*scratch-buffer* | ||||||
| scratch		Contains text that can be discarded at any time.  It is kept | scratch		Contains text that can be discarded at any time.  It is kept | ||||||
| 		when closing the window, it must be deleted explicitly. | 		when closing the window, it must be deleted explicitly. | ||||||
| 		Settings: > | 		Settings: > | ||||||
|   | |||||||
| @@ -955,23 +955,36 @@ void nvim_set_current_win(Window window, Error *err) | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| /// Create new empty buffer | /// Creates a new, empty, unnamed buffer. | ||||||
| /// | /// | ||||||
| /// @param listed whether the buffer should be listed | /// @param listed Controls 'buflisted' | ||||||
|  | /// @param scratch Creates a "throwaway" |scratch-buffer| for temporary work | ||||||
|  | ///                (always 'nomodified') | ||||||
| /// @param[out] err Error details, if any | /// @param[out] err Error details, if any | ||||||
| /// @return the buffer handle or 0 when error | /// @return Buffer handle, or 0 on error | ||||||
| Buffer nvim_create_buf(Boolean listed, Error *err) | /// | ||||||
|  | /// @see buf_open_scratch | ||||||
|  | Buffer nvim_create_buf(Boolean listed, Boolean scratch, Error *err) | ||||||
|   FUNC_API_SINCE(6) |   FUNC_API_SINCE(6) | ||||||
| { | { | ||||||
|   try_start(); |   try_start(); | ||||||
|   Buffer buffer = buflist_add(NULL, |   buf_T *buf = buflist_new(NULL, NULL, (linenr_T)0, | ||||||
|                            BLN_NOOPT | BLN_NEW | (listed ? BLN_LISTED : 0)); |                            BLN_NOOPT | BLN_NEW | (listed ? BLN_LISTED : 0)); | ||||||
|   if (!try_end(err) && buffer == 0) { |   try_end(err); | ||||||
|     api_set_error(err, |   if (buf == NULL) { | ||||||
|                   kErrorTypeException, |     if (!ERROR_SET(err)) { | ||||||
|                   "Failed to create buffer"); |       api_set_error(err, kErrorTypeException, "Failed to create buffer"); | ||||||
|     } |     } | ||||||
|   return buffer; |     return 0; | ||||||
|  |   } | ||||||
|  |   if (scratch) { | ||||||
|  |     WITH_BUFFER(buf, { | ||||||
|  |       set_option_value("bh", 0L, "hide", OPT_LOCAL); | ||||||
|  |       set_option_value("bt", 0L, "nofile", OPT_LOCAL); | ||||||
|  |       set_option_value("swf", 0L, NULL, OPT_LOCAL); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |   return buf->b_fnum; | ||||||
| } | } | ||||||
|  |  | ||||||
| /// Gets the current list of tabpage handles. | /// Gets the current list of tabpage handles. | ||||||
|   | |||||||
| @@ -1312,8 +1312,8 @@ describe('API', function() | |||||||
|  |  | ||||||
|   describe('nvim_create_buf', function() |   describe('nvim_create_buf', function() | ||||||
|     it('works', function() |     it('works', function() | ||||||
|       eq({id=2}, meths.create_buf(true)) |       eq({id=2}, meths.create_buf(true, false)) | ||||||
|       eq({id=3}, meths.create_buf(false)) |       eq({id=3}, meths.create_buf(false, false)) | ||||||
|       eq('  1 %a   "[No Name]"                    line 1\n'.. |       eq('  1 %a   "[No Name]"                    line 1\n'.. | ||||||
|          '  2      "[No Name]"                    line 0', |          '  2      "[No Name]"                    line 0', | ||||||
|          meths.command_output("ls")) |          meths.command_output("ls")) | ||||||
| @@ -1336,7 +1336,7 @@ describe('API', function() | |||||||
|  |  | ||||||
|     it('can change buftype before visiting', function() |     it('can change buftype before visiting', function() | ||||||
|       meths.set_option("hidden", false) |       meths.set_option("hidden", false) | ||||||
|       eq({id=2}, meths.create_buf(true)) |       eq({id=2}, meths.create_buf(true, false)) | ||||||
|       meths.buf_set_option(2, "buftype", "nofile") |       meths.buf_set_option(2, "buftype", "nofile") | ||||||
|       meths.buf_set_lines(2, 0, -1, true, {"test text"}) |       meths.buf_set_lines(2, 0, -1, true, {"test text"}) | ||||||
|       command("split | buffer 2") |       command("split | buffer 2") | ||||||
| @@ -1345,5 +1345,48 @@ describe('API', function() | |||||||
|       command("close") |       command("close") | ||||||
|       eq({id=1}, meths.get_current_buf()) |       eq({id=1}, meths.get_current_buf()) | ||||||
|     end) |     end) | ||||||
|  |  | ||||||
|  |     it('|scratch-buffer|', function() | ||||||
|  |       eq({id=2}, meths.create_buf(false, true)) | ||||||
|  |       eq({id=3}, meths.create_buf(true, true)) | ||||||
|  |       eq({id=4}, meths.create_buf(true, true)) | ||||||
|  |       local scratch_bufs = { 2, 3, 4 } | ||||||
|  |       eq('  1 %a   "[No Name]"                    line 1\n'.. | ||||||
|  |          '  3      "[Scratch]"                    line 0\n'.. | ||||||
|  |          '  4      "[Scratch]"                    line 0', | ||||||
|  |          meths.command_output("ls")) | ||||||
|  |       -- current buffer didn't change | ||||||
|  |       eq({id=1}, meths.get_current_buf()) | ||||||
|  |  | ||||||
|  |       local screen = Screen.new(20, 4) | ||||||
|  |       screen:attach() | ||||||
|  |  | ||||||
|  |       -- | ||||||
|  |       -- Editing a scratch-buffer does NOT change its properties. | ||||||
|  |       -- | ||||||
|  |       local edited_buf = 2 | ||||||
|  |       meths.buf_set_lines(edited_buf, 0, -1, true, {"some text"}) | ||||||
|  |       for _,b in ipairs(scratch_bufs) do | ||||||
|  |         eq('nofile', meths.buf_get_option(b, 'buftype')) | ||||||
|  |         eq('hide', meths.buf_get_option(b, 'bufhidden')) | ||||||
|  |         eq(false, meths.buf_get_option(b, 'swapfile')) | ||||||
|  |       end | ||||||
|  |  | ||||||
|  |       -- | ||||||
|  |       -- Visiting a scratch-buffer DOES change its properties. | ||||||
|  |       -- | ||||||
|  |       meths.set_current_buf(edited_buf) | ||||||
|  |       screen:expect([[ | ||||||
|  |         ^some text           | | ||||||
|  |         {1:~                   }| | ||||||
|  |         {1:~                   }| | ||||||
|  |                             | | ||||||
|  |       ]], { | ||||||
|  |         [1] = {bold = true, foreground = Screen.colors.Blue1}, | ||||||
|  |       }) | ||||||
|  |       eq('', meths.buf_get_option(edited_buf, 'buftype')) | ||||||
|  |       eq('', meths.buf_get_option(edited_buf, 'bufhidden')) | ||||||
|  |       eq(false, meths.buf_get_option(edited_buf, 'swapfile')) | ||||||
|  |     end) | ||||||
|   end) |   end) | ||||||
| end) | end) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Justin M. Keyes
					Justin M. Keyes