mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	:ls : show "R", "F" for terminal-jobs #10370
This matches Vim behavior. From `:help :ls` :
    R    a terminal buffer with a running job
    F    a terminal buffer with a finished job
    ?    a terminal buffer without a job: `:terminal NONE`
TODO: implement `:terminal NONE`.
ref #10349
			
			
This commit is contained in:
		| @@ -29,6 +29,7 @@ | |||||||
| #include "nvim/api/vim.h" | #include "nvim/api/vim.h" | ||||||
| #include "nvim/ascii.h" | #include "nvim/ascii.h" | ||||||
| #include "nvim/assert.h" | #include "nvim/assert.h" | ||||||
|  | #include "nvim/channel.h" | ||||||
| #include "nvim/vim.h" | #include "nvim/vim.h" | ||||||
| #include "nvim/buffer.h" | #include "nvim/buffer.h" | ||||||
| #include "nvim/charset.h" | #include "nvim/charset.h" | ||||||
| @@ -2608,9 +2609,10 @@ void buflist_list(exarg_T *eap) | |||||||
|     const int changed_char = (buf->b_flags & BF_READERR) |     const int changed_char = (buf->b_flags & BF_READERR) | ||||||
|       ? 'x' |       ? 'x' | ||||||
|       : (bufIsChanged(buf) ? '+' : ' '); |       : (bufIsChanged(buf) ? '+' : ' '); | ||||||
|     const int ro_char = !MODIFIABLE(buf) |     int ro_char = !MODIFIABLE(buf) ? '-' : (buf->b_p_ro ? '=' : ' '); | ||||||
|       ? '-' |     if (buf->terminal) { | ||||||
|       : (buf->b_p_ro ? '=' : ' '); |       ro_char = channel_job_running((uint64_t)buf->b_p_channel) ? 'R' : 'F'; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     msg_putchar('\n'); |     msg_putchar('\n'); | ||||||
|     len = vim_snprintf( |     len = vim_snprintf( | ||||||
|   | |||||||
| @@ -762,6 +762,14 @@ static void set_info_event(void **argv) | |||||||
|   channel_decref(chan); |   channel_decref(chan); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | bool channel_job_running(uint64_t id) | ||||||
|  | { | ||||||
|  |   Channel *chan = find_channel(id); | ||||||
|  |   return (chan | ||||||
|  |           && chan->streamtype == kChannelStreamProc | ||||||
|  |           && !process_is_stopped(&chan->stream.proc)); | ||||||
|  | } | ||||||
|  |  | ||||||
| Dictionary channel_info(uint64_t id) | Dictionary channel_info(uint64_t id) | ||||||
| { | { | ||||||
|   Channel *chan = find_channel(id); |   Channel *chan = find_channel(id); | ||||||
|   | |||||||
| @@ -56,7 +56,8 @@ static inline Process process_init(Loop *loop, ProcessType type, void *data) | |||||||
|  |  | ||||||
| static inline bool process_is_stopped(Process *proc) | static inline bool process_is_stopped(Process *proc) | ||||||
| { | { | ||||||
|   return proc->stopped_time != 0; |   bool exited = (proc->status >= 0); | ||||||
|  |   return exited || (proc->stopped_time != 0); | ||||||
| } | } | ||||||
|  |  | ||||||
| #ifdef INCLUDE_GENERATED_DECLARATIONS | #ifdef INCLUDE_GENERATED_DECLARATIONS | ||||||
|   | |||||||
							
								
								
									
										33
									
								
								test/functional/ex_cmds/ls_spec.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								test/functional/ex_cmds/ls_spec.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | |||||||
|  | local helpers = require('test.functional.helpers')(after_each) | ||||||
|  | local clear = helpers.clear | ||||||
|  | local command = helpers.command | ||||||
|  | local eq = helpers.eq | ||||||
|  | local eval = helpers.eval | ||||||
|  | local feed = helpers.feed | ||||||
|  | local retry = helpers.retry | ||||||
|  |  | ||||||
|  | describe(':ls', function() | ||||||
|  |   before_each(function() | ||||||
|  |     clear() | ||||||
|  |   end) | ||||||
|  |  | ||||||
|  |   it('R, F for :terminal buffers', function() | ||||||
|  |     command('edit foo') | ||||||
|  |     command('set hidden') | ||||||
|  |     command('terminal') | ||||||
|  |     command('vsplit') | ||||||
|  |     command('terminal') | ||||||
|  |     feed('iexit<cr>') | ||||||
|  |     retry(nil, 5000, function() | ||||||
|  |       local ls_output = eval('execute("ls")') | ||||||
|  |       -- Normal buffer. | ||||||
|  |       eq('\n  1  h ', string.match(ls_output, '\n *1....')) | ||||||
|  |       -- Terminal buffer [R]unning. | ||||||
|  |       eq('\n  2 #aR', string.match(ls_output, '\n *2....')) | ||||||
|  |       -- Terminal buffer [F]inished. | ||||||
|  |       eq('\n  3 %aF', string.match(ls_output, '\n *3....')) | ||||||
|  |     end) | ||||||
|  |   end) | ||||||
|  |  | ||||||
|  | end) | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user
	 Justin M. Keyes
					Justin M. Keyes