Ensure runner_pane is valid before using

This protects all commands that expect a runner pane from runner
against an invalid pane, including the Vim pane. Since the user can
modified the tmux layout and open and close panes outside the context
of VTR, it's neccesary to check this before any command that requires
the runner pane.

Closes #28 - Protect against running command against invalid panes
This commit is contained in:
Chris Toomey 2014-12-31 14:45:28 -05:00
parent e8abf1ae69
commit 8399c4ab7b

View File

@ -35,23 +35,27 @@ function! s:CreateRunnerPane(...)
endfunction
function! s:DetachRunnerPane()
if !s:RequireRunnerPane() | return | endif
if !s:ValidRunnerPaneSet() | return | endif
call s:BreakRunnerPaneToTempWindow()
let cmd = join(["rename-window -t", s:detached_window, g:VtrDetachedName])
call s:SendTmuxCommand(cmd)
endfunction
function! s:RequireRunnerPane()
function! s:ValidRunnerPaneSet()
if !exists("s:runner_pane")
call s:EchoError("VTR: No runner pane attached.")
call s:EchoError("No runner pane attached.")
return 0
endif
if !s:ValidRunnerPaneNumber(s:runner_pane)
call s:EchoError("Runner pane setting (" . s:runner_pane . ") is invalid. Please reattach.")
return 0
endif
return 1
endfunction
function! s:RequireDetachedPane()
function! s:DetachedPaneAvailable()
if !exists("s:detached_window")
call s:EchoError("VTR: No detached runner pane.")
call s:EchoError("No detached runner pane.")
return 0
endif
return 1
@ -59,7 +63,7 @@ endfunction
function! s:RequireLocalPaneOrDetached()
if !exists('s:detached_window') && !exists('s:runner_pane')
call s:EchoError("VTR: No pane, local or detached.")
call s:EchoError("No pane, local or detached.")
return 0
endif
return 1
@ -116,7 +120,7 @@ function! s:RunnerPaneDimensions()
endfunction
function! s:FocusRunnerPane()
if !s:RequireRunnerPane() | return | endif
if !s:ValidRunnerPaneSet() | return | endif
call s:FocusTmuxPane(s:runner_pane)
call s:SendTmuxCommand("resize-pane -Z")
endfunction
@ -151,7 +155,7 @@ function! s:SendEnterSequence()
endfunction
function! s:SendClearSequence()
if !s:RequireRunnerPane() | return | endif
if !s:ValidRunnerPaneSet() | return | endif
call s:_SendKeys(g:VtrClearSequence)
endfunction
@ -219,7 +223,7 @@ function! s:AltPane()
if s:PaneCount() == 2
return s:AvailableRunnerPaneIndices()[0]
else
echoerr "VTR: AltPane only valid if two panes open"
echoerr "AltPane only valid if two panes open"
endif
endfunction
@ -258,7 +262,7 @@ function! s:AttachToPane(desired_pane)
endfunction
function! s:EchoError(message)
echohl ErrorMsg | echo "\r". a:message | echohl None
echohl ErrorMsg | echo "\rVTR: ". a:message | echohl None
endfunction
function! s:ValidRunnerPaneNumber(desired_pane)
@ -268,7 +272,7 @@ function! s:ValidRunnerPaneNumber(desired_pane)
endfunction
function! s:ReattachPane()
if !s:RequireDetachedPane() | return | endif
if !s:DetachedPaneAvailable() | return | endif
call s:_ReattachPane()
call s:FocusVimPane()
if g:VtrClearOnReattach
@ -277,7 +281,7 @@ function! s:ReattachPane()
endfunction
function! s:ReorientRunner()
if !s:RequireRunnerPane() | return | endif
if !s:ValidRunnerPaneSet() | return | endif
let temp_window = s:BreakRunnerPaneToTempWindow()
call s:ToggleOrientationVariable()
call s:_ReattachPane()
@ -299,7 +303,7 @@ function! s:FlushCommand()
endfunction
function! s:SendCommandToRunner(...)
if !s:RequireRunnerPane() | return | endif
if !s:ValidRunnerPaneSet() | return | endif
if exists("a:1") && a:1 != ""
let s:user_command = shellescape(a:1)
endif
@ -309,7 +313,7 @@ function! s:SendCommandToRunner(...)
let escaped_empty_string = "''"
if s:user_command == escaped_empty_string
unlet s:user_command
call s:EchoError("VTR: command string required")
call s:EchoError("command string required")
return
endif
if g:VtrClearBeforeSend
@ -351,7 +355,7 @@ function! s:PrepareLines(lines)
endfunction
function! s:SendTextToRunner(lines)
if !s:RequireRunnerPane() | return | endif
if !s:ValidRunnerPaneSet() | return | endif
let prepared = s:PrepareLines(a:lines)
let joined_lines = join(prepared, "\r") . "\r"
let send_keys_cmd = s:TargetedTmuxCommand("send-keys", s:runner_pane)
@ -360,7 +364,7 @@ function! s:SendTextToRunner(lines)
endfunction
function! s:SendCtrlD()
if !s:RequireRunnerPane() | return | endif
if !s:ValidRunnerPaneSet() | return | endif
call s:SendKeys('')
endfunction