From 41bcb5b8878479691091d939d1a34b45cb1a2b08 Mon Sep 17 00:00:00 2001 From: Chris Toomey Date: Fri, 23 Nov 2012 11:24:55 -0500 Subject: [PATCH] Add RotateRunner command --- plugin/vim-tmux-runner.vim | 99 +++++++++++++++++++++++++++++++------- 1 file changed, 82 insertions(+), 17 deletions(-) diff --git a/plugin/vim-tmux-runner.vim b/plugin/vim-tmux-runner.vim index 19e4a1f..a1a959d 100644 --- a/plugin/vim-tmux-runner.vim +++ b/plugin/vim-tmux-runner.vim @@ -8,24 +8,33 @@ " " Returns: " 1 if the var is set, 0 otherwise -function! s:initVariable(var, value) +function! s:InitVariable(var, value) if !exists(a:var) - exec 'let ' . a:var . ' = ' . "'" . substitute(a:value, "'", "''", "g") . "'" + let escaped_value = substitute(a:value, "'", "''", "g") + exec 'let ' . a:var . ' = ' . "'" . escaped_value . "'" return 1 endif return 0 endfunction +function! s:InitializeVariables() + call s:InitVariable("g:VtrPercentage", 20) + call s:InitVariable("g:VtrOrientation", "v") +endfunction +call s:InitializeVariables() + function! s:OpenRunnerPane() - let s:cached_vim_pane = s:ActiveTmuxPaneNumber() - call s:CallTmuxCommand("split-window -p 20 -v") - let s:cached_runner_pane = s:ActiveTmuxPaneNumber() - call s:FocusTmuxPane(s:cached_vim_pane) + let s:vim_pane = s:ActiveTmuxPaneNumber() + let cmd = join(["split-window -p", g:VtrPercentage, "-".g:VtrOrientation]) + call s:SendTmuxCommand(cmd) + let s:runner_pane = s:ActiveTmuxPaneNumber() + call s:FocusVimPane() endfunction function! s:KillRunnerPane() - call s:CallTargetedTmuxCommand("kill-pane", s:cached_runner_pane) - unlet s:cached_runner_pane + let targeted_cmd = s:TargetedTmuxCommand("kill-pane", s:runner_pane) + call s:SendTmuxCommand(targeted_cmd) + unlet s:runner_pane endfunction function! s:ActiveTmuxPaneNumber() @@ -37,31 +46,87 @@ function! s:ActiveTmuxPaneNumber() endfunction function! s:TmuxPanes() - let panes = s:CallTmuxCommand("list-panes") + let panes = s:SendTmuxCommand("list-panes") return split(panes, '\n') endfunction function! s:FocusTmuxPane(pane_number) - call s:CallTargetedTmuxCommand("select-pane", a:pane_number) + let targeted_cmd = s:TargetedTmuxCommand("select-pane", a:pane_number) + call s:SendTmuxCommand(targeted_cmd) endfunction function! s:FocusRunnerPane() - call s:FocusTmuxPane(s:cached_runner_pane) + call s:FocusTmuxPane(s:runner_pane) endfunction -function! s:CallTmuxCommand(command) - let prexied_command = "tmux " . a:command - return system(prexied_command) +function! s:SendTmuxCommand(command) + let prefixed_command = "tmux " . a:command + return system(prefixed_command) endfunction -function! s:CallTargetedTmuxCommand(command, target_pane) - let targeted_command = a:command . " -t " . a:target_pane - call s:CallTmuxCommand(targeted_command) +function! s:TargetedTmuxCommand(command, target_pane) + return a:command . " -t " . a:target_pane +endfunction + +function! s:SendEnterSequence() + let targeted_cmd = s:TargetedTmuxCommand("send-keys", s:runner_pane) + let enter_sequence = targeted_cmd . " Enter" + call s:SendTmuxCommand(enter_sequence) +endfunction + +function! s:SendClearSequence() + let targeted_cmd = s:TargetedTmuxCommand("send-keys", s:runner_pane) + let enter_sequence = targeted_cmd . " clear" + call s:SendTmuxCommand(enter_sequence) + call s:SendEnterSequence() + sleep 50m +endfunction + +function! s:FocusVimPane() + call s:FocusTmuxPane(s:vim_pane) +endfunction + +function! s:TempWindowNumber() + return split(s:SendTmuxCommand("list-windows"), '\n')[-1][0] +endfunction + +function! s:BreakRunnerPaneToTempWindow() + let targeted_cmd = s:TargetedTmuxCommand("break-pane", s:runner_pane) + let full_command = join([targeted_cmd, "-d"]) + call s:SendTmuxCommand(full_command) + return s:TempWindowNumber() +endfunction + +function! s:ToggleOrientationVariable() + let g:VtrOrientation = (g:VtrOrientation == "v" ? "h" : "v") +endfunction + +function! s:RotateRunner() + let temp_window = s:BreakRunnerPaneToTempWindow() + call s:ToggleOrientationVariable() + let join_cmd = join(["join-pane", "-s", ":".temp_window.".0", "-p", g:VtrPercentage, "-".g:VtrOrientation]) + echom join_cmd + call s:SendTmuxCommand(join_cmd) + call s:FocusVimPane() +endfunction + +function! s:SendCommandToRunner() + echohl String + let user_command = shellescape(input("Command to run: ")) + let targeted_cmd = s:TargetedTmuxCommand("send-keys", s:runner_pane) + let full_command = join([targeted_cmd, user_command]) + call s:SendClearSequence() + call s:SendTmuxCommand(full_command) + call s:SendEnterSequence() endfunction command! VTROpenRunner :call s:OpenRunnerPane() command! VTRKillRunner :call s:KillRunnerPane() command! VTRFocusRunnerPane :call s:FocusRunnerPane() +command! VTRSendCommandToRunner :call s:SendCommandToRunner() +command! VTRRotateRunner :call s:RotateRunner() +nmap ,rr :VTRRotateRunner +nmap ,sc :VTRSendCommandToRunner nmap ,or :VTROpenRunner nmap ,kr :VTRKillRunner nmap ,fr :VTRFocusRunnerPane