teamocil 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +1 -1
- data/README.md +3 -1
- data/lib/teamocil/layout/session.rb +31 -0
- data/lib/teamocil/layout/split.rb +64 -0
- data/lib/teamocil/layout/window.rb +55 -0
- data/lib/teamocil/layout.rb +4 -133
- data/lib/teamocil.rb +1 -1
- metadata +60 -84
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -19,6 +19,7 @@ $ teamocil sample
|
|
19
19
|
* `--here` opens the session in the current window, it doesn’t create an empty first window.
|
20
20
|
* `--layout` takes a custom file path to a YAML layout file.
|
21
21
|
* `--edit` opens the layout file (whether or not `--layout` is used) with `$EDITOR`.
|
22
|
+
* `--list` lists all available layouts.
|
22
23
|
|
23
24
|
## Layout file structure
|
24
25
|
|
@@ -187,6 +188,7 @@ compctl -g '~/.teamocil/*(:t:r)' teamocil
|
|
187
188
|
## Todo list
|
188
189
|
|
189
190
|
* Making sure the layout is valid before executing it (ie. throw exceptions).
|
191
|
+
* Add more specs.
|
190
192
|
|
191
193
|
## Contributors
|
192
194
|
|
@@ -199,4 +201,4 @@ Take a look at the `spec` folder before you do, and make sure `bundle exec rake
|
|
199
201
|
|
200
202
|
## License
|
201
203
|
|
202
|
-
Teamocil is © 2011 [Rémi Prévost](http://exomel.com) and may be freely distributed under the [LITL license](http://litl.info/). See the `LICENSE` file.
|
204
|
+
Teamocil is © 2011-2012 [Rémi Prévost](http://exomel.com) and may be freely distributed under the [LITL license](http://litl.info/). See the `LICENSE` file.
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Teamocil
|
2
|
+
class Layout
|
3
|
+
|
4
|
+
# This class represents a session within tmux
|
5
|
+
class Session
|
6
|
+
attr_reader :options, :windows, :name
|
7
|
+
|
8
|
+
# Initialize a new tmux session
|
9
|
+
#
|
10
|
+
# @param options [Hash] the options, mostly passed by the CLI
|
11
|
+
# @param attrs [Hash] the session data from the layout file
|
12
|
+
def initialize(options, attrs={}) # {{{
|
13
|
+
@name = attrs["name"]
|
14
|
+
@windows = attrs["windows"].each_with_index.map { |window, window_index| Window.new(self, window_index, window) }
|
15
|
+
@options = options
|
16
|
+
end # }}}
|
17
|
+
|
18
|
+
# Generate commands to send to tmux
|
19
|
+
#
|
20
|
+
# @return [Array]
|
21
|
+
def generate_commands # {{{
|
22
|
+
commands = []
|
23
|
+
commands << "tmux rename-session \"#{@name}\"" unless @name.nil?
|
24
|
+
commands << @windows.map(&:generate_commands)
|
25
|
+
commands << "tmux select-pane -t 0"
|
26
|
+
commands
|
27
|
+
end # }}}
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Teamocil
|
2
|
+
class Layout
|
3
|
+
|
4
|
+
# This class represents a split within a tmux window
|
5
|
+
class Split
|
6
|
+
attr_reader :width, :height, :cmd, :index, :target
|
7
|
+
|
8
|
+
# Initialize a new tmux split
|
9
|
+
#
|
10
|
+
# @param session [Session] the window where the split is initialized
|
11
|
+
# @param index [Fixnnum] the split index
|
12
|
+
# @param attrs [Hash] the split data from the layout file
|
13
|
+
def initialize(window, index, attrs={}) # {{{
|
14
|
+
@height = attrs["height"]
|
15
|
+
@width = attrs["width"]
|
16
|
+
@cmd = attrs["cmd"]
|
17
|
+
@target = attrs["target"]
|
18
|
+
|
19
|
+
@window = window
|
20
|
+
@index = index
|
21
|
+
end # }}}
|
22
|
+
|
23
|
+
# Generate commands to send to tmux
|
24
|
+
#
|
25
|
+
# @return [Array]
|
26
|
+
def generate_commands # {{{
|
27
|
+
commands = []
|
28
|
+
|
29
|
+
# Is it a vertical or horizontal split?
|
30
|
+
init_command = ""
|
31
|
+
unless @index == 0
|
32
|
+
if !@width.nil?
|
33
|
+
init_command = "tmux split-window -h -p #{@width}"
|
34
|
+
elsif !@height.nil?
|
35
|
+
init_command = "tmux split-window -p #{@height}"
|
36
|
+
else
|
37
|
+
init_command = "tmux split-window"
|
38
|
+
end
|
39
|
+
init_command << " -t #{@target}" unless @target.nil?
|
40
|
+
commands << init_command
|
41
|
+
end
|
42
|
+
|
43
|
+
# Wrap all commands around filters
|
44
|
+
@cmd = [@window.filters["before"]] + [@cmd] + [@window.filters["after"]]
|
45
|
+
|
46
|
+
# If a `root` key exist, start each split in this directory
|
47
|
+
@cmd.unshift "cd \"#{@window.root}\"" unless @window.root.nil?
|
48
|
+
|
49
|
+
# Set the TEAMOCIL environment variable
|
50
|
+
@cmd.unshift "export TEAMOCIL=1"
|
51
|
+
|
52
|
+
# Execute each split command
|
53
|
+
@cmd.flatten.compact.each do |command|
|
54
|
+
commands << "tmux send-keys -t #{@index} \"#{command}\""
|
55
|
+
commands << "tmux send-keys -t #{@index} Enter"
|
56
|
+
end
|
57
|
+
|
58
|
+
commands
|
59
|
+
end # }}}
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Teamocil
|
2
|
+
class Layout
|
3
|
+
|
4
|
+
# This class represents a window within tmux
|
5
|
+
class Window
|
6
|
+
attr_reader :filters, :root, :splits, :options, :index, :name
|
7
|
+
|
8
|
+
# Initialize a new tmux window
|
9
|
+
#
|
10
|
+
# @param session [Session] the session where the window is initialized
|
11
|
+
# @param index [Fixnnum] the window index
|
12
|
+
# @param attrs [Hash] the window data from the layout file
|
13
|
+
def initialize(session, index, attrs={}) # {{{
|
14
|
+
@name = attrs["name"]
|
15
|
+
@root = attrs["root"]
|
16
|
+
@options = attrs["options"] || {}
|
17
|
+
|
18
|
+
@splits = attrs["splits"] || []
|
19
|
+
@splits = @splits.each_with_index.map { |split, split_index| Split.new(self, split_index, split) }
|
20
|
+
|
21
|
+
@filters = attrs["filters"] || {}
|
22
|
+
@filters["before"] ||= []
|
23
|
+
@filters["after"] ||= []
|
24
|
+
|
25
|
+
@index = index
|
26
|
+
@session = session
|
27
|
+
end # }}}
|
28
|
+
|
29
|
+
# Generate commands to send to tmux
|
30
|
+
#
|
31
|
+
# @return [Array]
|
32
|
+
def generate_commands # {{{
|
33
|
+
commands = []
|
34
|
+
|
35
|
+
if @session.options.include?(:here) and @index == 0
|
36
|
+
commands << "tmux rename-window \"#{@name}\""
|
37
|
+
else
|
38
|
+
commands << "tmux new-window -n \"#{@name}\""
|
39
|
+
end
|
40
|
+
|
41
|
+
commands << @splits.map(&:generate_commands)
|
42
|
+
|
43
|
+
@options.each_pair do |option, value|
|
44
|
+
value = "on" if value === true
|
45
|
+
value = "off" if value === false
|
46
|
+
commands << "tmux set-window-option #{option} #{value}"
|
47
|
+
end
|
48
|
+
|
49
|
+
commands
|
50
|
+
end # }}}
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
data/lib/teamocil/layout.rb
CHANGED
@@ -2,140 +2,11 @@ module Teamocil
|
|
2
2
|
|
3
3
|
# This class act as a wrapper around a tmux YAML layout file
|
4
4
|
class Layout
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
class Session
|
9
|
-
attr_reader :options, :windows, :name
|
10
|
-
|
11
|
-
# Initialize a new tmux session
|
12
|
-
#
|
13
|
-
# @param options [Hash] the options, mostly passed by the CLI
|
14
|
-
# @param attrs [Hash] the session data from the layout file
|
15
|
-
def initialize(options, attrs={}) # {{{
|
16
|
-
@name = attrs["name"]
|
17
|
-
@windows = attrs["windows"].each_with_index.map { |window, window_index| Window.new(self, window_index, window) }
|
18
|
-
@options = options
|
19
|
-
end # }}}
|
20
|
-
|
21
|
-
# Generate commands to send to tmux
|
22
|
-
#
|
23
|
-
# @return [Array]
|
24
|
-
def generate_commands # {{{
|
25
|
-
commands = []
|
26
|
-
commands << "tmux rename-session \"#{@name}\"" unless @name.nil?
|
27
|
-
commands << @windows.map(&:generate_commands)
|
28
|
-
commands << "tmux select-pane -t 0"
|
29
|
-
commands
|
30
|
-
end # }}}
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
# This class represents a window within tmux
|
35
|
-
class Window
|
36
|
-
attr_reader :filters, :root, :splits, :options, :index, :name
|
37
|
-
|
38
|
-
# Initialize a new tmux window
|
39
|
-
#
|
40
|
-
# @param session [Session] the session where the window is initialized
|
41
|
-
# @param index [Fixnnum] the window index
|
42
|
-
# @param attrs [Hash] the window data from the layout file
|
43
|
-
def initialize(session, index, attrs={}) # {{{
|
44
|
-
@name = attrs["name"]
|
45
|
-
@root = attrs["root"]
|
46
|
-
@options = attrs["options"] || {}
|
47
|
-
|
48
|
-
@splits = attrs["splits"] || []
|
49
|
-
@splits = @splits.each_with_index.map { |split, split_index| Split.new(self, split_index, split) }
|
50
|
-
|
51
|
-
@filters = attrs["filters"] || {}
|
52
|
-
@filters["before"] ||= []
|
53
|
-
@filters["after"] ||= []
|
54
|
-
|
55
|
-
@index = index
|
56
|
-
@session = session
|
57
|
-
end # }}}
|
58
|
-
|
59
|
-
# Generate commands to send to tmux
|
60
|
-
#
|
61
|
-
# @return [Array]
|
62
|
-
def generate_commands # {{{
|
63
|
-
commands = []
|
64
|
-
|
65
|
-
if @session.options.include?(:here) and @index == 0
|
66
|
-
commands << "tmux rename-window \"#{@name}\""
|
67
|
-
else
|
68
|
-
commands << "tmux new-window -n \"#{@name}\""
|
69
|
-
end
|
70
|
-
|
71
|
-
commands << @splits.map(&:generate_commands)
|
5
|
+
autoload :Session, "teamocil/layout/session"
|
6
|
+
autoload :Window, "teamocil/layout/window"
|
7
|
+
autoload :Split, "teamocil/layout/split"
|
72
8
|
|
73
|
-
|
74
|
-
value = "on" if value === true
|
75
|
-
value = "off" if value === false
|
76
|
-
commands << "tmux set-window-option #{option} #{value}"
|
77
|
-
end
|
78
|
-
|
79
|
-
commands
|
80
|
-
end # }}}
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
# This class represents a split within a tmux window
|
85
|
-
class Split
|
86
|
-
attr_reader :width, :height, :cmd, :index, :target
|
87
|
-
|
88
|
-
# Initialize a new tmux split
|
89
|
-
#
|
90
|
-
# @param session [Session] the window where the split is initialized
|
91
|
-
# @param index [Fixnnum] the split index
|
92
|
-
# @param attrs [Hash] the split data from the layout file
|
93
|
-
def initialize(window, index, attrs={}) # {{{
|
94
|
-
@height = attrs["height"]
|
95
|
-
@width = attrs["width"]
|
96
|
-
@cmd = attrs["cmd"]
|
97
|
-
@target = attrs["target"]
|
98
|
-
|
99
|
-
@window = window
|
100
|
-
@index = index
|
101
|
-
end # }}}
|
102
|
-
|
103
|
-
# Generate commands to send to tmux
|
104
|
-
#
|
105
|
-
# @return [Array]
|
106
|
-
def generate_commands # {{{
|
107
|
-
commands = []
|
108
|
-
|
109
|
-
# Is it a vertical or horizontal split?
|
110
|
-
init_command = ""
|
111
|
-
unless @index == 0
|
112
|
-
if !@width.nil?
|
113
|
-
init_command = "tmux split-window -h -p #{@width}"
|
114
|
-
elsif !@height.nil?
|
115
|
-
init_command = "tmux split-window -p #{@height}"
|
116
|
-
else
|
117
|
-
init_command = "tmux split-window"
|
118
|
-
end
|
119
|
-
init_command << " -t #{@target}" unless @target.nil?
|
120
|
-
commands << init_command
|
121
|
-
end
|
122
|
-
|
123
|
-
# Wrap all commands around filters
|
124
|
-
@cmd = [@window.filters["before"]] + [@cmd] + [@window.filters["after"]]
|
125
|
-
|
126
|
-
# If a `root` key exist, start each split in this directory
|
127
|
-
@cmd.unshift "cd \"#{@window.root}\"" unless @window.root.nil?
|
128
|
-
|
129
|
-
# Execute each split command
|
130
|
-
@cmd.flatten.compact.each do |command|
|
131
|
-
commands << "tmux send-keys -t #{@index} \"#{command}\""
|
132
|
-
commands << "tmux send-keys -t #{@index} Enter"
|
133
|
-
end
|
134
|
-
|
135
|
-
commands
|
136
|
-
end # }}}
|
137
|
-
|
138
|
-
end
|
9
|
+
attr_reader :session
|
139
10
|
|
140
11
|
# Initialize a new layout from a hash
|
141
12
|
#
|
data/lib/teamocil.rb
CHANGED
metadata
CHANGED
@@ -1,87 +1,68 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: teamocil
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.2
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 3
|
9
|
-
- 1
|
10
|
-
version: 0.3.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
13
|
-
-
|
7
|
+
authors:
|
8
|
+
- Rémi Prévost
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-03-05 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: rake
|
22
|
-
|
23
|
-
version_requirements: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70203537739940 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
|
30
|
-
- 0
|
31
|
-
version: "0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
32
23
|
prerelease: false
|
33
|
-
|
34
|
-
- !ruby/object:Gem::Dependency
|
24
|
+
version_requirements: *70203537739940
|
25
|
+
- !ruby/object:Gem::Dependency
|
35
26
|
name: rspec
|
36
|
-
|
37
|
-
version_requirements: &id002 !ruby/object:Gem::Requirement
|
27
|
+
requirement: &70203539182320 !ruby/object:Gem::Requirement
|
38
28
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
|
44
|
-
- 0
|
45
|
-
version: "0"
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
46
34
|
prerelease: false
|
47
|
-
|
48
|
-
- !ruby/object:Gem::Dependency
|
35
|
+
version_requirements: *70203539182320
|
36
|
+
- !ruby/object:Gem::Dependency
|
49
37
|
name: yard
|
50
|
-
|
51
|
-
version_requirements: &id003 !ruby/object:Gem::Requirement
|
38
|
+
requirement: &70203539181900 !ruby/object:Gem::Requirement
|
52
39
|
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
|
57
|
-
|
58
|
-
- 0
|
59
|
-
version: "0"
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
60
45
|
prerelease: false
|
61
|
-
|
62
|
-
- !ruby/object:Gem::Dependency
|
46
|
+
version_requirements: *70203539181900
|
47
|
+
- !ruby/object:Gem::Dependency
|
63
48
|
name: maruku
|
64
|
-
|
65
|
-
version_requirements: &id004 !ruby/object:Gem::Requirement
|
49
|
+
requirement: &70203539181480 !ruby/object:Gem::Requirement
|
66
50
|
none: false
|
67
|
-
requirements:
|
68
|
-
- -
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
|
71
|
-
|
72
|
-
- 0
|
73
|
-
version: "0"
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
74
56
|
prerelease: false
|
75
|
-
|
76
|
-
description: Teamocil helps you set up window and splits layouts for tmux using YAML
|
57
|
+
version_requirements: *70203539181480
|
58
|
+
description: Teamocil helps you set up window and splits layouts for tmux using YAML
|
59
|
+
configuration files.
|
77
60
|
email: remi@exomel.com
|
78
|
-
executables:
|
61
|
+
executables:
|
79
62
|
- teamocil
|
80
63
|
extensions: []
|
81
|
-
|
82
64
|
extra_rdoc_files: []
|
83
|
-
|
84
|
-
files:
|
65
|
+
files:
|
85
66
|
- .gitignore
|
86
67
|
- .travis.yml
|
87
68
|
- .yardopts
|
@@ -99,6 +80,9 @@ files:
|
|
99
80
|
- lib/teamocil.rb
|
100
81
|
- lib/teamocil/cli.rb
|
101
82
|
- lib/teamocil/layout.rb
|
83
|
+
- lib/teamocil/layout/session.rb
|
84
|
+
- lib/teamocil/layout/split.rb
|
85
|
+
- lib/teamocil/layout/window.rb
|
102
86
|
- spec/cli_spec.rb
|
103
87
|
- spec/fixtures/.teamocil/sample-2.yml
|
104
88
|
- spec/fixtures/.teamocil/sample.yml
|
@@ -110,38 +94,29 @@ files:
|
|
110
94
|
- teamocil.gemspec
|
111
95
|
homepage: http://github.com/remiprev/teamocil
|
112
96
|
licenses: []
|
113
|
-
|
114
97
|
post_install_message:
|
115
98
|
rdoc_options: []
|
116
|
-
|
117
|
-
require_paths:
|
99
|
+
require_paths:
|
118
100
|
- lib
|
119
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
120
102
|
none: false
|
121
|
-
requirements:
|
122
|
-
- -
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
|
125
|
-
|
126
|
-
- 0
|
127
|
-
version: "0"
|
128
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ! '>='
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
108
|
none: false
|
130
|
-
requirements:
|
131
|
-
- -
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
|
134
|
-
segments:
|
135
|
-
- 0
|
136
|
-
version: "0"
|
109
|
+
requirements:
|
110
|
+
- - ! '>='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
137
113
|
requirements: []
|
138
|
-
|
139
114
|
rubyforge_project:
|
140
|
-
rubygems_version: 1.8.
|
115
|
+
rubygems_version: 1.8.10
|
141
116
|
signing_key:
|
142
117
|
specification_version: 3
|
143
118
|
summary: Easy window and split layouts for tmux
|
144
|
-
test_files:
|
119
|
+
test_files:
|
145
120
|
- spec/cli_spec.rb
|
146
121
|
- spec/fixtures/.teamocil/sample-2.yml
|
147
122
|
- spec/fixtures/.teamocil/sample.yml
|
@@ -150,3 +125,4 @@ test_files:
|
|
150
125
|
- spec/mock/cli.rb
|
151
126
|
- spec/mock/layout.rb
|
152
127
|
- spec/spec_helper.rb
|
128
|
+
has_rdoc:
|