tmux-ruby 0.0.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/.yardopts +1 -0
- data/LICENSE +22 -0
- data/README.md +23 -0
- data/lib/tmux.rb +56 -0
- data/lib/tmux/buffer.rb +131 -0
- data/lib/tmux/client.rb +193 -0
- data/lib/tmux/exception.rb +5 -0
- data/lib/tmux/exception/basic_exception.rb +6 -0
- data/lib/tmux/exception/in_tmux.rb +9 -0
- data/lib/tmux/exception/index_in_use.rb +9 -0
- data/lib/tmux/exception/unknown_command.rb +9 -0
- data/lib/tmux/exception/unsupported_version.rb +15 -0
- data/lib/tmux/filterable_hash.rb +15 -0
- data/lib/tmux/options.rb +109 -0
- data/lib/tmux/options/attr_option.rb +10 -0
- data/lib/tmux/options/bell_action_option.rb +19 -0
- data/lib/tmux/options/boolean_option.rb +26 -0
- data/lib/tmux/options/char_array_option.rb +26 -0
- data/lib/tmux/options/clock_mode_style_option.rb +27 -0
- data/lib/tmux/options/color_option.rb +23 -0
- data/lib/tmux/options/justification_option.rb +19 -0
- data/lib/tmux/options/keymap_option.rb +19 -0
- data/lib/tmux/options/number_option.rb +26 -0
- data/lib/tmux/options/option.rb +38 -0
- data/lib/tmux/options/string_option.rb +26 -0
- data/lib/tmux/options/symbol_option.rb +26 -0
- data/lib/tmux/options/word_array_option.rb +26 -0
- data/lib/tmux/options_list.rb +150 -0
- data/lib/tmux/pane.rb +496 -0
- data/lib/tmux/server.rb +217 -0
- data/lib/tmux/session.rb +312 -0
- data/lib/tmux/status_bar.rb +134 -0
- data/lib/tmux/status_bar/field.rb +129 -0
- data/lib/tmux/version.rb +4 -0
- data/lib/tmux/widget.rb +35 -0
- data/lib/tmux/widgets/progress_bar.rb +107 -0
- data/lib/tmux/window.rb +697 -0
- data/lib/tmux/window/status.rb +21 -0
- data/lib/tmux/window/status/state.rb +87 -0
- metadata +96 -0
data/lib/tmux/server.rb
ADDED
@@ -0,0 +1,217 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
module Tmux
|
3
|
+
class Server
|
4
|
+
include Comparable
|
5
|
+
|
6
|
+
# Creates a new session
|
7
|
+
#
|
8
|
+
# @option args [Boolean] :attach (false) Attach to the new session?
|
9
|
+
# @option args [String] :name (nil) Name of the new session. Will
|
10
|
+
# be automatically generated of nil.
|
11
|
+
# @option args [String] :window_name (nil) Name of the initial
|
12
|
+
# window. Cannot be used when grouping sessions.
|
13
|
+
# @option args [Session] :group_with (nil) Group with this
|
14
|
+
# session, sharing all windows.
|
15
|
+
# @option args [String] :command (nil) Execute this command in the
|
16
|
+
# initial window. Cannot be used when grouping sessions.
|
17
|
+
#
|
18
|
+
# @return [Session, nil] Returns the new {Session session} if a
|
19
|
+
# `:name` has been given and if `:attach` is false
|
20
|
+
#
|
21
|
+
# @raise [ArgumentError] if combining `:group_with` and `:window_name`
|
22
|
+
# or :command
|
23
|
+
#
|
24
|
+
# @tmuxver >=1.4
|
25
|
+
def create_session(args = {})
|
26
|
+
check_for_version!("1.4")
|
27
|
+
|
28
|
+
if args[:group_with] && (args[:window_name] || args[:command])
|
29
|
+
raise ArgumentError, "Cannot combine :group_with and :window_name or :command"
|
30
|
+
end
|
31
|
+
|
32
|
+
# FIXME shell escape names
|
33
|
+
flags = []
|
34
|
+
flags << "-d" unless args[:attach]
|
35
|
+
flags << "-n '#{args[:window_name]}'" if args[:window_name]
|
36
|
+
flags << "-s '#{args[:name]}'" if args[:name]
|
37
|
+
flags << "-t '#{args[:group_with].name}'" if args[:group_with]
|
38
|
+
flags << args[:command] if args[:command]
|
39
|
+
|
40
|
+
command = "new-session #{flags.join(" ")}"
|
41
|
+
|
42
|
+
ret = invoke_command(command, true)
|
43
|
+
if ret.start_with?("duplicate session:")
|
44
|
+
raise RuntimeError, ret
|
45
|
+
elsif ret.start_with?("sessions should be nested with care.")
|
46
|
+
raise Exception::InTmux("new-session")
|
47
|
+
else
|
48
|
+
if args[:name] and !args[:attach]
|
49
|
+
return Session.new(self, args[:name])
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [String]
|
55
|
+
attr_reader :socket
|
56
|
+
# @return [OptionsList]
|
57
|
+
attr_reader :options
|
58
|
+
# @param [String] socket A socket *name*.
|
59
|
+
def initialize(socket = "default")
|
60
|
+
@socket = socket
|
61
|
+
@options = OptionsList.new(:server, self, false)
|
62
|
+
end
|
63
|
+
|
64
|
+
# @return [-1, 0, 1]
|
65
|
+
def <=>(other)
|
66
|
+
return nil unless other.is_a?(Server)
|
67
|
+
@socket <=> other.socket
|
68
|
+
end
|
69
|
+
|
70
|
+
# @return [Server] Returns self. This is useful for other classes
|
71
|
+
# which can operate on Server, {Session}, {Window}, {Pane} and so
|
72
|
+
# on
|
73
|
+
attr_reader :server
|
74
|
+
undef_method "server"
|
75
|
+
def server
|
76
|
+
self
|
77
|
+
end
|
78
|
+
|
79
|
+
# Invokes a tmux command.
|
80
|
+
#
|
81
|
+
# @param [String] command The command to invoke
|
82
|
+
# @return [void]
|
83
|
+
def invoke_command(command, unset_tmux = false)
|
84
|
+
Tmux.invoke_command("-L #@socket #{command}", unset_tmux)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Kills a server and thus all {Session sessions}, {Window windows} and {Client clients}.
|
88
|
+
#
|
89
|
+
# @tmux kill-server
|
90
|
+
# @return [void]
|
91
|
+
def kill
|
92
|
+
invoke_command "kill-server"
|
93
|
+
end
|
94
|
+
|
95
|
+
# Sources a file, that is load and evaluate it in tmux.
|
96
|
+
#
|
97
|
+
# @param [String] file Name of the file to source
|
98
|
+
# @tmux source-file
|
99
|
+
# @return [void]
|
100
|
+
def source_file(file)
|
101
|
+
invoke_command "source-file #{file}"
|
102
|
+
end
|
103
|
+
alias_method :load, :source_file
|
104
|
+
|
105
|
+
# @tmux list-sessions
|
106
|
+
# @param [Hash] search Filters the resulting hash using {FilterableHash#filter}
|
107
|
+
# @return [Hash] A hash with information for all sessions
|
108
|
+
def sessions_information(search = {})
|
109
|
+
hash = {}
|
110
|
+
output = invoke_command "list-sessions"
|
111
|
+
output.each_line do |session|
|
112
|
+
params = session.match(/^(?<name>\w+?): (?<num_windows>\d+) windows \(created (?<creation_time>.+?)\) \[(?<width>\d+)x(?<height>\d+)\](?: \((?<attached>attached)\))?$/)
|
113
|
+
|
114
|
+
name = params[:name]
|
115
|
+
num_windows = params[:num_windows].to_i
|
116
|
+
creation_time = Date.parse(params[:creation_time])
|
117
|
+
width = params[:width].to_i
|
118
|
+
height = params[:height].to_i
|
119
|
+
attached = !!params[:attached]
|
120
|
+
|
121
|
+
hash[name] = {
|
122
|
+
:name => name,
|
123
|
+
:num_windows => num_windows,
|
124
|
+
:creation_time => creation_time,
|
125
|
+
:width => width,
|
126
|
+
:height => height,
|
127
|
+
:attached => attached,
|
128
|
+
}
|
129
|
+
end
|
130
|
+
hash.extend FilterableHash
|
131
|
+
hash.filter(search)
|
132
|
+
end
|
133
|
+
|
134
|
+
# @tmux list-sessions
|
135
|
+
# @return [Array<Session>] All {Session sessions}
|
136
|
+
attr_reader :sessions
|
137
|
+
undef_method "sessions"
|
138
|
+
def sessions(search = {})
|
139
|
+
sessions_information(search).map do |name, information|
|
140
|
+
Session.new(self, name)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# @return [Session] The first {Session session}. This is
|
145
|
+
# especially useful if working with a server that only has one
|
146
|
+
# {Session session}.
|
147
|
+
attr_reader :session
|
148
|
+
undef_method "session"
|
149
|
+
def session
|
150
|
+
sessions.first
|
151
|
+
end
|
152
|
+
|
153
|
+
# @tmux list-clients
|
154
|
+
# @param [Hash] search Filters the resulting hash using {FilterableHash#filter}
|
155
|
+
# @return [Hash] A hash with information for all clients
|
156
|
+
def clients_information(search = {})
|
157
|
+
clients = invoke_command "list-clients"
|
158
|
+
hash = {}
|
159
|
+
clients.each_line do |client|
|
160
|
+
params = client.match(/^(?<device>.+?): (?<session>\d+) \[(?<width>\d+)x(?<height>\d+) (?<term>.+?)\](?: \((?<utf8>utf8)\))?$/)
|
161
|
+
device = params[:device]
|
162
|
+
session = sessions[params[:session].to_i]
|
163
|
+
width = params[:width].to_i
|
164
|
+
height = params[:height].to_i
|
165
|
+
term = params[:term]
|
166
|
+
utf8 = !!params[:utf8]
|
167
|
+
|
168
|
+
hash[device] = {
|
169
|
+
:device => device,
|
170
|
+
:session => session,
|
171
|
+
:width => width,
|
172
|
+
:height => height,
|
173
|
+
:term => term,
|
174
|
+
:utf8 => utf8,
|
175
|
+
}
|
176
|
+
end
|
177
|
+
hash.extend FilterableHash
|
178
|
+
hash.filter(search)
|
179
|
+
end
|
180
|
+
|
181
|
+
# @tmux list-clients
|
182
|
+
# @return [Array<Client>]
|
183
|
+
attr_reader :clients
|
184
|
+
undef_method "clients"
|
185
|
+
def clients(search = {})
|
186
|
+
clients_information(search).map { |device, information|
|
187
|
+
Client.new(self, device)
|
188
|
+
}
|
189
|
+
end
|
190
|
+
|
191
|
+
# @tmux server-info
|
192
|
+
# @return [String] Information about the server
|
193
|
+
attr_reader :info
|
194
|
+
undef_method "info"
|
195
|
+
def info
|
196
|
+
invoke_command "server-info"
|
197
|
+
end
|
198
|
+
|
199
|
+
# @return [String] Version of the tmux server
|
200
|
+
attr_reader :version
|
201
|
+
undef_method "version"
|
202
|
+
def version
|
203
|
+
@version ||= info.lines.first.split(",").first[/([.\d]+)/]
|
204
|
+
end
|
205
|
+
|
206
|
+
# Checks if a version requirement is being met
|
207
|
+
#
|
208
|
+
# @param [String] required The version at least required
|
209
|
+
# @raise [Exception::UnsupportedVersion] Raised if a version requirement isn't met
|
210
|
+
# @return [void]
|
211
|
+
def check_for_version!(required)
|
212
|
+
if required > version
|
213
|
+
raise Exception::UnsupportedVersion, required
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
data/lib/tmux/session.rb
ADDED
@@ -0,0 +1,312 @@
|
|
1
|
+
module Tmux
|
2
|
+
# A session is a single collection of pseudo terminals under the
|
3
|
+
# management of {Tmux tmux}. Each session has one or more {Window
|
4
|
+
# windows} linked to it. A {Window window} occupies the entire
|
5
|
+
# screen and may be split into rectangular {Pane panes}, each of
|
6
|
+
# which is a separate pseudo terminal (the pty(4) manual page
|
7
|
+
# documents the technical details of pseudo terminals). Any number
|
8
|
+
# of tmux instances may connect to the same session, and any number
|
9
|
+
# of {Window windows} may be present in the same session. Once all
|
10
|
+
# sessions are {Session#kill killed}, tmux exits.
|
11
|
+
class Session
|
12
|
+
include Comparable
|
13
|
+
|
14
|
+
# @return [Options]
|
15
|
+
def self.options(session)
|
16
|
+
OptionsList.new(:session, session, true)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Creates a new {Window window}.
|
20
|
+
#
|
21
|
+
# @option args [Boolean] :after_number (false) If true, the new
|
22
|
+
# {Window window} will be inserted at the next index up from the
|
23
|
+
# specified number (or the {Client#current_window current}
|
24
|
+
# {Window window}), moving {Window windows} up if necessary
|
25
|
+
# @option args [Boolean] :kill_existing (false) Kill an existing
|
26
|
+
# {Window window} if it conflicts with a desired number
|
27
|
+
# @option args [Boolean] :make_active (true) Switch to the newly
|
28
|
+
# generated {Window window}
|
29
|
+
# @option args [String] :name Name of the new {Window window}
|
30
|
+
# (optional)
|
31
|
+
# @option args [Number] :number Number of the new {Window window}
|
32
|
+
# (optional)
|
33
|
+
# @option args [String] :command Command to run in the new {Window
|
34
|
+
# window} (optional)
|
35
|
+
#
|
36
|
+
# @tmux new-window
|
37
|
+
# @return [Window] The newly created {Window window}
|
38
|
+
def create_window(args = {})
|
39
|
+
args = {
|
40
|
+
:kill_existing => false,
|
41
|
+
:make_active => true,
|
42
|
+
:after_number => false,
|
43
|
+
}.merge(args)
|
44
|
+
|
45
|
+
flags = []
|
46
|
+
# flags << "-d" unless args[:make_active]
|
47
|
+
flags << "-a" if args[:after_number]
|
48
|
+
flags << "-k" if args[:kill_existing]
|
49
|
+
flags << "-n '#{args[:name]}'" if args[:name] # FIXME escaping
|
50
|
+
flags << "-t #{args[:number]}" if args[:number]
|
51
|
+
flags << args[:command] if args[:command]
|
52
|
+
|
53
|
+
@server.invoke_command "new-window #{flags.join(" ")}"
|
54
|
+
new_window = current_window
|
55
|
+
unless args[:make_active]
|
56
|
+
select_last_window
|
57
|
+
end
|
58
|
+
# return Window.new(self, num)
|
59
|
+
return new_window
|
60
|
+
end
|
61
|
+
|
62
|
+
# @see Client#current_window
|
63
|
+
# @return (see Client#current_window)
|
64
|
+
attr_reader :current_window
|
65
|
+
undef_method "current_window"
|
66
|
+
def current_window
|
67
|
+
any_client.current_window
|
68
|
+
end
|
69
|
+
|
70
|
+
# @see Client#current_pane
|
71
|
+
# @return (see Client#current_pane)
|
72
|
+
attr_reader :current_pane
|
73
|
+
undef_method "current_pane"
|
74
|
+
def current_pane
|
75
|
+
any_client.current_pane
|
76
|
+
end
|
77
|
+
|
78
|
+
# Returns a {Client client} that is displaying the session.
|
79
|
+
#
|
80
|
+
# @return [Client, nil] A {Client client} that is displaying the session.
|
81
|
+
def any_client
|
82
|
+
@server.clients({:session => self}).first
|
83
|
+
end
|
84
|
+
|
85
|
+
# @return [Boolean]
|
86
|
+
def ==(other)
|
87
|
+
self.class == other.class && @server == other.server && @name == other.name
|
88
|
+
end
|
89
|
+
|
90
|
+
# @return [Number]
|
91
|
+
def hash
|
92
|
+
[@server.hash, @number].hash
|
93
|
+
end
|
94
|
+
|
95
|
+
# @return [Boolean]
|
96
|
+
def eql?(other)
|
97
|
+
self == other
|
98
|
+
end
|
99
|
+
|
100
|
+
def <=>(other)
|
101
|
+
return nil unless other.is_a?(Session)
|
102
|
+
[@server, @name] <=> [other.server, other.name]
|
103
|
+
end
|
104
|
+
|
105
|
+
# @overload name
|
106
|
+
# @return [String]
|
107
|
+
# @overload name=(new_name)
|
108
|
+
# Renames the session.
|
109
|
+
#
|
110
|
+
# @todo escape name
|
111
|
+
# @return [String]
|
112
|
+
# @tmux rename-session
|
113
|
+
# @return [String]
|
114
|
+
attr_accessor :name
|
115
|
+
undef_method "name="
|
116
|
+
# @return [Server]
|
117
|
+
attr_reader :server
|
118
|
+
# @return [OptionsList]
|
119
|
+
attr_reader :options
|
120
|
+
# @return [StatusBar]
|
121
|
+
attr_reader :status_bar
|
122
|
+
def initialize(server, name)
|
123
|
+
@server, @name = server, name
|
124
|
+
@status_bar = StatusBar.new(self)
|
125
|
+
@options = OptionsList.new(:session, self, false)
|
126
|
+
end
|
127
|
+
|
128
|
+
def name=(new_name)
|
129
|
+
raise ArgumentError if new_name.to_s.strip.empty?
|
130
|
+
ret = @server.invoke_command("rename-session -t #{identifier} '#{new_name}'")
|
131
|
+
|
132
|
+
if ret.start_with?("duplicate session:")
|
133
|
+
raise RuntimeError, ret
|
134
|
+
end
|
135
|
+
|
136
|
+
@name = new_name
|
137
|
+
end
|
138
|
+
|
139
|
+
# @return [String]
|
140
|
+
attr_reader :identifier
|
141
|
+
undef_method "identifier"
|
142
|
+
def identifier
|
143
|
+
@name
|
144
|
+
end
|
145
|
+
|
146
|
+
# Locks the session.
|
147
|
+
#
|
148
|
+
# @tmux lock-session
|
149
|
+
# @return [void]
|
150
|
+
# @tmuxver >=1.1
|
151
|
+
def lock
|
152
|
+
@server.check_for_version!("1.1")
|
153
|
+
|
154
|
+
@server.invoke_command "lock-session -t #{identifier}"
|
155
|
+
end
|
156
|
+
|
157
|
+
# @return [Integer]
|
158
|
+
attr_reader :num_windows
|
159
|
+
undef_method "num_windows"
|
160
|
+
def num_windows
|
161
|
+
@server.sessions_information[@name][:num_windows]
|
162
|
+
end
|
163
|
+
|
164
|
+
# @return [Time]
|
165
|
+
attr_reader :creation_time
|
166
|
+
undef_method "creation_time"
|
167
|
+
def creation_time
|
168
|
+
@server.sessions_information[@name][:creation_time]
|
169
|
+
end
|
170
|
+
alias_method :created_at, :creation_time
|
171
|
+
|
172
|
+
# @return [Integer]
|
173
|
+
attr_reader :width
|
174
|
+
undef_method "width"
|
175
|
+
def width
|
176
|
+
@server.sessions_information[@name][:width]
|
177
|
+
end
|
178
|
+
|
179
|
+
# @return [Integer]
|
180
|
+
attr_reader :height
|
181
|
+
undef_method "height"
|
182
|
+
def height
|
183
|
+
@server.sessions_information[@name][:height]
|
184
|
+
end
|
185
|
+
|
186
|
+
# @return [Boolean]
|
187
|
+
attr_reader :attached
|
188
|
+
undef_method "attached"
|
189
|
+
def attached
|
190
|
+
@server.sessions_information[@name][:attached]
|
191
|
+
end
|
192
|
+
alias_method :attached?, :attached
|
193
|
+
|
194
|
+
# @return [Array<Client>] All {Client clients}
|
195
|
+
attr_reader :clients
|
196
|
+
undef_method "clients"
|
197
|
+
def clients
|
198
|
+
@server.clients({:session => self})
|
199
|
+
end
|
200
|
+
|
201
|
+
# Attach to a session. Replaces the ruby process.
|
202
|
+
#
|
203
|
+
# @return [void]
|
204
|
+
# @tmux attach
|
205
|
+
def attach
|
206
|
+
exec "#{Tmux::BINARY} attach -t #{identifier}"
|
207
|
+
end
|
208
|
+
|
209
|
+
# Kills the session.
|
210
|
+
#
|
211
|
+
# @tmux kill-session
|
212
|
+
# @return [void]
|
213
|
+
def kill
|
214
|
+
@server.invoke_command "kill-session -t #{identifier}"
|
215
|
+
end
|
216
|
+
|
217
|
+
# @tmux list-windows
|
218
|
+
# @tmuxver >=1.1
|
219
|
+
# @param [Hash] search Filters the resulting hash using {FilterableHash#filter}
|
220
|
+
# @return [Hash] A hash with information for all windows
|
221
|
+
# @return [Hash]
|
222
|
+
def windows_information(search = {})
|
223
|
+
@server.check_for_version!("1.1")
|
224
|
+
|
225
|
+
hash = {}
|
226
|
+
output = @server.invoke_command "list-windows -t #{identifier}"
|
227
|
+
output.each_line do |session|
|
228
|
+
params = session.match(/^(?<num>\d+): (?<name>.+?) \[(?<width>\d+)x(?<height>\d+)\]$/)
|
229
|
+
next if params.nil? # >=1.3 displays layout information in indented lines
|
230
|
+
num = params[:num].to_i
|
231
|
+
name = params[:name]
|
232
|
+
width = params[:width].to_i
|
233
|
+
height = params[:height].to_i
|
234
|
+
|
235
|
+
hash[num] = {:num => num, :name => name, :width => width, :height => height}
|
236
|
+
end
|
237
|
+
hash.extend FilterableHash
|
238
|
+
hash.filter(search)
|
239
|
+
end
|
240
|
+
|
241
|
+
# @tmux list-windows
|
242
|
+
# @return [Hash{Number => Window}] All {Window windows}
|
243
|
+
# @tmuxver >=1.1
|
244
|
+
attr_reader :windows
|
245
|
+
undef_method "windows"
|
246
|
+
def windows
|
247
|
+
hash = {}
|
248
|
+
@server.check_for_version!("1.1")
|
249
|
+
|
250
|
+
windows_information.each do |num, information|
|
251
|
+
hash[num] = Window.new(self, num)
|
252
|
+
end
|
253
|
+
hash
|
254
|
+
end
|
255
|
+
|
256
|
+
# @param [Hash] search Filters the resulting hash using {FilterableHash#filter}
|
257
|
+
# @return [Hash] A hash with information for all buffers
|
258
|
+
# @tmux list-buffers
|
259
|
+
def buffers_information(search = {})
|
260
|
+
hash = {}
|
261
|
+
buffers = @server.invoke_command "list-buffers -t #{identifier}"
|
262
|
+
buffers.each_line do |buffer|
|
263
|
+
num, size = buffer.match(/^(\d+): (\d+) bytes/)[1..2]
|
264
|
+
hash[num] = {:size => size}
|
265
|
+
end
|
266
|
+
hash.extend FilterableHash
|
267
|
+
hash.filter(search)
|
268
|
+
end
|
269
|
+
|
270
|
+
# @tmux list-buffers
|
271
|
+
# @return [Array<Buffer>] All {Buffer buffers}
|
272
|
+
attr_reader :buffers
|
273
|
+
undef_method "buffers"
|
274
|
+
def buffers
|
275
|
+
buffers_information.map do |num, information|
|
276
|
+
Buffer.new(num, self)
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
# @group Selecting
|
281
|
+
|
282
|
+
# Select the last (previously selected) window.
|
283
|
+
#
|
284
|
+
# @return [Window]
|
285
|
+
def select_last_window
|
286
|
+
@server.invoke_command "last-window -t #{identifier}"
|
287
|
+
current_window
|
288
|
+
end
|
289
|
+
|
290
|
+
# Selects the next (higher index) window
|
291
|
+
#
|
292
|
+
# @param [Number] num How many windows to move
|
293
|
+
# @tmuxver >=1.3
|
294
|
+
# @return [Window]
|
295
|
+
def select_next_window(num = 1)
|
296
|
+
@server.invoke_command "select-window -t #{identifier}:+#{num}"
|
297
|
+
current_window
|
298
|
+
end
|
299
|
+
|
300
|
+
# Selects the previous (lower index) window
|
301
|
+
#
|
302
|
+
# @param [Number] num How many windows to move
|
303
|
+
# @tmuxver >=1.3
|
304
|
+
# @return [Window]
|
305
|
+
def select_previous_window(num = 1)
|
306
|
+
@server.invoke_command "select-window -t:-#{num}"
|
307
|
+
current_window
|
308
|
+
end
|
309
|
+
|
310
|
+
# @endgroup
|
311
|
+
end
|
312
|
+
end
|