Commit eb1ae08c authored by Dom Sekotill's avatar Dom Sekotill
Browse files

Fix kodo#toggleterm#Terminal reopening

Adds a new method open() which is called to reopen a terminal if it is
closed.
parent bbd3f7e1
Loading
Loading
Loading
Loading
+38 −21
Original line number Diff line number Diff line
@@ -5,9 +5,11 @@
function! kodo#toggleterm#Terminal(new_win, ...)
	let term = {}
	let term.origin_buffer = v:null
	let term.buffer = v:null
	let term.window = v:null
	let term.was_new = v:null
	let term.new_win = a:new_win
	let term.closed = v:false

	let cmd = get(a:, 1, v:null)
	let term.cmd = type(cmd) == v:t_list ? cmd :
@@ -18,6 +20,10 @@ function! kodo#toggleterm#Terminal(new_win, ...)
	" If a new window is requested it is opened by spliting, which obeys the […] 
	" and […] settings.
	function term.expand(...)
		let origin_buffer = bufnr('')
		if self.buffer == v:null
			call self.open()
		endif
		if self.window != v:null
			call self.collapse()
		endif
@@ -36,7 +42,12 @@ function! kodo#toggleterm#Terminal(new_win, ...)
		endif

		let self.window = win_getid()
		let self.origin_buffer = new_win ? v:null : bufnr('')
		let self.origin_buffer = new_win ? v:null : origin_buffer

		augroup toggleterm
			au! BufLeave <buffer>
			au  BufLeave <buffer> let b:toggleterm.window = v:null
		augroup END

		if has('nvim') && !has('nvim-0.4')
			" Hack to fix terminal resizing bug
@@ -81,15 +92,19 @@ function! kodo#toggleterm#Terminal(new_win, ...)
			silent execute 'buffer' self.origin_buffer
		endif
		silent execute 'bdelete!' self.buffer
		call setbufvar(self.buffer, 'toggleterm', v:null)
		let self.buffer = v:null
		let self.window = v:null
		let self.closed = v:true
	endfunction

	function term.open()
		" Create the terminal buffer
		let origin = bufnr('')
		enew
	let term.buffer =  bufnr('')
		let self.buffer =  bufnr('')

	if term.buffer == origin && origin != 1
		if self.buffer == origin && origin != 1
			echoerr "New buffer appears to have replaced old buffer?"
		endif

@@ -97,17 +112,19 @@ function! kodo#toggleterm#Terminal(new_win, ...)
		setl nobuflisted

		" Start the terminal job
	let term.job = termopen(term.cmd, term)
		let self.job = termopen(self.cmd, self)

		silent execute 'buffer' origin

	if term.job > 0
		return term
	elseif term.job == -1
		echoerr "Not found or executable:" term.cmd[0]
	else
		throw "Failed to open a new terminal; returned: " + term.job
		if self.job == -1
			echoerr "Not found or executable:" self.cmd[0]
		elseif self.job <= 0
			throw "Failed to open a new terminal; returned: " + self.job
		endif

	return v:null
		call setbufvar(self.buffer, 'toggleterm', self)
		let self.closed = v:false
	endfunction

	return term
endfunction