Class: Tmuxinator::Project
Constant Summary
collapse
- RBENVRVM_DEP_MSG =
<<-M
DEPRECATION: rbenv/rvm-specific options have been replaced by the
`pre_tab` option and will not be supported in 0.8.0.
M
- TABS_DEP_MSG =
<<-M
DEPRECATION: The tabs option has been replaced by the `windows` option
and will not be supported in 0.8.0.
M
- CLIARGS_DEP_MSG =
<<-M
DEPRECATION: The `cli_args` option has been replaced by the `tmux_options`
option and will not be supported in 0.8.0.
M
- SYNC_DEP_MSG =
<<-M
DEPRECATION: The `synchronize` option's current default behaviour is to
enable pane synchronization before running commands. In a future release,
the default synchronization option will be `after`, i.e. synchronization of
panes will occur after the commands described in each of the panes
have run. At that time, the current behavior will need to be explicitly
enabled, using the `synchronize: before` option. To use this behaviour
now, use the 'synchronize: after' option.
M
- PRE_DEP_MSG =
<<-M
DEPRECATION: The `pre` option has been replaced by project hooks (`on_project_start` and
`on_project_restart`) and will be removed in a future release.
M
- POST_DEP_MSG =
<<-M
DEPRECATION: The `post` option has been replaced by project hooks (`on_project_stop` and
`on_project_exit`) and will be removed in a future release.
M
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
hook_on_project_exit, hook_on_project_first_start, hook_on_project_restart, hook_on_project_start, hook_on_project_stop
#pre_tab?
Methods included from Util
#exit!, #yes_no
Constructor Details
#initialize(yaml, options = {}) ⇒ Project
Returns a new instance of Project.
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
# File 'lib/tmuxinator/project.rb', line 80
def initialize(yaml, options = {})
options[:force_attach] = false if options[:force_attach].nil?
options[:force_detach] = false if options[:force_detach].nil?
@yaml = yaml
@custom_name = options[:custom_name]
@force_attach = options[:force_attach]
@force_detach = options[:force_detach]
raise "Cannot force_attach and force_detach at the same time" \
if @force_attach && @force_detach
extend Tmuxinator::WemuxSupport if wemux?
end
|
Instance Attribute Details
#custom_name ⇒ Object
Returns the value of attribute custom_name.
42
43
44
|
# File 'lib/tmuxinator/project.rb', line 42
def custom_name
@custom_name
end
|
#force_attach ⇒ Object
Returns the value of attribute force_attach.
40
41
42
|
# File 'lib/tmuxinator/project.rb', line 40
def force_attach
@force_attach
end
|
#force_detach ⇒ Object
Returns the value of attribute force_detach.
41
42
43
|
# File 'lib/tmuxinator/project.rb', line 41
def force_detach
@force_detach
end
|
#yaml ⇒ Object
Returns the value of attribute yaml.
39
40
41
|
# File 'lib/tmuxinator/project.rb', line 39
def yaml
@yaml
end
|
Class Method Details
.load(path, options = {}) ⇒ Object
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
# File 'lib/tmuxinator/project.rb', line 44
def self.load(path, options = {})
yaml = begin
args = options[:args] || []
@settings = parse_settings(args)
@args = args
content = render_template(path, binding)
YAML.safe_load(content, aliases: true)
rescue SyntaxError, StandardError => error
raise "Failed to parse config file: #{error.message}"
end
new(yaml, options)
end
|
.parse_settings(args) ⇒ Object
59
60
61
62
63
64
65
66
67
68
69
|
# File 'lib/tmuxinator/project.rb', line 59
def self.parse_settings(args)
settings = args.select { |x| x.match(/.*=.*/) }
args.reject! { |x| x.match(/.*=.*/) }
settings.map! do |setting|
parts = setting.split("=")
[parts[0], parts[1]]
end
Hash[settings]
end
|
.render_template(template, bndg) ⇒ Object
105
106
107
108
|
# File 'lib/tmuxinator/project.rb', line 105
def self.render_template(template, bndg)
content = File.read(template)
bndg.eval(Erubi::Engine.new(content).src)
end
|
Instance Method Details
#attach? ⇒ Boolean
133
134
135
136
137
138
139
140
141
|
# File 'lib/tmuxinator/project.rb', line 133
def attach?
yaml_attach = if yaml["attach"].nil?
true
else
yaml["attach"]
end
attach = force_attach || !force_detach && yaml_attach
attach
end
|
#base_index ⇒ Object
211
212
213
|
# File 'lib/tmuxinator/project.rb', line 211
def base_index
get_base_index.to_i
end
|
#cli_args? ⇒ Boolean
305
306
307
|
# File 'lib/tmuxinator/project.rb', line 305
def cli_args?
yaml["cli_args"]
end
|
#deprecation_checks ⇒ Object
267
268
269
270
271
272
273
274
275
276
|
# File 'lib/tmuxinator/project.rb', line 267
def deprecation_checks
[
rvm_or_rbenv?,
tabs?,
cli_args?,
legacy_synchronize?,
pre?,
post?
]
end
|
#deprecation_messages ⇒ Object
#deprecations ⇒ Object
259
260
261
262
263
264
265
|
# File 'lib/tmuxinator/project.rb', line 259
def deprecations
deprecation_checks.zip(deprecation_messages).
inject([]) do |deps, (chk, msg)|
deps << msg if chk
deps
end
end
|
#enable_pane_titles? ⇒ Boolean
340
341
342
|
# File 'lib/tmuxinator/project.rb', line 340
def enable_pane_titles?
yaml["enable_pane_titles"]
end
|
#get_base_index ⇒ Object
321
322
323
|
# File 'lib/tmuxinator/project.rb', line 321
def get_base_index
tmux_config["base-index"]
end
|
#get_pane_base_index ⇒ Object
317
318
319
|
# File 'lib/tmuxinator/project.rb', line 317
def get_pane_base_index
tmux_config["pane-base-index"]
end
|
#name ⇒ Object
123
124
125
126
|
# File 'lib/tmuxinator/project.rb', line 123
def name
name = custom_name || yaml["project_name"] || yaml["name"]
blank?(name) ? nil : name.to_s.shellescape
end
|
#name? ⇒ Boolean
239
240
241
|
# File 'lib/tmuxinator/project.rb', line 239
def name?
!name.nil?
end
|
#pane_base_index ⇒ Object
215
216
217
|
# File 'lib/tmuxinator/project.rb', line 215
def pane_base_index
get_pane_base_index.to_i
end
|
#pane_title_position_not_valid_warning ⇒ Object
362
363
364
365
366
367
368
|
# File 'lib/tmuxinator/project.rb', line 362
def pane_title_position_not_valid_warning
print_warning(
"The specified pane title position " +
"\"#{yaml['pane_title_position']}\" is not valid. " +
"Please choose one of: top, bottom, or off."
)
end
|
#pane_titles_not_supported_warning ⇒ Object
370
371
372
373
374
375
376
|
# File 'lib/tmuxinator/project.rb', line 370
def pane_titles_not_supported_warning
print_warning(
"You have enabled pane titles in your configuration, " +
"but the feature is not supported by your version of tmux.\n" +
"Please consider upgrading to a version that supports it (tmux >=2.6)."
)
end
|
#post ⇒ Object
156
157
158
159
|
# File 'lib/tmuxinator/project.rb', line 156
def post
post_config = yaml["post"]
parsed_parameters(post_config)
end
|
#post? ⇒ Boolean
313
314
315
|
# File 'lib/tmuxinator/project.rb', line 313
def post?
yaml["post"]
end
|
#pre ⇒ Object
128
129
130
131
|
# File 'lib/tmuxinator/project.rb', line 128
def pre
pre_config = yaml["pre"]
parsed_parameters(pre_config)
end
|
#pre? ⇒ Boolean
309
310
311
|
# File 'lib/tmuxinator/project.rb', line 309
def pre?
yaml["pre"]
end
|
#pre_window ⇒ Object
143
144
145
146
147
148
149
150
151
152
153
154
|
# File 'lib/tmuxinator/project.rb', line 143
def pre_window
params = if rbenv?
"rbenv shell #{yaml['rbenv']}"
elsif rvm?
"rvm use #{yaml['rvm']}"
elsif pre_tab?
yaml["pre_tab"]
else
yaml["pre_window"]
end
parsed_parameters(params)
end
|
#rbenv? ⇒ Boolean
289
290
291
|
# File 'lib/tmuxinator/project.rb', line 289
def rbenv?
yaml["rbenv"]
end
|
#render ⇒ Object
97
98
99
|
# File 'lib/tmuxinator/project.rb', line 97
def render
self.class.render_template(Tmuxinator::Config.template, binding)
end
|
#root ⇒ Object
118
119
120
121
|
# File 'lib/tmuxinator/project.rb', line 118
def root
root = yaml["project_root"] || yaml["root"]
blank?(root) ? nil : File.expand_path(root).shellescape
end
|
#root? ⇒ Boolean
235
236
237
|
# File 'lib/tmuxinator/project.rb', line 235
def root?
!root.nil?
end
|
#rvm? ⇒ Boolean
293
294
295
|
# File 'lib/tmuxinator/project.rb', line 293
def rvm?
yaml["rvm"]
end
|
#rvm_or_rbenv? ⇒ Boolean
297
298
299
|
# File 'lib/tmuxinator/project.rb', line 297
def rvm_or_rbenv?
rvm? || rbenv?
end
|
#send_keys(cmd, window_index) ⇒ Object
251
252
253
254
255
256
257
|
# File 'lib/tmuxinator/project.rb', line 251
def send_keys(cmd, window_index)
if cmd.empty?
""
else
"#{tmux} send-keys -t #{window(window_index)} #{cmd.shellescape} C-m"
end
end
|
#send_pane_command(cmd, window_index, _pane_index) ⇒ Object
247
248
249
|
# File 'lib/tmuxinator/project.rb', line 247
def send_pane_command(cmd, window_index, _pane_index)
send_keys(cmd, window_index)
end
|
#show_tmux_options ⇒ Object
325
326
327
328
329
|
# File 'lib/tmuxinator/project.rb', line 325
def show_tmux_options
"#{tmux} start-server\\; " \
"show-option -g base-index\\; " \
"show-window-option -g pane-base-index\\;"
end
|
#socket ⇒ Object
185
186
187
188
189
190
191
|
# File 'lib/tmuxinator/project.rb', line 185
def socket
if socket_path
" -S #{socket_path}"
elsif socket_name
" -L #{socket_name}"
end
end
|
#socket_name ⇒ Object
193
194
195
|
# File 'lib/tmuxinator/project.rb', line 193
def socket_name
yaml["socket_name"]
end
|
#socket_path ⇒ Object
197
198
199
|
# File 'lib/tmuxinator/project.rb', line 197
def socket_path
yaml["socket_path"]
end
|
#startup_pane ⇒ Object
223
224
225
|
# File 'lib/tmuxinator/project.rb', line 223
def startup_pane
"#{startup_window}.#{yaml['startup_pane'] || pane_base_index}"
end
|
#startup_window ⇒ Object
219
220
221
|
# File 'lib/tmuxinator/project.rb', line 219
def startup_window
"#{name}:#{yaml['startup_window'] || base_index}"
end
|
#tabs? ⇒ Boolean
301
302
303
|
# File 'lib/tmuxinator/project.rb', line 301
def tabs?
yaml["tabs"]
end
|
#tmux ⇒ Object
161
162
163
|
# File 'lib/tmuxinator/project.rb', line 161
def tmux
"#{tmux_command}#{tmux_options}#{socket}"
end
|
#tmux_command ⇒ Object
165
166
167
|
# File 'lib/tmuxinator/project.rb', line 165
def tmux_command
yaml["tmux_command"] || "tmux"
end
|
#tmux_has_session?(name) ⇒ Boolean
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
# File 'lib/tmuxinator/project.rb', line 169
def tmux_has_session?(name)
sessions = `#{tmux} ls 2> /dev/null`
unescaped_name = name.shellsplit.join("")
!(sessions !~ /^#{unescaped_name}:/)
end
|
#tmux_kill_session_command ⇒ Object
336
337
338
|
# File 'lib/tmuxinator/project.rb', line 336
def tmux_kill_session_command
"#{tmux} kill-session -t #{name}"
end
|
#tmux_new_session_command ⇒ Object
331
332
333
334
|
# File 'lib/tmuxinator/project.rb', line 331
def tmux_new_session_command
window = windows.first.tmux_window_name_option
"#{tmux} new-session -d -s #{name} #{window}"
end
|
#tmux_options ⇒ Object
201
202
203
204
205
206
207
208
209
|
# File 'lib/tmuxinator/project.rb', line 201
def tmux_options
if cli_args?
" #{yaml['cli_args'].to_s.strip}"
elsif tmux_options?
" #{yaml['tmux_options'].to_s.strip}"
else
""
end
end
|
#tmux_options? ⇒ Boolean
227
228
229
|
# File 'lib/tmuxinator/project.rb', line 227
def tmux_options?
yaml["tmux_options"]
end
|
353
354
355
356
357
358
359
360
|
# File 'lib/tmuxinator/project.rb', line 353
def tmux_set_pane_title_format(tmux_window_target)
command = set_window_option(tmux_window_target)
if pane_title_format?
"#{command} pane-border-format \"#{yaml['pane_title_format']}\""
else
"#{command} pane-border-format \"\#{pane_index}: \#{pane_title}\""
end
end
|
#tmux_set_pane_title_position(tmux_window_target) ⇒ Object
344
345
346
347
348
349
350
351
|
# File 'lib/tmuxinator/project.rb', line 344
def tmux_set_pane_title_position(tmux_window_target)
command = set_window_option(tmux_window_target)
if pane_title_position? && pane_title_position_valid?
"#{command} pane-border-status #{yaml['pane_title_position']}"
else
"#{command} pane-border-status top"
end
end
|
#validate! ⇒ Object
71
72
73
74
75
76
77
78
|
# File 'lib/tmuxinator/project.rb', line 71
def validate!
raise "Your project file should include some windows." \
unless windows?
raise "Your project file didn't specify a 'project_name'" \
unless name?
self
end
|
#window(index) ⇒ Object
243
244
245
|
# File 'lib/tmuxinator/project.rb', line 243
def window(index)
"#{name}:#{index}"
end
|
#windows ⇒ Object
110
111
112
113
114
115
116
|
# File 'lib/tmuxinator/project.rb', line 110
def windows
windows_yml = yaml["tabs"] || yaml["windows"]
@windows ||= (windows_yml || {}).map.with_index do |window_yml, index|
Tmuxinator::Window.new(window_yml, index, self)
end
end
|
#windows? ⇒ Boolean
231
232
233
|
# File 'lib/tmuxinator/project.rb', line 231
def windows?
windows.any?
end
|