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/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--tag "tmux:tmux command" --tag "tmuxver:Required tmux version" --hide-void-return -m markdown --private --protected --default-return Undefined
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2010 Dominik Honnef <dominikh@fork-bomb.org>
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# Widgets
|
2
|
+
|
3
|
+
- Progress bar ({Tmux::Widgets::ProgressBar ProgressBar})
|
4
|
+
|
5
|
+
# Semantic Versioning
|
6
|
+
|
7
|
+
tmux-ruby uses [Semantic Versioning](http://semver.org/)
|
8
|
+
|
9
|
+
|
10
|
+
# Documentation
|
11
|
+
|
12
|
+
tmux-ruby uses [YARD](http://github.com/lsegal/yard) for documenting
|
13
|
+
its codebase.
|
14
|
+
|
15
|
+
|
16
|
+
# Contributing
|
17
|
+
|
18
|
+
* Fork the project.
|
19
|
+
* Make your feature addition or bug fix.
|
20
|
+
* Commit, do not mess with rakefile, version, or history. (if you want
|
21
|
+
to have your own version, that is fine but bump version in a commit
|
22
|
+
by itself I can ignore when I pull)
|
23
|
+
* Send me a pull request. Bonus points for topic branches.
|
data/lib/tmux.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require "date"
|
2
|
+
require "tmux/filterable_hash"
|
3
|
+
require "tmux/exception"
|
4
|
+
require "tmux/server"
|
5
|
+
require "tmux/session"
|
6
|
+
require "tmux/client"
|
7
|
+
require "tmux/window"
|
8
|
+
require "tmux/pane"
|
9
|
+
require "tmux/buffer"
|
10
|
+
require "tmux/status_bar"
|
11
|
+
require "tmux/options_list"
|
12
|
+
require "tmux/options"
|
13
|
+
require "tmux/widget"
|
14
|
+
require "tmux/version"
|
15
|
+
|
16
|
+
# @todo Support querying and modifying keymaps
|
17
|
+
module Tmux
|
18
|
+
# The newest version of tmux we officially support
|
19
|
+
TMUX_VERSION = "1.3".freeze
|
20
|
+
|
21
|
+
@binary = `which tmux`.chomp
|
22
|
+
@verbose = false
|
23
|
+
|
24
|
+
class << self
|
25
|
+
# Path of the tmux binary.
|
26
|
+
# @return [String]
|
27
|
+
attr_accessor :binary
|
28
|
+
|
29
|
+
# Print verbose information on $stderr?
|
30
|
+
# @return [Boolean]
|
31
|
+
attr_accessor :verbose
|
32
|
+
alias_method :verbose?, :verbose
|
33
|
+
|
34
|
+
# Invokes a tmux command and returns all output.
|
35
|
+
#
|
36
|
+
# @param [String] command Command to invoke
|
37
|
+
# @param [Boolean] unset_tmux If true, unsets $TMUX before calling
|
38
|
+
# tmux, to allow nesting
|
39
|
+
# @return [String] all output
|
40
|
+
# @raise [Exception::UnknownCommand]
|
41
|
+
# @api private
|
42
|
+
def invoke_command(cmd, unset_tmux = false)
|
43
|
+
command = ""
|
44
|
+
command << "TMUX='' " if unset_tmux
|
45
|
+
command << "#{@binary} #{cmd}"
|
46
|
+
|
47
|
+
$stderr.puts(command) if verbose?
|
48
|
+
ret = `#{command} 2>&1`
|
49
|
+
if ret.start_with?("unknown command:")
|
50
|
+
raise Exception::UnknownCommand, ret.split(":", 2).last.strip
|
51
|
+
else
|
52
|
+
return ret
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/tmux/buffer.rb
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
require "filesize"
|
2
|
+
require "tempfile"
|
3
|
+
|
4
|
+
module Tmux
|
5
|
+
class Buffer
|
6
|
+
# @return [Number]
|
7
|
+
attr_reader :number
|
8
|
+
# @return [Session]
|
9
|
+
attr_reader :session
|
10
|
+
# @return [Filesize]
|
11
|
+
def initialize(number, session)
|
12
|
+
@number, @session, @size = number, session
|
13
|
+
unless server.version >= "1.3"
|
14
|
+
# we do not need a temporary file for tmux versions that can
|
15
|
+
# directly load/save from/to stdin/stdout
|
16
|
+
@file = Tempfile.new("buffer")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# @param [Boolean] force_reload Ignore frozen state if true
|
21
|
+
# @return [Filesize]
|
22
|
+
attr_reader :size
|
23
|
+
undef_method "size"
|
24
|
+
def size(force_reload = false)
|
25
|
+
if @size && !force_reload
|
26
|
+
@size
|
27
|
+
else
|
28
|
+
Filesize.new(@session.buffers_information[number][:size].to_i)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# @param [Boolean] force_reload Ignore frozen state if true
|
33
|
+
# @return [String]
|
34
|
+
attr_accessor :data
|
35
|
+
undef_method "data"
|
36
|
+
undef_method "data="
|
37
|
+
def data(force_reload = false)
|
38
|
+
# note: we cannot use show-buffer because that would escape tabstops
|
39
|
+
if @data && !force_reload
|
40
|
+
@data
|
41
|
+
else
|
42
|
+
if server.version >= "1.3"
|
43
|
+
return server.invoke_command "save-buffer -b #@number -t #{@session.identifier} -"
|
44
|
+
else
|
45
|
+
server.invoke_command "save-buffer -b #@number -t #{@session.identifier} #{@file.path}"
|
46
|
+
return @file.read
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def data=(new_data)
|
52
|
+
# FIXME maybe some more escaping?
|
53
|
+
server.invoke_command "set-buffer -b #@number -t #{@session.identifier} \"#{new_data}\""
|
54
|
+
@data = data(true) if @frozen
|
55
|
+
@size = size(true)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Saves the contents of a buffer.
|
59
|
+
#
|
60
|
+
# @param [String] file The file to write to
|
61
|
+
# @param [Boolean] append Append to instead of overwriting the file
|
62
|
+
# @tmux save-buffer
|
63
|
+
# @return [void]
|
64
|
+
def save(file, append = false)
|
65
|
+
flag = append ? "-a" : ""
|
66
|
+
server.invoke_command "save-buffer #{flag} -b #@number -t #{@session.identifier} #{file}"
|
67
|
+
end
|
68
|
+
alias_method :write, :save
|
69
|
+
|
70
|
+
# By default, Buffer will not cache its data but instead query it each time.
|
71
|
+
# By calling this method, the data will be cached and not updated anymore.
|
72
|
+
#
|
73
|
+
# @return [void]
|
74
|
+
def freeze!
|
75
|
+
@frozen = true
|
76
|
+
@data = data
|
77
|
+
@size = size
|
78
|
+
end
|
79
|
+
|
80
|
+
# @return [Server]
|
81
|
+
attr_reader :server
|
82
|
+
undef_method "server"
|
83
|
+
def server
|
84
|
+
@session.server
|
85
|
+
end
|
86
|
+
|
87
|
+
# Deletes a buffer.
|
88
|
+
#
|
89
|
+
# @tmux delete-buffer
|
90
|
+
# @return [void]
|
91
|
+
def delete
|
92
|
+
freeze! # so we can still access its old value
|
93
|
+
server.invoke_command "delete-buffer -b #@number -t #{@session.identifier}"
|
94
|
+
end
|
95
|
+
|
96
|
+
# @return [String] The content of a buffer
|
97
|
+
def to_s
|
98
|
+
text
|
99
|
+
end
|
100
|
+
|
101
|
+
# Pastes the content of a buffer into a {Window window} or {Pane pane}.
|
102
|
+
#
|
103
|
+
# @param [Window] target The {Pane pane} or {Window window} to
|
104
|
+
# paste the buffer into. Note: {Pane Panes} as as target are only
|
105
|
+
# supported since tmux version 1.3.
|
106
|
+
# @param [Boolean] pop If true, delete the buffer from the stack
|
107
|
+
# @param [Boolean] translate If true, any linefeed (LF) characters
|
108
|
+
# in the paste buffer are replaced with carriage returns (CR)
|
109
|
+
# @param [String] separator Replace any linefeed (LF) in the
|
110
|
+
# buffer with this separator. +translate+ must be false.
|
111
|
+
#
|
112
|
+
# @tmux paste-buffer
|
113
|
+
# @tmuxver >=1.3 for pasting to {Pane panes}
|
114
|
+
# @return [void]
|
115
|
+
# @see Window#paste
|
116
|
+
# @see Pane#paste
|
117
|
+
def paste(target = nil, pop = false, translate = true, separator = nil)
|
118
|
+
if server.version < "1.3"
|
119
|
+
if separator || target.is_a?(Pane)
|
120
|
+
raise Exception::UnsupportedVersion, "1.3"
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
flag_pop = pop ? "-d" : ""
|
125
|
+
flag_translate = translate ? "" : "-r"
|
126
|
+
flag_separator = separator ? "" : "-s \"#{separator}\"" # FIXME escape
|
127
|
+
window_param = target ? "-t #{target.identifier}" : ""
|
128
|
+
server.invoke_command "paste-buffer #{flag_pop} #{flag_translate} #{flag_separator} #{window_param}"
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
data/lib/tmux/client.rb
ADDED
@@ -0,0 +1,193 @@
|
|
1
|
+
module Tmux
|
2
|
+
class Client
|
3
|
+
# @return [Server]
|
4
|
+
attr_reader :server
|
5
|
+
# @return [String]
|
6
|
+
attr_reader :device
|
7
|
+
def initialize(server, device)
|
8
|
+
@server, @device = server, device
|
9
|
+
end
|
10
|
+
|
11
|
+
# @return [String]
|
12
|
+
attr_reader :identifier
|
13
|
+
undef_method "identifier"
|
14
|
+
def identifier
|
15
|
+
@device
|
16
|
+
end
|
17
|
+
|
18
|
+
# Setting this will make a client switch to another {Session session}.
|
19
|
+
#
|
20
|
+
# @tmux switch-client
|
21
|
+
# @return [Session]
|
22
|
+
attr_accessor :session
|
23
|
+
undef_method "session"
|
24
|
+
undef_method "session="
|
25
|
+
def session
|
26
|
+
@server.clients_information[@device][:session]
|
27
|
+
end
|
28
|
+
|
29
|
+
def session=(new_session)
|
30
|
+
@server.invoke_command "switch-client -c #@device -t #{new_session.number}"
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [Integer]
|
34
|
+
attr_reader :width
|
35
|
+
undef_method "width"
|
36
|
+
def width
|
37
|
+
@server.clients_information[@device][:width]
|
38
|
+
end
|
39
|
+
|
40
|
+
# @return [Integer]
|
41
|
+
attr_reader :height
|
42
|
+
undef_method "height"
|
43
|
+
def height
|
44
|
+
@server.clients_information[@device][:height]
|
45
|
+
end
|
46
|
+
|
47
|
+
# $TERM of a client.
|
48
|
+
#
|
49
|
+
# @return [String]
|
50
|
+
attr_reader :term
|
51
|
+
undef_method "term"
|
52
|
+
def term
|
53
|
+
@server.clients_information[@device][:term]
|
54
|
+
end
|
55
|
+
|
56
|
+
# True if the terminal is using UTF-8.
|
57
|
+
#
|
58
|
+
# @return [Boolean]
|
59
|
+
attr_reader :utf8
|
60
|
+
undef_method "utf8"
|
61
|
+
def utf8
|
62
|
+
@server.clients_information[@device][:utf8]
|
63
|
+
end
|
64
|
+
alias_method :utf8?, :utf8
|
65
|
+
|
66
|
+
# Detaches a client from tmux.
|
67
|
+
#
|
68
|
+
# @tmux detach-client
|
69
|
+
# @return [void]
|
70
|
+
def detach
|
71
|
+
@server.invoke_command "detach-client -t #@device"
|
72
|
+
end
|
73
|
+
|
74
|
+
# Locks a client.
|
75
|
+
#
|
76
|
+
# @tmux lock-client
|
77
|
+
# @return [void]
|
78
|
+
# @tmuxver >=1.1
|
79
|
+
def lock
|
80
|
+
@server.check_for_version!("1.1")
|
81
|
+
|
82
|
+
@server.invoke_command "lock-client -t #@device"
|
83
|
+
end
|
84
|
+
|
85
|
+
# Suspends a client.
|
86
|
+
#
|
87
|
+
# @tmux suspend-client
|
88
|
+
# @return [void]
|
89
|
+
def suspend
|
90
|
+
@server.invoke_command "suspend-client -c #@device"
|
91
|
+
end
|
92
|
+
|
93
|
+
# Refreshs a client.
|
94
|
+
#
|
95
|
+
# @tmux refresh-client
|
96
|
+
# @return [void]
|
97
|
+
def refresh
|
98
|
+
@server.invoke_command "refresh-client -t #@device"
|
99
|
+
end
|
100
|
+
|
101
|
+
# @tmux show-messages
|
102
|
+
# @return [Array<String>] A log of messages
|
103
|
+
# @tmuxver >=1.2
|
104
|
+
attr_reader :messages
|
105
|
+
undef_method "messages"
|
106
|
+
def messages
|
107
|
+
@server.check_for_version!("1.2")
|
108
|
+
|
109
|
+
@server.invoke_command("show-messages -t #@device").split("\n")
|
110
|
+
end
|
111
|
+
|
112
|
+
# Displays a visible indicator of each {Pane pane} shown by a client.
|
113
|
+
#
|
114
|
+
# @tmux display-panes
|
115
|
+
# @return [void]
|
116
|
+
# @tmuxver >=1.0
|
117
|
+
def display_panes
|
118
|
+
@server.check_for_version!("1.0")
|
119
|
+
|
120
|
+
@server.invoke_command("display-panes -t #@device")
|
121
|
+
end
|
122
|
+
|
123
|
+
# @return [Window] The currently displayed {Window window}.
|
124
|
+
# @tmuxver >=1.2
|
125
|
+
attr_reader :current_window
|
126
|
+
undef_method "current_window"
|
127
|
+
def current_window
|
128
|
+
@server.check_for_version!("1.2")
|
129
|
+
|
130
|
+
num = @server.invoke_command("display -p -t #@device '#I'").chomp
|
131
|
+
session.windows[num.to_i]
|
132
|
+
end
|
133
|
+
|
134
|
+
# @return [Pane] The currently displayed {Pane pane}.
|
135
|
+
# @tmuxver >=1.2
|
136
|
+
attr_reader :current_pane
|
137
|
+
undef_method "current_pane"
|
138
|
+
def current_pane
|
139
|
+
@server.check_for_version!("1.2")
|
140
|
+
|
141
|
+
output = @server.invoke_command "display-message -p -t #@device"
|
142
|
+
current_pane = output.match(/^.+?, current pane (\d+) . .+$/)[1]
|
143
|
+
current_window.panes[current_pane.to_i]
|
144
|
+
end
|
145
|
+
|
146
|
+
# Displays a message.
|
147
|
+
#
|
148
|
+
# @param [String] text The message to display
|
149
|
+
# @tmux display-message
|
150
|
+
# @return [void]
|
151
|
+
# @tmuxver >=1.0
|
152
|
+
def message(text)
|
153
|
+
@server.check_for_version!("1.0")
|
154
|
+
|
155
|
+
@server.invoke_command "display-message -t #@device \"#{text}\""
|
156
|
+
end
|
157
|
+
|
158
|
+
# Opens a prompt inside a client allowing a {Window window} index to be entered interactively.
|
159
|
+
#
|
160
|
+
# @tmux command-prompt + select-window
|
161
|
+
# @return [void]
|
162
|
+
def select_interactively
|
163
|
+
command_prompt "select-window -t:%%", ["index"]
|
164
|
+
end
|
165
|
+
|
166
|
+
# Opens a command prompt in the client. This may be used to
|
167
|
+
# execute commands interactively.
|
168
|
+
#
|
169
|
+
# @param [String] template The template is used as the command to
|
170
|
+
# execute. Before the command is executed, the first occurrence
|
171
|
+
# of the string '%%' and all occurrences of '%1' are replaced by
|
172
|
+
# the response to the first prompt, the second '%%' and all '%2'
|
173
|
+
# are replaced with the response to the second prompt, and so on
|
174
|
+
# for further prompts. Up to nine prompt responses may be
|
175
|
+
# replaced ('%1' to '%9')
|
176
|
+
#
|
177
|
+
# @param [Array<String>] prompts prompts is a list
|
178
|
+
# of prompts which are displayed in order; otherwise a single
|
179
|
+
# prompt is displayed, constructed from template
|
180
|
+
#
|
181
|
+
# @return [void]
|
182
|
+
# @tmux command-prompt
|
183
|
+
# @todo escape prompts and template
|
184
|
+
def command_prompt(template, prompts = [])
|
185
|
+
prompts = prompts.join(",")
|
186
|
+
flags = []
|
187
|
+
flags << "-p #{prompts}" unless prompts.empty?
|
188
|
+
flags << "-t #{identifier}"
|
189
|
+
flags << "\"#{template}\""
|
190
|
+
@server.invoke_command "command-prompt #{flags.join(" ")}"
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|