ruby-shell 3.4.6 → 3.4.8
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/README.md +1 -0
- data/bin/rsh +87 -66
- metadata +4 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 35dd4b1b6792ae0a66b0da2efd24bf78af5f2ba268fd933bd0af2b43e7fb0b23
|
|
4
|
+
data.tar.gz: 6c1f6026a8870e178788190f702de82f3845364ebaa4e42a9952a8f9b61d9d0e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e9a950baff3af17ae641fe67a9782b5888c4e1ce93a94354558ec39adecbbe9254710a5719a000254c326eb71d9b91b098edea77dcdedcf773baff269448fa5c
|
|
7
|
+
data.tar.gz: a84ce4e143a9237549affdb6befd894adf032737ae949edd4e326fe8858a127158f976760bfb43e41b6e51f8b58cf62e0271ebfec1cfa41e6b8f67763ecbe957
|
data/README.md
CHANGED
|
@@ -136,6 +136,7 @@ Special commands:
|
|
|
136
136
|
* `:nick` lists all command nicks, `:gnick` lists general nicks
|
|
137
137
|
* `:nick -name` delete a command nick, `:gnick -name` delete a general nick
|
|
138
138
|
* `:history` will list the command history, while `:rmhistory` will delete the history
|
|
139
|
+
* `:rehash` rebuilds the executable cache (useful after installing new commands)
|
|
139
140
|
* `:jobs` will list background jobs, `:fg [job_id]` brings jobs to foreground, `:bg [job_id]` resumes stopped jobs
|
|
140
141
|
* `:defun func(args) = code` defines Ruby functions callable as shell commands (persistent!)
|
|
141
142
|
* `:defun` lists all user-defined functions, `:defun -func` removes functions
|
data/bin/rsh
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
# Web_site: http://isene.com/
|
|
9
9
|
# Github: https://github.com/isene/rsh
|
|
10
10
|
# License: Public domain
|
|
11
|
-
@version = "3.4.
|
|
11
|
+
@version = "3.4.8" # Code refactoring: DRY helpers, nick/gnick feedback, bug fixes
|
|
12
12
|
|
|
13
13
|
# MODULES, CLASSES AND EXTENSIONS
|
|
14
14
|
class String # Add coloring to strings (with escaping for Readline)
|
|
@@ -1077,6 +1077,16 @@ def suggest_command(cmd) # Smart command suggestions for typos
|
|
|
1077
1077
|
candidates.sort_by! { |c| levenshtein_distance(cmd, c) }
|
|
1078
1078
|
candidates.first(3)
|
|
1079
1079
|
end
|
|
1080
|
+
def ensure_type(var_name, type, default) # Helper to ensure instance variable has correct type
|
|
1081
|
+
var = instance_variable_get(var_name)
|
|
1082
|
+
instance_variable_set(var_name, default) unless var.is_a?(type)
|
|
1083
|
+
end
|
|
1084
|
+
def persist_var(conf, var_name, value, condition = true) # Helper to persist variable to config
|
|
1085
|
+
return conf unless condition
|
|
1086
|
+
conf.sub!(/^#{Regexp.escape(var_name)}.*(\n|$)/, "")
|
|
1087
|
+
conf += "#{var_name} = #{value.inspect}\n"
|
|
1088
|
+
conf
|
|
1089
|
+
end
|
|
1080
1090
|
def hist_clean # Clean up @history
|
|
1081
1091
|
@history.compact!
|
|
1082
1092
|
@history.delete("")
|
|
@@ -1378,31 +1388,19 @@ def rshrc # Write user configuration to .rshrc (portable between machines)
|
|
|
1378
1388
|
conf = ""
|
|
1379
1389
|
end
|
|
1380
1390
|
|
|
1381
|
-
#
|
|
1382
|
-
conf
|
|
1383
|
-
conf
|
|
1384
|
-
conf
|
|
1385
|
-
conf
|
|
1386
|
-
conf
|
|
1387
|
-
conf
|
|
1388
|
-
conf
|
|
1389
|
-
conf
|
|
1390
|
-
conf
|
|
1391
|
-
conf
|
|
1392
|
-
conf
|
|
1393
|
-
conf
|
|
1394
|
-
conf.sub!(/^@auto_correct.*(\n|$)/, "")
|
|
1395
|
-
conf += "@auto_correct = #{@auto_correct}\n" if @auto_correct
|
|
1396
|
-
conf.sub!(/^@slow_command_threshold.*(\n|$)/, "")
|
|
1397
|
-
conf += "@slow_command_threshold = #{@slow_command_threshold}\n" if @slow_command_threshold && @slow_command_threshold > 0
|
|
1398
|
-
conf.sub!(/^@completion_learning.*(\n|$)/, "")
|
|
1399
|
-
conf += "@completion_learning = #{@completion_learning}\n" unless @completion_learning
|
|
1400
|
-
conf.sub!(/^@completion_show_metadata.*(\n|$)/, "")
|
|
1401
|
-
conf += "@completion_show_metadata = #{@completion_show_metadata}\n" if @completion_show_metadata
|
|
1402
|
-
conf.sub!(/^@plugin_enabled.*(\n|$)/, "")
|
|
1403
|
-
conf += "@plugin_enabled = #{@plugin_enabled}\n" unless @plugin_enabled.empty?
|
|
1404
|
-
conf.sub!(/^@validation_rules.*(\n|$)/, "")
|
|
1405
|
-
conf += "@validation_rules = #{@validation_rules}\n" unless @validation_rules.empty?
|
|
1391
|
+
# Persist user-editable configuration using helper
|
|
1392
|
+
conf = persist_var(conf, '@nick', @nick)
|
|
1393
|
+
conf = persist_var(conf, '@gnick', @gnick)
|
|
1394
|
+
conf = persist_var(conf, '@bookmarks', @bookmarks, !@bookmarks.empty?)
|
|
1395
|
+
conf = persist_var(conf, '@defuns', @defuns, !@defuns.empty?)
|
|
1396
|
+
conf = persist_var(conf, '@history_dedup', @history_dedup, @history_dedup && @history_dedup != 'smart')
|
|
1397
|
+
conf = persist_var(conf, '@session_autosave', @session_autosave, @session_autosave && @session_autosave > 0)
|
|
1398
|
+
conf = persist_var(conf, '@auto_correct', @auto_correct, @auto_correct)
|
|
1399
|
+
conf = persist_var(conf, '@slow_command_threshold', @slow_command_threshold, @slow_command_threshold && @slow_command_threshold > 0)
|
|
1400
|
+
conf = persist_var(conf, '@completion_learning', @completion_learning, !@completion_learning)
|
|
1401
|
+
conf = persist_var(conf, '@completion_show_metadata', @completion_show_metadata, @completion_show_metadata)
|
|
1402
|
+
conf = persist_var(conf, '@plugin_disabled', @plugin_disabled, !@plugin_disabled.empty?)
|
|
1403
|
+
conf = persist_var(conf, '@validation_rules', @validation_rules, !@validation_rules.empty?)
|
|
1406
1404
|
|
|
1407
1405
|
File.write(Dir.home+'/.rshrc', conf)
|
|
1408
1406
|
rshstate # Also save runtime state
|
|
@@ -1562,6 +1560,8 @@ def help
|
|
|
1562
1560
|
col3 << ":help This help"
|
|
1563
1561
|
col3 << ":info About rsh"
|
|
1564
1562
|
col3 << ":version Version info"
|
|
1563
|
+
col3 << ":history Show history"
|
|
1564
|
+
col3 << ":rehash Rebuild cache"
|
|
1565
1565
|
|
|
1566
1566
|
# Pad columns to same length
|
|
1567
1567
|
max_lines = [col1.length, col2.length, col3.length].max
|
|
@@ -1602,6 +1602,14 @@ def rmhistory # Delete history
|
|
|
1602
1602
|
@history = []
|
|
1603
1603
|
puts "History deleted."
|
|
1604
1604
|
end
|
|
1605
|
+
def rehash # Force rebuild of executable cache
|
|
1606
|
+
@exe_cache = nil
|
|
1607
|
+
@exe_cache_path = nil
|
|
1608
|
+
@exe_cache_time = 0
|
|
1609
|
+
@exe_cache_paths = ""
|
|
1610
|
+
cache_executables
|
|
1611
|
+
puts "Executable cache rebuilt (#{@exe.length} commands cached)."
|
|
1612
|
+
end
|
|
1605
1613
|
def nick(nick_str = nil) # Define a new nick like this: `:nick "ls = ls --color"`
|
|
1606
1614
|
if nick_str.nil? || nick_str.empty?
|
|
1607
1615
|
# List all nicks
|
|
@@ -1614,12 +1622,17 @@ def nick(nick_str = nil) # Define a new nick like this: `:nick "ls = ls --color
|
|
|
1614
1622
|
puts
|
|
1615
1623
|
elsif nick_str.match(/^\s*-/)
|
|
1616
1624
|
source = nick_str.sub(/^\s*-/, '')
|
|
1617
|
-
@nick.delete(source)
|
|
1618
|
-
|
|
1625
|
+
if @nick.delete(source)
|
|
1626
|
+
puts "Nick '#{source}' deleted"
|
|
1627
|
+
rshrc
|
|
1628
|
+
else
|
|
1629
|
+
puts "Nick '#{source}' not found"
|
|
1630
|
+
end
|
|
1619
1631
|
else
|
|
1620
1632
|
source = nick_str.sub(/ =.*/, '')
|
|
1621
1633
|
target = nick_str.sub(/.*= /, '')
|
|
1622
1634
|
@nick[source] = target
|
|
1635
|
+
puts "Nick '#{source}' → '#{target}'"
|
|
1623
1636
|
rshrc
|
|
1624
1637
|
end
|
|
1625
1638
|
end
|
|
@@ -1635,12 +1648,17 @@ def gnick(nick_str = nil) # Define a generic/global nick to match not only comma
|
|
|
1635
1648
|
puts
|
|
1636
1649
|
elsif nick_str.match(/^\s*-/)
|
|
1637
1650
|
source = nick_str.sub(/^\s*-/, '')
|
|
1638
|
-
@gnick.delete(source)
|
|
1639
|
-
|
|
1651
|
+
if @gnick.delete(source)
|
|
1652
|
+
puts "Gnick '#{source}' deleted"
|
|
1653
|
+
rshrc
|
|
1654
|
+
else
|
|
1655
|
+
puts "Gnick '#{source}' not found"
|
|
1656
|
+
end
|
|
1640
1657
|
else
|
|
1641
1658
|
source = nick_str.sub(/ =.*/, '')
|
|
1642
1659
|
target = nick_str.sub(/.*= /, '')
|
|
1643
1660
|
@gnick[source] = target
|
|
1661
|
+
puts "Gnick '#{source}' → '#{target}'"
|
|
1644
1662
|
rshrc
|
|
1645
1663
|
end
|
|
1646
1664
|
end
|
|
@@ -3047,26 +3065,26 @@ def load_rshrc_safe
|
|
|
3047
3065
|
# Try to load the .rshrc file
|
|
3048
3066
|
load(Dir.home+'/.rshrc')
|
|
3049
3067
|
|
|
3050
|
-
# Validate critical variables
|
|
3051
|
-
|
|
3052
|
-
|
|
3053
|
-
|
|
3054
|
-
|
|
3055
|
-
|
|
3056
|
-
|
|
3057
|
-
|
|
3058
|
-
|
|
3059
|
-
|
|
3060
|
-
|
|
3061
|
-
|
|
3062
|
-
|
|
3063
|
-
|
|
3064
|
-
|
|
3065
|
-
|
|
3066
|
-
|
|
3068
|
+
# Validate critical variables using helper
|
|
3069
|
+
ensure_type(:@history, Array, [])
|
|
3070
|
+
ensure_type(:@nick, Hash, {})
|
|
3071
|
+
ensure_type(:@gnick, Hash, {})
|
|
3072
|
+
ensure_type(:@cmd_frequency, Hash, {})
|
|
3073
|
+
ensure_type(:@cmd_stats, Hash, {})
|
|
3074
|
+
ensure_type(:@bookmarks, Hash, {})
|
|
3075
|
+
ensure_type(:@defuns, Hash, {})
|
|
3076
|
+
ensure_type(:@history_dedup, String, 'smart')
|
|
3077
|
+
ensure_type(:@session_autosave, Integer, 0)
|
|
3078
|
+
ensure_type(:@slow_command_threshold, Integer, 0)
|
|
3079
|
+
ensure_type(:@plugin_disabled, Array, []) # FIXED: was @plugin_enabled
|
|
3080
|
+
ensure_type(:@plugins, Array, [])
|
|
3081
|
+
ensure_type(:@plugin_commands, Hash, {})
|
|
3082
|
+
ensure_type(:@validation_rules, Array, [])
|
|
3083
|
+
ensure_type(:@completion_weights, Hash, {})
|
|
3084
|
+
ensure_type(:@recording, Hash, {active: false, name: nil, commands: []})
|
|
3085
|
+
ensure_type(:@recordings, Hash, {})
|
|
3086
|
+
@auto_correct = false unless [true, false].include?(@auto_correct)
|
|
3067
3087
|
@completion_learning = true if @completion_learning.nil?
|
|
3068
|
-
@recording = {active: false, name: nil, commands: []} unless @recording.is_a?(Hash)
|
|
3069
|
-
@recordings = {} unless @recordings.is_a?(Hash)
|
|
3070
3088
|
|
|
3071
3089
|
# Restore defuns from .rshrc
|
|
3072
3090
|
if @defuns && !@defuns.empty?
|
|
@@ -3197,31 +3215,34 @@ def auto_heal_rshrc
|
|
|
3197
3215
|
end
|
|
3198
3216
|
|
|
3199
3217
|
def load_defaults
|
|
3200
|
-
|
|
3201
|
-
|
|
3202
|
-
|
|
3218
|
+
# Use ensure_type for consistency
|
|
3219
|
+
ensure_type(:@history, Array, [])
|
|
3220
|
+
ensure_type(:@nick, Hash, {"ls" => "ls --color -F"})
|
|
3221
|
+
ensure_type(:@gnick, Hash, {})
|
|
3222
|
+
ensure_type(:@cmd_frequency, Hash, {})
|
|
3223
|
+
ensure_type(:@cmd_stats, Hash, {})
|
|
3224
|
+
ensure_type(:@bookmarks, Hash, {})
|
|
3225
|
+
ensure_type(:@defuns, Hash, {})
|
|
3226
|
+
ensure_type(:@switch_cache, Hash, {})
|
|
3227
|
+
ensure_type(:@switch_cache_time, Hash, {})
|
|
3228
|
+
ensure_type(:@plugin_disabled, Array, []) # FIXED: was @plugin_enabled
|
|
3229
|
+
ensure_type(:@plugins, Array, [])
|
|
3230
|
+
ensure_type(:@plugin_commands, Hash, {})
|
|
3231
|
+
ensure_type(:@validation_rules, Array, [])
|
|
3232
|
+
ensure_type(:@completion_weights, Hash, {})
|
|
3233
|
+
ensure_type(:@recording, Hash, {active: false, name: nil, commands: []})
|
|
3234
|
+
ensure_type(:@recordings, Hash, {})
|
|
3235
|
+
|
|
3203
3236
|
@completion_limit ||= 10
|
|
3204
3237
|
@completion_case_sensitive ||= false
|
|
3205
3238
|
@completion_show_descriptions ||= false
|
|
3206
3239
|
@completion_fuzzy ||= true
|
|
3207
|
-
@cmd_frequency ||= {}
|
|
3208
|
-
@cmd_stats ||= {}
|
|
3209
|
-
@bookmarks ||= {}
|
|
3210
|
-
@defuns ||= {}
|
|
3211
|
-
@switch_cache ||= {}
|
|
3212
|
-
@switch_cache_time ||= {}
|
|
3213
3240
|
@history_dedup ||= 'smart'
|
|
3214
3241
|
@session_autosave ||= 0
|
|
3215
3242
|
@auto_correct ||= false
|
|
3216
3243
|
@slow_command_threshold ||= 0
|
|
3217
|
-
@plugin_enabled ||= []
|
|
3218
|
-
@plugins ||= []
|
|
3219
|
-
@plugin_commands ||= {}
|
|
3220
|
-
@validation_rules ||= []
|
|
3221
|
-
@completion_weights ||= {}
|
|
3222
3244
|
@completion_learning = true if @completion_learning.nil?
|
|
3223
|
-
|
|
3224
|
-
@recordings ||= {}
|
|
3245
|
+
|
|
3225
3246
|
puts "Loaded with default configuration."
|
|
3226
3247
|
end
|
|
3227
3248
|
|
|
@@ -3458,7 +3479,7 @@ loop do
|
|
|
3458
3479
|
save_session load_session list_sessions delete_session rmsession
|
|
3459
3480
|
validate completion_stats completion_reset
|
|
3460
3481
|
record replay
|
|
3461
|
-
history rmhistory jobs fg bg dirs help info version]
|
|
3482
|
+
history rmhistory rehash jobs fg bg dirs help info version]
|
|
3462
3483
|
|
|
3463
3484
|
# Try to call as rsh method
|
|
3464
3485
|
if known_commands.include?(cmd_name)
|
metadata
CHANGED
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ruby-shell
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.4.
|
|
4
|
+
version: 3.4.8
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Geir Isene
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2025-10-
|
|
11
|
+
date: 2025-10-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: 'A shell written in Ruby with extensive tab completions, aliases/nicks,
|
|
14
14
|
history, syntax highlighting, theming, auto-cd, auto-opening files and more. UPDATE
|
|
15
|
-
v3.4.
|
|
16
|
-
|
|
17
|
-
directory coloring (@dir_colors like RTFM''s @topmatch)!'
|
|
15
|
+
v3.4.8: Code refactoring with DRY helpers (ensure_type, persist_var), nick/gnick
|
|
16
|
+
feedback messages, fixed @plugin_enabled bug. Cleaner, more maintainable codebase!'
|
|
18
17
|
email: g@isene.com
|
|
19
18
|
executables:
|
|
20
19
|
- rsh
|