heytmux 0.2.0 → 0.3.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.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/README.md +1 -1
- data/Rakefile +2 -0
- data/exe/heytmux +1 -1
- data/heytmux.gemspec +1 -1
- data/lib/heytmux/core.rb +17 -7
- data/lib/heytmux/pane_action.rb +1 -1
- data/lib/heytmux/pane_actions/expect.rb +1 -0
- data/lib/heytmux/tmux.rb +1 -1
- data/lib/heytmux/validations.rb +27 -6
- data/lib/heytmux/version.rb +1 -1
- data/lib/heytmux.rb +6 -6
- metadata +7 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2416296679429973f3324dee4b41204cf0414cba0296028c2856215370dc2627
|
4
|
+
data.tar.gz: 6b5b41223076adf68875297d9e2c5fc8959b07250a37e9df71e435baa03bed6a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 579bf7e26c4e2c91870303e608c6e5a9bfe9d9368b1d610550fa6d0e185e4cfc62aaf4c364f12ef5679e5a263548b5c44720074e8675e0759059701e0b587b7b
|
7
|
+
data.tar.gz: fcb6ae512001bb29b3af8c2aeb8f124dbb2fe66b018769ca6bd7af9804b3dbc82058dcbc96a4cf7951cff939ed635f7085dc7fed95ffdd33c9a4f3b3ec87e453
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Hey tmux!
|
2
2
|
=========
|
3
3
|
|
4
|
-
[](https://github.com/junegunn/heytmux/actions)
|
5
5
|
[](https://coveralls.io/github/junegunn/heytmux?branch=master)
|
6
6
|
[](https://rubygems.org/gems/heytmux)
|
7
7
|
|
data/Rakefile
CHANGED
data/exe/heytmux
CHANGED
@@ -23,7 +23,7 @@ strings = [ARGV.any? || $stdin.tty? ? nil : ['standard input', $stdin.read],
|
|
23
23
|
specs = strings.map do |name, str|
|
24
24
|
begin
|
25
25
|
str = Heytmux.replace_env_vars(str)
|
26
|
-
YAML.
|
26
|
+
YAML.safe_load(str)
|
27
27
|
rescue StandardError => e
|
28
28
|
abort("Failed to parse #{name}: #{e}")
|
29
29
|
end
|
data/heytmux.gemspec
CHANGED
@@ -26,5 +26,5 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_development_dependency 'coveralls_reborn'
|
27
27
|
spec.add_development_dependency 'minitest'
|
28
28
|
spec.add_development_dependency 'pry'
|
29
|
-
spec.add_development_dependency 'rake'
|
29
|
+
spec.add_development_dependency 'rake'
|
30
30
|
end
|
data/lib/heytmux/core.rb
CHANGED
@@ -77,7 +77,11 @@ module Heytmux
|
|
77
77
|
label, body = command.is_a?(Hash) ? command.first : [:paste, command]
|
78
78
|
PaneAction.for(label).process(window_index, pane_index, body) do |source|
|
79
79
|
string = source.to_s
|
80
|
-
|
80
|
+
if item
|
81
|
+
string.gsub(ITEM_PAT, item).gsub(ITEM_INDEX_PAT, item_index.to_s)
|
82
|
+
else
|
83
|
+
string
|
84
|
+
end
|
81
85
|
end
|
82
86
|
end
|
83
87
|
end
|
@@ -85,9 +89,8 @@ module Heytmux
|
|
85
89
|
# Groups entities by the group key and extracts unique, sorted indexes and
|
86
90
|
# returns stateful indexer that issues index number for the given group key
|
87
91
|
def indexer(entities, group_key, index_key)
|
88
|
-
indexes =
|
89
|
-
|
90
|
-
.map { |g, es| [g, es.map { |e| e[index_key] }.sort.uniq] }]
|
92
|
+
indexes = entities.group_by { |e| e[group_key] }
|
93
|
+
.transform_values { |es| es.map { |e| e[index_key] }.sort.uniq }
|
91
94
|
->(group) { indexes.fetch(group, []).shift }
|
92
95
|
end
|
93
96
|
private_class_method :indexer
|
@@ -141,10 +144,17 @@ module Heytmux
|
|
141
144
|
end
|
142
145
|
|
143
146
|
def interpret_and_expand_pane_spec(pane, items, pane_indexer)
|
147
|
+
pane_items = pane[ITEMS_KEY]
|
148
|
+
if pane_items && pane.length > 1
|
149
|
+
pane = pane.except(ITEMS_KEY)
|
150
|
+
items = pane_items || items
|
151
|
+
end
|
152
|
+
|
144
153
|
title, command = pane.is_a?(Hash) ? pane.first : [pane.tr("\n", ' '), pane]
|
145
154
|
if title =~ ITEM_PAT || title =~ ITEM_INDEX_PAT
|
146
155
|
items.map.with_index do |item, item_idx|
|
147
|
-
title_sub = title.gsub(ITEM_PAT, item.to_s)
|
156
|
+
title_sub = title.gsub(ITEM_PAT, item.to_s)
|
157
|
+
.gsub(ITEM_INDEX_PAT, item_idx.to_s)
|
148
158
|
{ title: title_sub, command: command,
|
149
159
|
item: item.to_s, item_index: item_idx,
|
150
160
|
index: pane_indexer[title_sub] }
|
@@ -156,9 +166,9 @@ module Heytmux
|
|
156
166
|
|
157
167
|
# Checks if there are entities without the required_field and creates them
|
158
168
|
# with the given block. Returns two arrays of found and created entities.
|
159
|
-
def create_if_missing(entities, required_field)
|
169
|
+
def create_if_missing(entities, required_field, &block)
|
160
170
|
found, missing = entities.partition { |e| e[required_field] }
|
161
|
-
[found, missing.map
|
171
|
+
[found, missing.map(&block)]
|
162
172
|
end
|
163
173
|
private_class_method :create_if_missing
|
164
174
|
|
data/lib/heytmux/pane_action.rb
CHANGED
data/lib/heytmux/tmux.rb
CHANGED
@@ -23,7 +23,7 @@ module Heytmux
|
|
23
23
|
list = tmux(%w[list-panes -s -F],
|
24
24
|
labels.map { |label| "\#{#{label}}" }.join(delimiter))
|
25
25
|
list.each_line.map do |line|
|
26
|
-
|
26
|
+
labels.zip(line.chomp.split(delimiter)).to_h.tap do |h|
|
27
27
|
h[:window_index] = h[:window_index].to_i
|
28
28
|
h[:pane_index] = h[:pane_index].to_i
|
29
29
|
end
|
data/lib/heytmux/validations.rb
CHANGED
@@ -12,15 +12,15 @@ module Heytmux
|
|
12
12
|
unless spec.key?(WINDOWS_KEY)
|
13
13
|
raise(ArgumentError, 'windows key is not found')
|
14
14
|
end
|
15
|
+
|
15
16
|
spec[WINDOWS_KEY]
|
16
17
|
when Array then spec
|
17
18
|
else
|
18
19
|
raise ArgumentError, "Not a valid spec: #{spec}"
|
19
20
|
end
|
20
21
|
|
21
|
-
unless windows.is_a?(Array)
|
22
|
-
|
23
|
-
end
|
22
|
+
raise ArgumentError, 'windows must be given as a list' unless windows.is_a?(Array)
|
23
|
+
|
24
24
|
windows.each { |window| validate_window(window) }
|
25
25
|
nil
|
26
26
|
end
|
@@ -33,9 +33,8 @@ module Heytmux
|
|
33
33
|
message = "Not a valid window spec: #{window_spec.inspect}"
|
34
34
|
case window_spec
|
35
35
|
when Hash
|
36
|
-
unless single_spec?(window_spec, Hash, Array)
|
37
|
-
|
38
|
-
end
|
36
|
+
raise ArgumentError, message unless single_spec?(window_spec, Hash, Array)
|
37
|
+
|
39
38
|
spec = window_spec.first.last
|
40
39
|
spec = { PANES_KEY => spec } if spec.is_a?(Array)
|
41
40
|
spec.fetch(PANES_KEY, []).each do |pane|
|
@@ -55,6 +54,17 @@ module Heytmux
|
|
55
54
|
message = "Not a valid pane spec: #{pane_spec.inspect}"
|
56
55
|
case pane_spec
|
57
56
|
when Hash
|
57
|
+
# Is 'items' present?
|
58
|
+
has_items = pane_spec.key?(ITEMS_KEY)
|
59
|
+
if has_items && pane_spec.except(ITEMS_KEY).any?
|
60
|
+
items = pane_spec[ITEMS_KEY]
|
61
|
+
if !items.is_a?(Array) || items.empty?
|
62
|
+
raise ArgumentError, "'items' must be a non-empty array"
|
63
|
+
end
|
64
|
+
|
65
|
+
pane_spec = pane_spec.except(ITEMS_KEY)
|
66
|
+
end
|
67
|
+
|
58
68
|
unless single_spec?(pane_spec)
|
59
69
|
if unquoted_pane_title?(pane_spec)
|
60
70
|
message = 'Invalid pane title. ' \
|
@@ -62,6 +72,15 @@ module Heytmux
|
|
62
72
|
end
|
63
73
|
raise ArgumentError, message
|
64
74
|
end
|
75
|
+
|
76
|
+
if has_items
|
77
|
+
title = pane_spec.first.first
|
78
|
+
unless title =~ ITEM_PAT || title =~ ITEM_INDEX_PAT
|
79
|
+
raise ArgumentError,
|
80
|
+
'Pane title must contain {{ item }} or {{ item.index }} ' \
|
81
|
+
"when 'items' is given"
|
82
|
+
end
|
83
|
+
end
|
65
84
|
validate_commands(pane_spec.first.last)
|
66
85
|
else
|
67
86
|
raise ArgumentError, message unless valid_name?(pane_spec)
|
@@ -77,6 +96,7 @@ module Heytmux
|
|
77
96
|
case command
|
78
97
|
when Hash
|
79
98
|
raise ArgumentError, message unless single_spec?(command)
|
99
|
+
|
80
100
|
label, body = command.first
|
81
101
|
validate_action(label, body)
|
82
102
|
else
|
@@ -90,6 +110,7 @@ module Heytmux
|
|
90
110
|
def validate_action(label, body)
|
91
111
|
action = PaneAction.for(label)
|
92
112
|
raise ArgumentError, "Unsupported action: #{label}" unless action
|
113
|
+
|
93
114
|
action.validate(body)
|
94
115
|
end
|
95
116
|
|
data/lib/heytmux/version.rb
CHANGED
data/lib/heytmux.rb
CHANGED
@@ -6,9 +6,9 @@ require 'set'
|
|
6
6
|
module Heytmux
|
7
7
|
DEFAULT_LAYOUT = ->(num_panes) { num_panes <= 3 ? 'even-vertical' : 'tiled' }
|
8
8
|
DEFAULT_OPTIONS = {
|
9
|
-
'automatic-rename'
|
10
|
-
'allow-rename'
|
11
|
-
'pane-base-index'
|
9
|
+
'automatic-rename' => 'off',
|
10
|
+
'allow-rename' => 'off',
|
11
|
+
'pane-base-index' => 0,
|
12
12
|
'pane-border-status' => 'bottom',
|
13
13
|
'pane-border-format' => '#{pane_title}'
|
14
14
|
}.freeze
|
@@ -17,9 +17,9 @@ module Heytmux
|
|
17
17
|
LAYOUT_KEY = 'layout'
|
18
18
|
PANES_KEY = 'panes'
|
19
19
|
ITEMS_KEY = 'items'
|
20
|
-
ITEM_PAT = /{{ *item *}}/i
|
21
|
-
ITEM_INDEX_PAT = /{{ *item\.index *}}/i
|
22
|
-
ENV_PAT = /{{ *\$([a-z0-9_]+) *(?:\| *(.*?) *)?}}/i
|
20
|
+
ITEM_PAT = /{{ *item *}}/i.freeze
|
21
|
+
ITEM_INDEX_PAT = /{{ *item\.index *}}/i.freeze
|
22
|
+
ENV_PAT = /{{ *\$([a-z0-9_]+) *(?:\| *(.*?) *)?}}/i.freeze
|
23
23
|
|
24
24
|
EXPECT_SLEEP_INTERVAL = 0.5
|
25
25
|
EXPECT_TIMEOUT = 60
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heytmux
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Junegunn Choi
|
8
|
-
autorequire:
|
9
8
|
bindir: exe
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 2025-05-20 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: bundler
|
@@ -70,16 +69,16 @@ dependencies:
|
|
70
69
|
name: rake
|
71
70
|
requirement: !ruby/object:Gem::Requirement
|
72
71
|
requirements:
|
73
|
-
- - "
|
72
|
+
- - ">="
|
74
73
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
74
|
+
version: '0'
|
76
75
|
type: :development
|
77
76
|
prerelease: false
|
78
77
|
version_requirements: !ruby/object:Gem::Requirement
|
79
78
|
requirements:
|
80
|
-
- - "
|
79
|
+
- - ">="
|
81
80
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
81
|
+
version: '0'
|
83
82
|
description: Tmux scripting made easy
|
84
83
|
email:
|
85
84
|
- junegunn.c@gmail.com
|
@@ -107,7 +106,6 @@ files:
|
|
107
106
|
homepage: https://github.com/junegunn/heytmux
|
108
107
|
licenses: []
|
109
108
|
metadata: {}
|
110
|
-
post_install_message:
|
111
109
|
rdoc_options: []
|
112
110
|
require_paths:
|
113
111
|
- lib
|
@@ -122,8 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
122
120
|
- !ruby/object:Gem::Version
|
123
121
|
version: '0'
|
124
122
|
requirements: []
|
125
|
-
rubygems_version: 3.2
|
126
|
-
signing_key:
|
123
|
+
rubygems_version: 3.6.2
|
127
124
|
specification_version: 4
|
128
125
|
summary: Hey tmux!
|
129
126
|
test_files: []
|