tmuxinator 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +1 -1
- data/.travis.yml +5 -0
- data/CHANGELOG.md +36 -0
- data/CONTRIBUTING.md +29 -0
- data/Gemfile +4 -7
- data/{LICENSE.txt → LICENSE} +1 -1
- data/README.md +128 -118
- data/Rakefile +1 -72
- data/bin/mux +8 -3
- data/bin/tmuxinator +8 -3
- data/completion/tmuxinator.bash +18 -0
- data/completion/tmuxinator.zsh +20 -0
- data/lib/tmuxinator.rb +13 -7
- data/lib/tmuxinator/assets/sample.yml +24 -11
- data/lib/tmuxinator/assets/template.erb +47 -0
- data/lib/tmuxinator/cli.rb +121 -145
- data/lib/tmuxinator/config.rb +92 -0
- data/lib/tmuxinator/deprecations.rb +19 -0
- data/lib/tmuxinator/pane.rb +36 -0
- data/lib/tmuxinator/project.rb +142 -0
- data/lib/tmuxinator/util.rb +14 -0
- data/lib/tmuxinator/version.rb +3 -0
- data/lib/tmuxinator/window.rb +76 -0
- data/spec/factories/projects.rb +17 -0
- data/spec/fixtures/sample.deprecations.yml +35 -0
- data/spec/fixtures/sample.yml +35 -0
- data/spec/lib/tmuxinator/cli_spec.rb +230 -0
- data/spec/lib/tmuxinator/config_spec.rb +121 -0
- data/spec/lib/tmuxinator/pane_spec.rb +7 -0
- data/spec/lib/tmuxinator/project_spec.rb +209 -0
- data/spec/lib/tmuxinator/util_spec.rb +4 -0
- data/spec/lib/tmuxinator/window_spec.rb +62 -0
- data/spec/spec_helper.rb +28 -8
- data/tmuxinator.gemspec +47 -65
- metadata +186 -62
- data/.document +0 -5
- data/Gemfile.lock +0 -28
- data/TODO +0 -4
- data/VERSION +0 -1
- data/bin/tmuxinator_completion +0 -29
- data/lib/tmuxinator/assets/tmux_config.tmux +0 -37
- data/lib/tmuxinator/config_writer.rb +0 -104
- data/lib/tmuxinator/helper.rb +0 -19
- data/spec/tmuxinator_spec.rb +0 -54
data/.document
DELETED
data/Gemfile.lock
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: http://rubygems.org/
|
3
|
-
specs:
|
4
|
-
diff-lcs (1.1.3)
|
5
|
-
git (1.2.5)
|
6
|
-
jeweler (1.6.4)
|
7
|
-
bundler (~> 1.0)
|
8
|
-
git (>= 1.2.5)
|
9
|
-
rake
|
10
|
-
rake (0.9.2)
|
11
|
-
rcov (0.9.10)
|
12
|
-
rspec (2.6.0)
|
13
|
-
rspec-core (~> 2.6.0)
|
14
|
-
rspec-expectations (~> 2.6.0)
|
15
|
-
rspec-mocks (~> 2.6.0)
|
16
|
-
rspec-core (2.6.4)
|
17
|
-
rspec-expectations (2.6.0)
|
18
|
-
diff-lcs (~> 1.1.2)
|
19
|
-
rspec-mocks (2.6.0)
|
20
|
-
|
21
|
-
PLATFORMS
|
22
|
-
ruby
|
23
|
-
|
24
|
-
DEPENDENCIES
|
25
|
-
bundler (~> 1.0.18)
|
26
|
-
jeweler (~> 1.6.4)
|
27
|
-
rcov (~> 0.9.10)
|
28
|
-
rspec (~> 2.6.0)
|
data/TODO
DELETED
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.5.0
|
data/bin/tmuxinator_completion
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
#!/usr/bin/env bash
|
2
|
-
|
3
|
-
# Tmuxinator command line completion.
|
4
|
-
|
5
|
-
have=$(command -v tmuxinator)
|
6
|
-
|
7
|
-
test -n "$have" &&
|
8
|
-
_tmuxinator_commands_complete()
|
9
|
-
{
|
10
|
-
COMPREPLY=()
|
11
|
-
if [ $COMP_CWORD = 1 ]; then
|
12
|
-
local commands="open copy delete update_scripts implode list doctor help version"
|
13
|
-
COMPREPLY=(`compgen -W "$commands" -- $2`)
|
14
|
-
fi
|
15
|
-
return 0
|
16
|
-
}
|
17
|
-
|
18
|
-
_tmuxinator_open_complete()
|
19
|
-
{
|
20
|
-
COMPREPLY=()
|
21
|
-
if [ $COMP_CWORD = 1 ]; then
|
22
|
-
local configs=`find ~/.tmuxinator/ -name *.yml | cut -d/ -f5 | sed s:.yml::g`
|
23
|
-
COMPREPLY=(`compgen -W "$configs" -- $2`)
|
24
|
-
fi
|
25
|
-
return 0
|
26
|
-
}
|
27
|
-
|
28
|
-
complete -F _tmuxinator_commands_complete -o default tmuxinator mux
|
29
|
-
complete -F _tmuxinator_open_complete -o default muxo
|
@@ -1,37 +0,0 @@
|
|
1
|
-
#!<%= ENV['SHELL'] || '/bin/bash' %>
|
2
|
-
tmux <%= socket %> start-server
|
3
|
-
|
4
|
-
if ! $(tmux <%= socket %> has-session -t <%=s @project_name %>); then
|
5
|
-
cd <%= @project_root || "." %>
|
6
|
-
<%= @pre.kind_of?(Array) ? @pre.join(" && ") : @pre %>
|
7
|
-
env TMUX= tmux <%= socket %> start-server \; set-option -g base-index 1 \; new-session -d -s <%=s @project_name %> -n <%=s @tabs[0].name %>
|
8
|
-
tmux <%= socket %> set-option -t <%=s @project_name %> default-path <%= @project_root %>
|
9
|
-
|
10
|
-
<% @tabs[1..-1].each_with_index do |tab, i| %>
|
11
|
-
tmux <%= socket %> new-window -t <%= window(i+2) %> -n <%=s tab.name %>
|
12
|
-
<% end %>
|
13
|
-
|
14
|
-
# set up tabs and panes
|
15
|
-
<% @tabs.each_with_index do |tab, i| %>
|
16
|
-
# tab "<%= tab.name %>"
|
17
|
-
<% if tab.command %>
|
18
|
-
<%= send_keys(tab.command, i+1) %>
|
19
|
-
<% elsif tab.panes %>
|
20
|
-
<%= send_keys(tab.panes.shift, i+1) %>
|
21
|
-
<% tab.panes.each do |pane| %>
|
22
|
-
tmux <%= socket %> splitw -t <%= window(i+1) %>
|
23
|
-
<%= send_keys(pane, i+1) %>
|
24
|
-
<% end %>
|
25
|
-
tmux <%= socket %> select-layout -t <%= window(i+1) %> <%=s tab.layout %>
|
26
|
-
<% end %>
|
27
|
-
<% end %>
|
28
|
-
|
29
|
-
tmux <%= socket %> select-window -t <%= window(1) %>
|
30
|
-
|
31
|
-
fi
|
32
|
-
|
33
|
-
if [ -z $TMUX ]; then
|
34
|
-
tmux <%= socket %> -u attach-session -t <%=s @project_name %>
|
35
|
-
else
|
36
|
-
tmux <%= socket %> -u switch-client -t <%=s @project_name %>
|
37
|
-
fi
|
@@ -1,104 +0,0 @@
|
|
1
|
-
module Tmuxinator
|
2
|
-
|
3
|
-
class ConfigWriter
|
4
|
-
attr_accessor :file_name, :file_path, :project_name, :project_root, :rvm, :tabs, :pre
|
5
|
-
|
6
|
-
include Tmuxinator::Helper
|
7
|
-
|
8
|
-
def initialize this_full_path=nil
|
9
|
-
self.file_path = this_full_path if this_full_path
|
10
|
-
end
|
11
|
-
|
12
|
-
def file_path= full_path
|
13
|
-
@file_path = full_path
|
14
|
-
@file_name = File.basename full_path, '.yml'
|
15
|
-
process_config! if full_path && File.exist?(full_path)
|
16
|
-
end
|
17
|
-
|
18
|
-
def write!
|
19
|
-
raise "Unable to write with out a file_name defined" unless self.file_name
|
20
|
-
tmp = File.open(config_path, 'w') {|f| f.write(render) }
|
21
|
-
end
|
22
|
-
|
23
|
-
def render
|
24
|
-
ERB.new(IO.read(TMUX_TEMPLATE)).result(binding)
|
25
|
-
end
|
26
|
-
|
27
|
-
def config_path
|
28
|
-
"#{root_dir}#{file_name}.tmux" if file_name
|
29
|
-
end
|
30
|
-
|
31
|
-
def socket
|
32
|
-
"-L #{@socket_name}" if @socket_name
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def root_dir
|
38
|
-
"$HOME/.tmuxinator/"
|
39
|
-
end
|
40
|
-
|
41
|
-
def process_config!
|
42
|
-
begin
|
43
|
-
yaml = YAML.load(File.read(file_path))
|
44
|
-
rescue
|
45
|
-
exit!("Invalid YAML file format.")
|
46
|
-
end
|
47
|
-
|
48
|
-
exit!("Your configuration file should include some tabs.") if yaml["tabs"].nil?
|
49
|
-
exit!("Your configuration file didn't specify a 'project_root'") if yaml["project_root"].nil?
|
50
|
-
exit!("Your configuration file didn't specify a 'project_name'") if yaml["project_name"].nil?
|
51
|
-
|
52
|
-
@project_name = yaml["project_name"]
|
53
|
-
@project_root = yaml["project_root"]
|
54
|
-
@rvm = yaml["rvm"]
|
55
|
-
@pre = build_command(yaml["pre"])
|
56
|
-
@tabs = []
|
57
|
-
@socket_name = yaml['socket_name']
|
58
|
-
|
59
|
-
yaml["tabs"].each do |tab|
|
60
|
-
t = OpenStruct.new
|
61
|
-
t.name = tab.keys.first
|
62
|
-
value = tab.values.first
|
63
|
-
|
64
|
-
case value
|
65
|
-
when Hash
|
66
|
-
t.panes = (value["panes"] || ['']).map do |pane|
|
67
|
-
build_command(pane)
|
68
|
-
end
|
69
|
-
t.layout = value["layout"]
|
70
|
-
else
|
71
|
-
t.command = build_command(value)
|
72
|
-
end
|
73
|
-
@tabs << t
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def parse_tabs tab_list
|
78
|
-
end
|
79
|
-
|
80
|
-
def shell_escape str
|
81
|
-
"'#{str.to_s.gsub("'") { %('\'') }}'"
|
82
|
-
end
|
83
|
-
alias s shell_escape
|
84
|
-
|
85
|
-
def window(i)
|
86
|
-
"#{s @project_name}:#{i}"
|
87
|
-
end
|
88
|
-
|
89
|
-
def send_keys cmd, window_number
|
90
|
-
return '' unless cmd
|
91
|
-
"tmux #{socket} send-keys -t #{window(window_number)} #{s cmd} C-m"
|
92
|
-
end
|
93
|
-
|
94
|
-
def build_command(value)
|
95
|
-
commands = [value].flatten.compact.reject { |c| c.strip.empty? }
|
96
|
-
if @rvm
|
97
|
-
commands.unshift "rvm use #{@rvm}"
|
98
|
-
end
|
99
|
-
|
100
|
-
commands.join ' && '
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
end
|
data/lib/tmuxinator/helper.rb
DELETED
data/spec/tmuxinator_spec.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe Tmuxinator::ConfigWriter do
|
4
|
-
context "With no defined filename" do
|
5
|
-
its(:file_path){ should be_nil }
|
6
|
-
its(:project_name){ should be_nil }
|
7
|
-
its(:project_root){ should be_nil }
|
8
|
-
its(:rvm){ should be_nil }
|
9
|
-
its(:tabs){ should be_nil }
|
10
|
-
its(:config_path){ should be_nil }
|
11
|
-
its(:pre){ should be_nil }
|
12
|
-
its(:socket){ should be_nil }
|
13
|
-
end
|
14
|
-
|
15
|
-
context "While Defining the filename on init" do
|
16
|
-
subject{ Tmuxinator::ConfigWriter.new(SAMPLE_CONFIG) }
|
17
|
-
its(:file_path){ should eql SAMPLE_CONFIG }
|
18
|
-
its(:file_name){ should eql "sample" }
|
19
|
-
end
|
20
|
-
|
21
|
-
context "After filename has been defined" do
|
22
|
-
before do
|
23
|
-
subject.file_path = SAMPLE_CONFIG
|
24
|
-
end
|
25
|
-
|
26
|
-
its(:file_path){ should eql SAMPLE_CONFIG }
|
27
|
-
its(:file_name){ should eql File.basename(SAMPLE_CONFIG, '.yml')}
|
28
|
-
its(:project_name){ should eql 'Tmuxinator' }
|
29
|
-
its(:project_root){ should eql '~/code/rails_project' }
|
30
|
-
its(:rvm){ should eql '1.9.2@rails_project' }
|
31
|
-
its(:tabs){ should be_an Array }
|
32
|
-
its(:pre){ should eql 'rvm use 1.9.2@rails_project && sudo /etc/rc.d/mysqld start' }
|
33
|
-
its(:socket){ should eql '-L foo' }
|
34
|
-
|
35
|
-
let(:first_tab){ subject.tabs[0] }
|
36
|
-
|
37
|
-
specify{ first_tab.should be_an OpenStruct }
|
38
|
-
specify{ first_tab.name.should eql "editor" }
|
39
|
-
specify{ first_tab.layout.should eql "main-vertical" }
|
40
|
-
specify{ first_tab.panes.should be_an Array }
|
41
|
-
|
42
|
-
it "should prepend each pane with the rvm string" do
|
43
|
-
first_tab.panes.map{|p| p.split(/ && /)[0] }.should eql ["rvm use 1.9.2@rails_project"] * 3
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should append each pane with the command string" do
|
47
|
-
first_tab.panes.map{|p| p.split(/ && /)[1] }.should eql ["vim", nil, "top"]
|
48
|
-
end
|
49
|
-
|
50
|
-
let(:second_tab){ subject.tabs[1] }
|
51
|
-
specify{ second_tab.name.should eql "shell" }
|
52
|
-
specify{ second_tab.command.should eql "rvm use 1.9.2@rails_project && git pull"}
|
53
|
-
end
|
54
|
-
end
|