ruby-shell 0.3.1 → 0.4
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 +6 -0
- data/bin/rsh +80 -63
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 03f10b7b8ca979952b3a717420c8cc6002c2ad443933b7006ba9c460e83ef09e
|
4
|
+
data.tar.gz: fee02bd24b9796a4ab8852fa4a9ca6d591942b4aa08461e7decaf7ecf73da334
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 817094937e32711d26dcc291c5c470e85a1f3901a335c427eede150465747f0761939ce5ccd686630bc3daf0200976533d4fe5e9f3259a364ed384c983aafb0f
|
7
|
+
data.tar.gz: 1f6401e2afef2bb22089b5e28e5c977cf42b85e66182a223e780c25319ec77e168588afc74ea9713224e20bbd1d892da52510c66dc02876b1cec67013c09d231
|
data/README.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
# rsh
|
2
|
+
 [](https://badge.fury.io/rb/ruby-shell)  
|
3
|
+
|
2
4
|
The Ruby SHell
|
3
5
|
|
4
6
|
# Why?
|
@@ -29,6 +31,9 @@ Add command nicks (aliases) with `:nick "some_nick = some_command"`, e.g. `:nick
|
|
29
31
|
## Tab completion
|
30
32
|
You can tab complete almost anything. Hitting `TAB` will try to complete in this priority: nicks, gnicks, commands, dirs/files. Hitting `TAB`after a `-` will list the command switches for the preceding command with a short explanation (from the command's --help), like this `ls -`(`TAB`) will list all the switches/options for the `ls` command.
|
31
33
|
|
34
|
+
## Integrations
|
35
|
+
rsh is integrated with the [rtfm file manager](https://github.com/isene/RTFM) and with [fzf](https://github.com/junegunn/fzf). Just enter the command `r` and rtfm will be launched - and when you quit the file manager, you will drop back into rsh in the directory you where you exited rtfm. Enter the command `fzf` to launch the fuzzy finder - select the directory/file you want, press `ENTER` and you will find yourself in the directory where that item resides.
|
36
|
+
|
32
37
|
## Syntax highlighting
|
33
38
|
rsh will highlight nicks, gnicks, commands and dirs/files as they are written on the command line.
|
34
39
|
|
@@ -44,6 +49,7 @@ Variable | Description
|
|
44
49
|
`@c_path` | Color for valid path
|
45
50
|
`@c_tabselect` | Color for selected tabcompleted item
|
46
51
|
`@c_taboption` | Color for unselected tabcompleted item
|
52
|
+
`@c_stamp` | Color for time stamp/command
|
47
53
|
|
48
54
|
# Enter the world of Ruby
|
49
55
|
By entering `:some-ruby-command` you have full access to the Ruby universe right from your command line. You can do anything from `:puts 2 + 13` or `:if 0.7 > Math::sin(34) then puts "OK" end` or whatever tickles you fancy.
|
data/bin/rsh
CHANGED
@@ -101,31 +101,31 @@ begin # Requires
|
|
101
101
|
end
|
102
102
|
begin # Initialization
|
103
103
|
# Theming
|
104
|
-
@c_prompt = 196
|
105
|
-
@c_cmd = 48
|
106
|
-
@c_nick = 51
|
107
|
-
@c_gnick = 87
|
108
|
-
@c_path = 208
|
109
|
-
@c_switch = 148
|
110
|
-
@c_tabselect = 207
|
111
|
-
@c_taboption = 244
|
104
|
+
@c_prompt = 196 # Color for basic prompt
|
105
|
+
@c_cmd = 48 # Color for valid command
|
106
|
+
@c_nick = 51 # Color for matching nick
|
107
|
+
@c_gnick = 87 # Color for matching gnick
|
108
|
+
@c_path = 208 # Color for valid path
|
109
|
+
@c_switch = 148 # Color for switches/options
|
110
|
+
@c_tabselect = 207 # Color for selected tabcompleted item
|
111
|
+
@c_taboption = 244 # Color for unselected tabcompleted item
|
112
|
+
@c_stamp = 244 # Color for time stamp/command
|
112
113
|
# Prompt
|
113
|
-
@
|
114
|
-
@node = Etc.uname[:nodename] # For use in @prompt
|
115
|
-
@prompt = "rsh >".c(@c_prompt).b # Very basic prompt if not defined in .rshrc
|
114
|
+
@prompt = "rsh > ".c(@c_prompt).b # Very basic prompt if not defined in .rshrc
|
116
115
|
# Hash & array initializations
|
117
|
-
@nick = {}
|
118
|
-
@gnick = {}
|
119
|
-
@history = []
|
116
|
+
@nick = {} # Initiate alias/nick hash
|
117
|
+
@gnick = {} # Initiate generic/global alias/nick hash
|
118
|
+
@history = [] # Initiate history array
|
120
119
|
# Paths
|
120
|
+
@user = Etc.getpwuid(Process.euid).name # For use in @prompt
|
121
121
|
@path = ["/bin",
|
122
122
|
"/usr/bin",
|
123
|
-
"/home/#{@user}/bin"]
|
123
|
+
"/home/#{@user}/bin"] # Basic paths for executables if not set in .rshrc
|
124
124
|
# History
|
125
|
-
@histsize = 100
|
126
|
-
@hloaded = false
|
125
|
+
@histsize = 100 # Max history if not set in .rshrc
|
126
|
+
@hloaded = false # Variable to determine if history is loaded
|
127
127
|
# Variable initializations
|
128
|
-
@cmd = ""
|
128
|
+
@cmd = "" # Initiate variable @cmd
|
129
129
|
end
|
130
130
|
# GENERIC FUNCTIONS
|
131
131
|
def getchr # Process key presses
|
@@ -184,9 +184,9 @@ def getstr # A custom Readline-like function
|
|
184
184
|
text = @history_copy[@stk]
|
185
185
|
@c.clear_line
|
186
186
|
print @prompt
|
187
|
-
row, pos0 = @c.pos
|
187
|
+
row, @pos0 = @c.pos
|
188
188
|
print cmd_check(text)
|
189
|
-
@c.col(pos0 + @pos)
|
189
|
+
@c.col(@pos0 + @pos)
|
190
190
|
chr = getchr
|
191
191
|
return "\n" if chr == "C-G" # Ctrl-G escapes the reasdline
|
192
192
|
case chr
|
@@ -225,7 +225,7 @@ def getstr # A custom Readline-like function
|
|
225
225
|
@history_copy[@stk][@pos] = ""
|
226
226
|
end
|
227
227
|
when 'WBACK' # Delete one word to the left (Ctrl-W)
|
228
|
-
unless @pos == pos0
|
228
|
+
unless @pos == @pos0
|
229
229
|
until @history_copy[@stk][@pos - 1] == " " or @pos == 0
|
230
230
|
@pos -= 1
|
231
231
|
@history_copy[@stk][@pos] = ""
|
@@ -244,25 +244,29 @@ def getstr # A custom Readline-like function
|
|
244
244
|
@history_copy[@stk] = ""
|
245
245
|
@pos = 0
|
246
246
|
when 'TAB' # Tab completion of dirs and files
|
247
|
-
@tabstr
|
248
|
-
@tabend
|
249
|
-
elements
|
250
|
-
|
247
|
+
@tabstr = @history_copy[@stk][0...@pos]
|
248
|
+
@tabend = @history_copy[@stk][@pos..]
|
249
|
+
elements = @tabstr.split(" ")
|
250
|
+
if @tabstr.match(" $")
|
251
|
+
elements.append("")
|
252
|
+
@tabsearch = ""
|
253
|
+
else
|
254
|
+
@tabsearch = elements.last.to_s
|
255
|
+
@tabstr = @tabstr[0...-@tabsearch.length]
|
256
|
+
end
|
251
257
|
i = elements.length - 1
|
252
|
-
|
253
|
-
if m == "-"
|
258
|
+
if @tabsearch =~ /^-/
|
254
259
|
until i == 0
|
255
260
|
i -= 1
|
256
261
|
if elements[i] !~ /^-/
|
257
|
-
@tabstr.chop!
|
258
262
|
tab_switch(elements[i])
|
259
263
|
break
|
260
264
|
end
|
261
265
|
end
|
262
266
|
else
|
263
|
-
tab_all(
|
267
|
+
tab_all(@tabsearch)
|
264
268
|
end
|
265
|
-
@history_copy[@stk] = @tabstr + @tabend
|
269
|
+
@history_copy[@stk] = @tabstr.to_s + @tabsearch.to_s + @tabend.to_s
|
266
270
|
when /^.$/
|
267
271
|
@history_copy[@stk].insert(@pos,chr)
|
268
272
|
@pos += 1
|
@@ -277,13 +281,17 @@ def getstr # A custom Readline-like function
|
|
277
281
|
@history[0]
|
278
282
|
end
|
279
283
|
def tab_switch(str) # TAB completion for command switches (TAB after "-")
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
284
|
+
begin
|
285
|
+
hlp = `#{str} --help`
|
286
|
+
hlp = hlp.split("\n").grep(/^\s*-{1,2}[^-]/)
|
287
|
+
hlp = hlp.map {|h| h.sub(/^\s*/, '')}
|
288
|
+
switch = tabselect(hlp)
|
289
|
+
switch = switch.sub(/ .*/, '').sub(/,/, '')
|
290
|
+
@tabsearch.chop!
|
291
|
+
@tabsearch += switch
|
292
|
+
@pos = @tabstr.length + @tabsearch.length
|
293
|
+
rescue
|
294
|
+
end
|
287
295
|
end
|
288
296
|
def tab_all(str) # TAB completion for Dirs/files, nicks and commands
|
289
297
|
exe = []
|
@@ -294,29 +302,18 @@ def tab_all(str) # TAB completion for Dirs/files, nicks and commands
|
|
294
302
|
end
|
295
303
|
exe.prepend(*@nick.keys)
|
296
304
|
exe.prepend(*@gnick.keys)
|
297
|
-
compl
|
298
|
-
fdir
|
299
|
-
fdir
|
300
|
-
fdir
|
305
|
+
compl = exe.select {|s| s =~ Regexp.new("^" + str)}
|
306
|
+
fdir = str
|
307
|
+
fdir += "/" if Dir.exist?(fdir)
|
308
|
+
fdir += "*"
|
301
309
|
compl.prepend(*Dir.glob(fdir))
|
302
|
-
|
303
|
-
|
304
|
-
@tabstr
|
305
|
-
@tabstr += str if match == ""
|
306
|
-
@pos = @tabstr.length if match
|
307
|
-
end
|
308
|
-
def nextline # Handle going to the next line in the terminal
|
309
|
-
row, col = @c.pos
|
310
|
-
if row == @maxrow
|
311
|
-
@c.scroll_down
|
312
|
-
@c_row -= 1
|
313
|
-
end
|
314
|
-
@c.next_line
|
310
|
+
match = tabselect(compl) unless compl.empty?
|
311
|
+
@tabsearch = match if match
|
312
|
+
@pos = @tabstr.length + @tabsearch.length if match
|
315
313
|
end
|
316
314
|
def tabselect(ary) # Let user select from the incoming array
|
317
315
|
@c_row, @c_col = @c.pos
|
318
316
|
chr = ""
|
319
|
-
tab = false
|
320
317
|
i = 0
|
321
318
|
ary.length < 5 ? l = ary.length : l = 5
|
322
319
|
while chr != "ENTER"
|
@@ -324,11 +321,15 @@ def tabselect(ary) # Let user select from the incoming array
|
|
324
321
|
l.times do |x|
|
325
322
|
if x == 0
|
326
323
|
@c.clear_line
|
327
|
-
|
324
|
+
tabstart = cmd_check(@tabstr)
|
325
|
+
tabchoice = ary[i].sub(/(.*?)[ ,].*/, '\1')[@tabsearch.length..]
|
326
|
+
tabline = "#{@prompt}#{tabstart}#{@tabsearch.c(@c_tabselect)}#{tabchoice}#{@tabend}"
|
327
|
+
print tabline # Full command line
|
328
|
+
@c_col = @pos0 + @tabstr.length + @tabsearch.length + tabchoice.length
|
328
329
|
nextline
|
329
|
-
print " #{ary[i]}".c(@c_tabselect)
|
330
|
+
print " #{ary[i]}".c(@c_tabselect) # Top option selected
|
330
331
|
else
|
331
|
-
print " #{ary[x+i]}".c(@c_taboption)
|
332
|
+
print " #{ary[x+i]}".c(@c_taboption) # Next option unselected
|
332
333
|
end
|
333
334
|
nextline
|
334
335
|
end
|
@@ -343,15 +344,30 @@ def tabselect(ary) # Let user select from the incoming array
|
|
343
344
|
i += 1 unless i > ary.length - 2
|
344
345
|
when 'UP'
|
345
346
|
i -= 1 unless i == 0
|
346
|
-
when'TAB'
|
347
|
+
when 'TAB'
|
347
348
|
chr = "ENTER"
|
348
|
-
|
349
|
+
when 'BACK'
|
350
|
+
@tabsearch.chop! unless @tabsearch == ''
|
351
|
+
tab_all(@tabsearch)
|
352
|
+
return @tabsearch
|
353
|
+
when /^[[:print:]]$/
|
354
|
+
@tabsearch += chr
|
355
|
+
tab_all(@tabsearch)
|
356
|
+
return @tabsearch
|
349
357
|
end
|
350
358
|
end
|
351
359
|
@c.clear_screen_down
|
352
360
|
@c.row(@c_row)
|
353
361
|
@c.col(@c_col)
|
354
|
-
return ary[i]
|
362
|
+
return ary[i]
|
363
|
+
end
|
364
|
+
def nextline # Handle going to the next line in the terminal
|
365
|
+
row, col = @c.pos
|
366
|
+
if row == @maxrow
|
367
|
+
@c.scroll_down
|
368
|
+
@c_row -= 1
|
369
|
+
end
|
370
|
+
@c.next_line
|
355
371
|
end
|
356
372
|
def hist_clean # Clean up @history
|
357
373
|
@history.uniq!
|
@@ -445,13 +461,14 @@ end
|
|
445
461
|
|
446
462
|
# MAIN PART
|
447
463
|
loop do
|
464
|
+
@user = Etc.getpwuid(Process.euid).name # For use in @prompt
|
465
|
+
@node = Etc.uname[:nodename] # For use in @prompt
|
448
466
|
h = @history; load(Dir.home+'/.rshrc') if File.exist?(Dir.home+'/.rshrc'); @history = h # reload prompt but not history
|
449
467
|
@prompt.gsub!(/#{Dir.home}/, '~') # Simplify path in prompt
|
450
468
|
@cmd = getstr # Main work is here
|
451
469
|
hist_clean # Clean up the history
|
452
470
|
@cmd = "ls" if @cmd == "" # Default to ls when no command is given
|
453
471
|
print "\n" # Newline
|
454
|
-
if @cmd == "x" then rshrc; break; end # A simple way to exit rsh
|
455
472
|
if @cmd == "r" # Integration with rtfm (https://github.com/isene/RTFM)
|
456
473
|
File.write("/tmp/.rshpwd", Dir.pwd)
|
457
474
|
system("rtfm /tmp/.rshpwd")
|
@@ -471,7 +488,7 @@ loop do
|
|
471
488
|
@cmd = @cmd.gsub(Regexp.union(ca.keys), @nick)
|
472
489
|
ga = @gnick.transform_keys {|k| /\b#{Regexp.escape k}\b/}
|
473
490
|
@cmd = @cmd.gsub(Regexp.union(ga.keys), @gnick)
|
474
|
-
puts "#{Time.now.strftime("%H:%M:%S")}: #{@cmd}".c(
|
491
|
+
puts "#{Time.now.strftime("%H:%M:%S")}: #{@cmd}".c(@c_stamp)
|
475
492
|
begin
|
476
493
|
if @cmd == "fzf" # fzf integration (https://github.com/junegunn/fzf)
|
477
494
|
res = `#{@cmd}`.chomp
|
metadata
CHANGED
@@ -1,18 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-shell
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.4'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Geir Isene
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: 'A shell written in Ruby with extensive tab completions, aliases/nicks,
|
14
|
-
history, syntax highlighting and theming. New in 0.
|
15
|
-
chars in input.'
|
14
|
+
history, syntax highlighting and theming. New in 0.4: Much better tab completion.'
|
16
15
|
email: g@isene.com
|
17
16
|
executables:
|
18
17
|
- rsh
|