terminal_multiplexer 0.1.1 → 1.0.0
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/README.md +2 -2
- data/doc/examples/tmux_wrapper-thor.rb +3 -1
- data/env +1 -1
- data/lib/terminal-multiplexer.rb +44 -15
- data/lib/terminal-multiplexer/exceptions.rb +7 -0
- data/lib/terminal-multiplexer/session.rb +27 -10
- data/lib/terminal-multiplexer/version.rb +1 -1
- data/lib/terminal-multiplexer/window.rb +6 -0
- data/spec/session/session_spec.rb +17 -20
- data/spec/spec_helper.rb +5 -0
- data/spec/terminal-multiplexer/terminal-multiplexer_spec.rb +24 -24
- metadata +3 -3
data/README.md
CHANGED
@@ -17,10 +17,10 @@ require 'terminal-multiplexer'
|
|
17
17
|
tmux = Terminal::Multiplexer.new
|
18
18
|
#create new session to hold all windows
|
19
19
|
tmux.new_session
|
20
|
-
tmux.new_session('window_name','command')
|
20
|
+
tmux.new_session(:session_name => 'session_name' , :window_name => 'window_name', :command => 'command')
|
21
21
|
#create new window
|
22
22
|
tmux.new_window
|
23
|
-
tmux.new_window('window_name','command')
|
23
|
+
tmux.new_window(:window_name => 'window_name', :command => 'command')
|
24
24
|
#start tmux
|
25
25
|
tmux.start
|
26
26
|
```
|
@@ -10,8 +10,10 @@ class Default < Thor
|
|
10
10
|
tmux.new_session
|
11
11
|
tmux.new_window
|
12
12
|
tmux.new_window
|
13
|
+
tmux.new_session(:session_name=>'session1',:window_name=>'window1',:command=>'zsh')
|
13
14
|
tmux.new_window
|
14
|
-
tmux.new_window('tests', 'guard')
|
15
|
+
tmux.new_window(:name => 'tests', :command=>'guard')
|
16
|
+
tmux.active_window(2)
|
15
17
|
tmux.start
|
16
18
|
end
|
17
19
|
end
|
data/env
CHANGED
data/lib/terminal-multiplexer.rb
CHANGED
@@ -9,39 +9,62 @@ module Terminal
|
|
9
9
|
class Multiplexer
|
10
10
|
include Exceptions
|
11
11
|
|
12
|
-
|
13
|
-
def initialize(*options)
|
14
|
-
# @options = {
|
15
|
-
# :default_cmd => 'zsh'
|
16
|
-
# }.update options
|
17
|
-
#
|
12
|
+
def initialize
|
18
13
|
@sessions = []
|
19
14
|
end
|
20
15
|
|
21
|
-
|
22
|
-
|
23
|
-
|
16
|
+
# Creates a new tmux session
|
17
|
+
#
|
18
|
+
# @session_name [String] name the name of the session
|
19
|
+
# @window_name [String] name the name of first window of the session
|
20
|
+
# @command [String] command the command which should be started in the first window of the session
|
21
|
+
def new_session(options={})
|
22
|
+
|
23
|
+
options = {
|
24
|
+
:session_name => 'default',
|
25
|
+
:window_name => 'tab',
|
26
|
+
:command => 'zsh'
|
27
|
+
}.update options
|
28
|
+
|
29
|
+
if @sessions.find { |s| s.session_name == options[:session_name] }
|
30
|
+
raise DuplicateSessionIdentifier , "Please do not reuse the session identifier. You used \"#{options[:session_name]}\" at least twice."
|
24
31
|
end
|
25
32
|
|
26
|
-
session = Session.new(
|
33
|
+
session = Session.new(options[:session_name], options[:window_name], options[:command])
|
27
34
|
@sessions << session
|
28
35
|
session
|
29
36
|
end
|
30
37
|
|
38
|
+
# Creates a new tmux window
|
39
|
+
#
|
40
|
+
# @name [String] name the name of the window, which should be created
|
41
|
+
# @command [String] command the command which should be started in the created window
|
42
|
+
def new_window(options={})
|
43
|
+
|
44
|
+
options = {
|
45
|
+
:name => 'tab',
|
46
|
+
:command => 'zsh'
|
47
|
+
}.update options
|
31
48
|
|
32
|
-
|
49
|
+
# windows will be attached to the last session defined
|
33
50
|
session = get_last_session
|
34
51
|
|
52
|
+
#if no sessions have been created, create a new one
|
35
53
|
if session == nil
|
36
54
|
say "Warning: No valid session found. Create a default one"
|
37
55
|
session = new_session
|
38
56
|
end
|
39
|
-
|
40
|
-
|
57
|
+
|
58
|
+
#windows belong to a session
|
59
|
+
session.add_window Window.new( options[:name] , options[:command] )
|
41
60
|
|
42
61
|
end
|
43
|
-
|
62
|
+
|
63
|
+
# Set the active window in that session
|
64
|
+
#
|
65
|
+
# @num [Integer] number the number of window which should be active in that tmux session
|
44
66
|
def active_window(num)
|
67
|
+
# the active window will always be set for the last defined session
|
45
68
|
session = get_last_session
|
46
69
|
session.active_window(num)
|
47
70
|
end
|
@@ -49,10 +72,13 @@ module Terminal
|
|
49
72
|
|
50
73
|
private
|
51
74
|
|
75
|
+
# Get the last defined session
|
52
76
|
def get_last_session
|
53
77
|
@sessions[-1]
|
54
78
|
end
|
55
79
|
|
80
|
+
# Build the parameter string for all the sessions + windows
|
81
|
+
# to be used as a parameter for tmux to create that sessions and windows
|
56
82
|
def build_multiplexer_command_string
|
57
83
|
m_str = @sessions.collect{ |s| s.plain}.join(' ')
|
58
84
|
m_str
|
@@ -60,10 +86,13 @@ module Terminal
|
|
60
86
|
|
61
87
|
public
|
62
88
|
|
89
|
+
# Start tmux
|
90
|
+
#
|
91
|
+
# @process_info [Hash] process_information a hash containing information about the tmux process to be started
|
63
92
|
def start(process_info={})
|
64
93
|
|
65
94
|
process_info[:cmd] = 'tmux'
|
66
|
-
process_info[:status] = system("#{process_info[:cmd]} #{build_multiplexer_command_string}")
|
95
|
+
process_info[:status] = system("#{process_info[:cmd]} #{build_multiplexer_command_string} attach")
|
67
96
|
|
68
97
|
end
|
69
98
|
|
@@ -1,9 +1,16 @@
|
|
1
1
|
module Terminal
|
2
2
|
module Exceptions
|
3
3
|
|
4
|
+
# Exception which should be raised
|
5
|
+
# if no session is found which can be used
|
6
|
+
# for that particular command
|
7
|
+
#
|
4
8
|
class SessionNotFound < Exception
|
5
9
|
end
|
6
10
|
|
11
|
+
# If you create a session you could choose an identifier
|
12
|
+
# on your own. Every Session has to have its own
|
13
|
+
# unique session identifier.
|
7
14
|
class DuplicateSessionIdentifier < Exception
|
8
15
|
end
|
9
16
|
|
@@ -1,50 +1,67 @@
|
|
1
1
|
module Terminal
|
2
2
|
class Session
|
3
|
-
attr_reader :
|
3
|
+
attr_reader :session_name, :window_name, :command
|
4
4
|
|
5
|
-
|
5
|
+
# Create the session
|
6
|
+
#
|
7
|
+
# @session_name [String] session_name the name of the session
|
8
|
+
# @window_name [String] window_name the name of the first window of the session
|
9
|
+
# @command [String] command the command which should be executed in the first window of the session
|
10
|
+
def initialize(session_name, window_name, command)
|
6
11
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
@name = name
|
12
|
+
@session_name = session_name
|
13
|
+
@window_name = window_name
|
11
14
|
@command = command
|
12
15
|
@windows = []
|
13
16
|
@active_window = 1
|
14
17
|
end
|
15
18
|
|
19
|
+
# Set the active window in that session
|
20
|
+
#
|
21
|
+
# @num [Integer] number the number of the active window of that session
|
16
22
|
def active_window(num)
|
17
23
|
@active_window=num
|
18
24
|
end
|
19
25
|
|
26
|
+
# Build the whole session string for tmux
|
27
|
+
#
|
20
28
|
def plain
|
21
29
|
w_defs ||= build_window_string
|
22
|
-
|
30
|
+
s_opts ||= build_session_options
|
23
31
|
|
24
|
-
"new-session #{
|
32
|
+
"new-session #{s_opts} #{command}\\;#{w_defs}"
|
25
33
|
end
|
26
34
|
|
27
35
|
private
|
28
36
|
|
29
|
-
|
30
|
-
|
37
|
+
# Build the session options
|
38
|
+
#
|
39
|
+
def build_session_options
|
40
|
+
"-s #{session_name} -n #{window_name}"
|
31
41
|
end
|
32
42
|
|
33
43
|
|
44
|
+
# Build the string containing all created windows
|
45
|
+
#
|
34
46
|
def build_window_string
|
35
47
|
w_str = ''
|
36
48
|
|
49
|
+
#strings for the windows
|
37
50
|
if @windows.count > 0
|
38
51
|
w_str += ' '
|
39
52
|
w_str += @windows.collect{|w| w.plain}.join(' ')
|
40
53
|
end
|
41
54
|
|
55
|
+
#string for the selected window in that session
|
42
56
|
w_str += " select-window -t:+#{@active_window}\\;"
|
43
57
|
|
44
58
|
end
|
45
59
|
|
46
60
|
public
|
47
61
|
|
62
|
+
# Add a window to the session
|
63
|
+
#
|
64
|
+
# @window [Window] window the object containing the window which should be added to the session
|
48
65
|
def add_window(window)
|
49
66
|
@windows << window
|
50
67
|
end
|
@@ -2,6 +2,10 @@ module Terminal
|
|
2
2
|
class Window
|
3
3
|
attr_accessor :name, :command
|
4
4
|
|
5
|
+
# Create a tmux window
|
6
|
+
#
|
7
|
+
# @name [String] name the name of the window
|
8
|
+
# @command [String] command the command executed in the window
|
5
9
|
def initialize(name = 'tab', command = 'zsh')
|
6
10
|
|
7
11
|
name = 'tab' if name == nil or name == ''
|
@@ -12,6 +16,8 @@ module Terminal
|
|
12
16
|
@options = []
|
13
17
|
end
|
14
18
|
|
19
|
+
# Return the tmux string for the window
|
20
|
+
#
|
15
21
|
def plain
|
16
22
|
@options.push "-n #{name}"
|
17
23
|
"new-window #{@options.join(' ')} #{command}\\;"
|
@@ -2,36 +2,33 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Terminal
|
4
4
|
describe Session do
|
5
|
-
let(:sess) { Session.new }
|
5
|
+
let(:sess) { Session.new('default','tab','zsh') }
|
6
6
|
|
7
7
|
describe "run with rubbish options" do
|
8
|
-
let(:sess) { Session.new(nil,nil) }
|
8
|
+
let(:sess) { Session.new(nil,nil,nil) }
|
9
9
|
|
10
|
-
it "has a name" do
|
11
|
-
|
10
|
+
it "has a session name" do
|
11
|
+
sess.session_name.should == nil
|
12
12
|
end
|
13
13
|
|
14
|
-
it "
|
15
|
-
sess.
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe "run with no option" do
|
20
|
-
|
21
|
-
it "has a name" do
|
22
|
-
sess.name.should == 'default'
|
14
|
+
it "has a window name" do
|
15
|
+
sess.window_name.should == nil
|
23
16
|
end
|
24
17
|
|
25
|
-
it "
|
26
|
-
sess.command.should ==
|
18
|
+
it "has a command associated with it" do
|
19
|
+
sess.command.should == nil
|
27
20
|
end
|
28
21
|
end
|
29
22
|
|
30
23
|
describe "run with option" do
|
31
|
-
let(:sess) { Session.new('session','ksh') }
|
24
|
+
let(:sess) { Session.new('session','tab','ksh') }
|
25
|
+
|
26
|
+
it "has a session name" do
|
27
|
+
sess.session_name.should == 'session'
|
28
|
+
end
|
32
29
|
|
33
|
-
it "has a name" do
|
34
|
-
sess.
|
30
|
+
it "has a window name" do
|
31
|
+
sess.window_name.should == 'tab'
|
35
32
|
end
|
36
33
|
|
37
34
|
it "has a command associated with it" do
|
@@ -41,7 +38,7 @@ module Terminal
|
|
41
38
|
|
42
39
|
describe "#plain" do
|
43
40
|
it "returns the correct tmux string" do
|
44
|
-
sess.plain.should == "new-session -
|
41
|
+
sess.plain.should == "new-session -s default -n tab zsh\\; select-window -t:+1\\;"
|
45
42
|
end
|
46
43
|
end
|
47
44
|
|
@@ -53,7 +50,7 @@ module Terminal
|
|
53
50
|
|
54
51
|
it "returns the correct tmux string" do
|
55
52
|
sess.add_window(@win)
|
56
|
-
sess.plain.should == "new-session -
|
53
|
+
sess.plain.should == "new-session -s default -n tab zsh\\; new-window -n tab zsh\\; select-window -t:+1\\;"
|
57
54
|
end
|
58
55
|
end
|
59
56
|
|
data/spec/spec_helper.rb
CHANGED
@@ -11,18 +11,18 @@ module Terminal
|
|
11
11
|
|
12
12
|
it "creates a new session with default name" do
|
13
13
|
multi.new_session
|
14
|
-
multi.send(:build_multiplexer_command_string).should == "new-session -
|
14
|
+
multi.send(:build_multiplexer_command_string).should == "new-session -s default -n tab zsh\\; select-window -t:+1\\;"
|
15
15
|
end
|
16
16
|
|
17
17
|
it "creates a new session with given name" do
|
18
|
-
multi.new_session('session1','ksh')
|
19
|
-
multi.send(:build_multiplexer_command_string).should == "new-session -
|
18
|
+
multi.new_session(:session_name => 'session1', :window_name => 'tab', :command => 'ksh')
|
19
|
+
multi.send(:build_multiplexer_command_string).should == "new-session -s session1 -n tab ksh\\; select-window -t:+1\\;"
|
20
20
|
end
|
21
21
|
|
22
22
|
it "creates a string for all sessions created" do
|
23
23
|
multi.new_session
|
24
|
-
multi.new_session('session1','ksh')
|
25
|
-
multi.send(:build_multiplexer_command_string).should == "new-session -
|
24
|
+
multi.new_session(:session_name => 'session1', :window_name => 'tab', :command => 'ksh')
|
25
|
+
multi.send(:build_multiplexer_command_string).should == "new-session -s default -n tab zsh\\; select-window -t:+1\\; new-session -s session1 -n tab ksh\\; select-window -t:+1\\;"
|
26
26
|
end
|
27
27
|
|
28
28
|
it "raises an exception if a session identifier is reused" do
|
@@ -36,47 +36,47 @@ module Terminal
|
|
36
36
|
describe "#new_window" do
|
37
37
|
it "creates a new window for the default session" do
|
38
38
|
multi.new_window
|
39
|
-
multi.send(:build_multiplexer_command_string).should == "new-session -
|
39
|
+
multi.send(:build_multiplexer_command_string).should == "new-session -s default -n tab zsh\\; new-window -n tab zsh\\; select-window -t:+1\\;"
|
40
40
|
end
|
41
41
|
it "creates a new window for \"session1\"" do
|
42
|
-
multi.new_session('session1','ksh')
|
42
|
+
multi.new_session(:session_name => 'session1', :window_name => 'tab', :command => 'ksh')
|
43
43
|
multi.new_window
|
44
|
-
multi.send(:build_multiplexer_command_string).should == "new-session -
|
44
|
+
multi.send(:build_multiplexer_command_string).should == "new-session -s session1 -n tab ksh\\; new-window -n tab zsh\\; select-window -t:+1\\;"
|
45
45
|
end
|
46
46
|
|
47
47
|
it "creates a new window for session \"default\"" do
|
48
48
|
multi.new_session
|
49
49
|
multi.new_window
|
50
|
-
multi.send(:build_multiplexer_command_string).should == "new-session -
|
50
|
+
multi.send(:build_multiplexer_command_string).should == "new-session -s default -n tab zsh\\; new-window -n tab zsh\\; select-window -t:+1\\;"
|
51
51
|
end
|
52
52
|
|
53
53
|
it "creates 2 windows in session1 and 2 windows in session2 (the last defined session, after creating the windows)" do
|
54
|
-
multi.new_session('session1','ksh')
|
55
|
-
multi.new_window('window1','ksh')
|
56
|
-
multi.new_window('window2','ksh')
|
57
|
-
multi.new_session('session2','ksh')
|
58
|
-
multi.new_window('window3','ksh')
|
59
|
-
multi.new_window('window4','ksh')
|
60
|
-
multi.send(:build_multiplexer_command_string).should == "new-session -
|
54
|
+
multi.new_session(:session_name => 'session1', :window_name => 'tab', :command => 'ksh')
|
55
|
+
multi.new_window(:name => 'window1', :command => 'ksh')
|
56
|
+
multi.new_window(:name => 'window2', :command => 'ksh')
|
57
|
+
multi.new_session(:session_name => 'session2', :window_name => 'tab', :command => 'ksh')
|
58
|
+
multi.new_window(:name => 'window3', :command => 'ksh')
|
59
|
+
multi.new_window(:name => 'window4', :command => 'ksh')
|
60
|
+
multi.send(:build_multiplexer_command_string).should == "new-session -s session1 -n tab ksh\\; new-window -n window1 ksh\\; new-window -n window2 ksh\\; select-window -t:+1\\; new-session -s session2 -n tab ksh\\; new-window -n window3 ksh\\; new-window -n window4 ksh\\; select-window -t:+1\\;"
|
61
61
|
end
|
62
62
|
|
63
63
|
end
|
64
64
|
|
65
65
|
describe "#active_window" do
|
66
66
|
it "selects the window from the last defined session" do
|
67
|
-
multi.new_session('session1','ksh')
|
68
|
-
multi.new_window('window1','ksh')
|
69
|
-
multi.new_window('window2','ksh')
|
67
|
+
multi.new_session(:session_name => 'session1', :window_name => 'tab', :command => 'ksh')
|
68
|
+
multi.new_window(:name => 'window1', :command => 'ksh')
|
69
|
+
multi.new_window(:name => 'window2', :command => 'ksh')
|
70
70
|
multi.active_window(2)
|
71
|
-
multi.send(:build_multiplexer_command_string).should == "new-session -
|
71
|
+
multi.send(:build_multiplexer_command_string).should == "new-session -s session1 -n tab ksh\\; new-window -n window1 ksh\\; new-window -n window2 ksh\\; select-window -t:+2\\;"
|
72
72
|
end
|
73
73
|
|
74
74
|
it "doesn't matter where you place the window selector. It selects the window from the last defined session" do
|
75
|
-
multi.new_session('session1','ksh')
|
75
|
+
multi.new_session(:session_name => 'session1', :window_name => 'tab', :command => 'ksh')
|
76
76
|
multi.active_window(2)
|
77
|
-
multi.new_window('window1','ksh')
|
78
|
-
multi.new_window('window2','ksh')
|
79
|
-
multi.send(:build_multiplexer_command_string).should == "new-session -
|
77
|
+
multi.new_window(:name => 'window1', :command => 'ksh')
|
78
|
+
multi.new_window(:name => 'window2', :command => 'ksh')
|
79
|
+
multi.send(:build_multiplexer_command_string).should == "new-session -s session1 -n tab ksh\\; new-window -n window1 ksh\\; new-window -n window2 ksh\\; select-window -t:+2\\;"
|
80
80
|
end
|
81
81
|
end
|
82
82
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: terminal_multiplexer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-01-04 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: highline
|
16
|
-
requirement: &
|
16
|
+
requirement: &13995980 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *13995980
|
25
25
|
description:
|
26
26
|
email:
|
27
27
|
- dev@fedux.org
|