ruby-shell 0.8 → 0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/.rshrc +16 -4
  3. data/README.md +19 -6
  4. data/bin/rsh +102 -14
  5. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 947102ae716c38ff065cebc636d28aae8d41c558f498adc9b8a604c5bc3f63dc
4
- data.tar.gz: f993423dc15b75bbace1628358f328b1a625f6b18d0afef80c2759b7f9b9a807
3
+ metadata.gz: 37f126a017a54cab294467b035635ce6992f4ae1d67befcd7d4a33882929be5a
4
+ data.tar.gz: 7210fde457362b3a08e793e62ecf27059e244f514bd77f7aaf8f980c47974826
5
5
  SHA512:
6
- metadata.gz: 69a90e0445b80e42ca6c3f15da9ee4ca641e6465d09b3342c96d4abfec5179427261a2b4bc68709afc15f12ba3aeaa40790460daeff5dbeb8e0c42587572db8c
7
- data.tar.gz: f7a5bba35ab0f40056e102dd7613761da1f3ce9d34f7043fa2ec616390a3626fab64aba52d7e55433abead4d9d74e1584073ada150d7bc7fd37de154449ebc07
6
+ metadata.gz: 5690e8bed0c4efbcf3194e8a2d5e1cdfa5e339c26cee90281818e6c7d35a4b0ce3c64dbe769b67fc86ff89220304598a15a8f56844c179376ca4813b2baafa71
7
+ data.tar.gz: 4f0c21b28d1ae2f19cd28d7727e2dce0e8097479188b122092649b49080e60f9210f489155ec2e81b2d7551f3b226f7ee78229abe3814cfc3093140a0c757d38
data/.rshrc CHANGED
@@ -1,12 +1,24 @@
1
- @prompt = "#{@user}@#{@node}".c(46) + ":".c(255) + " #{Dir.pwd}/".c(196) + " ".c(7)
2
- @nick = {"ls"=>"ls --color -F", "la"=>"ls -a --color -F", "ll"=>"ls -l --color -F", "l"=>"less"}
3
- @gnick = {}
4
- @history = []
1
+ # vim: set ft=ruby sw=2 sts=2 et :
2
+
3
+ # PROMPT
4
+ # The numbers in parenthesis are 256 color codes (the '.c()' is a String extention
5
+ # to color text in the terminal. Add '.b' for bold and '.i' for italics.
6
+ if @user == "root"
7
+ @prompt = "#{@user}@#{@node}".c(160) + ":".c(255) + " #{Dir.pwd}/".c(196) + " ".c(7)
8
+ else
9
+ @prompt = "#{@user}@#{@node}".c(46) + ":".c(255) + " #{Dir.pwd}/".c(196) + " ".c(7)
10
+ end
11
+
12
+ # THEME
5
13
  @c_prompt = 196 # Color for basic prompt
6
14
  @c_cmd = 48 # Color for valid command
7
15
  @c_nick = 51 # Color for matching nick
8
16
  @c_gnick = 87 # Color for matching gnick
9
17
  @c_path = 208 # Color for valid path
18
+ @c_switch = 148 # Color for switches/options
10
19
  @c_tabselect = 207 # Color for selected tabcompleted item
11
20
  @c_taboption = 244 # Color for unselected tabcompleted item
21
+ @c_stamp = 244 # Color for time stamp/command
12
22
 
23
+ # UPDATED ON CTRL-D EXIT
24
+ @nick = {"ls"=>"ls --color -F"}
data/README.md CHANGED
@@ -15,15 +15,28 @@ Clone this repo and drop `rsh` into your preferred bin directory. Drop `.rshrc`
15
15
  Or simply `gem install ruby-shell`.
16
16
 
17
17
  # Features
18
- * Aliases (called `nicks`in rsh) - both for commands and general nicks
18
+ * Aliases (called nicks in rsh) - both for commands and general nicks
19
19
  * Syntax highlighting, matching nicks, system commands and valid dirs/files
20
20
  * Tab completions for nicks, system commands, command switches and dirs/files
21
21
  * Tab completion presents matches in a list to pick from
22
- * History with simple editing
23
- * Config file (`.rshrc`) updates on exit
24
- * Set of simple rsh specific commands like `nick`, `nick?`, `history` and `rmhistory`
25
- * rsh specific commands and full set of Ruby commands available via `:command`
26
- * All colors are themeable in `.rshrc`
22
+ * When you start to write a command, rsh will suggest the first match in the history and present that in "toned down" letters - press the arrow right key to accept the suggestion.
23
+ * History with editing, search
24
+ * Config file (.rshrc) updates on exit (with Ctrl-d) or not (with Ctrl-c)
25
+ * Set of simple rsh specific commands like nick, nick?, history and rmhistory
26
+ * rsh specific commands and full set of Ruby commands available via :<command>
27
+ * All colors are themeable in .rshrc (see github link for possibilities)
28
+
29
+ Special functions/integrations:
30
+ * Use `r` to launch rtfm (https://github.com/isene/RTFM) - if you have it installed
31
+ * Use `f` to launch fzf (https://github.com/junegunn/fzf) - if you have it installed
32
+ * Use `=` followed by xrpn commands separated by commas (https://github.com/isene/xrpn)
33
+ * Use `:` followed by a Ruby expression to access the whole world of Ruby
34
+
35
+ Special commands:
36
+ * `:nick 'll = ls -l'` to make a command alias (ll) point to a command (ls -l)
37
+ * `:gnick 'h = /home/me'` to make a general alias (h) point to something (/home/me)
38
+ * `:nick?` will list all command nicks and general nicks (you can edit your nicks in .rshrc)
39
+ * `:history` will list the command history, while `:rmhistory` will delete the history
27
40
 
28
41
  ## Nicks
29
42
  Add command nicks (aliases) with `:nick "some_nick = some_command"`, e.g. `:nick "ls = ls --color"`. Add general nicks that will substitute anything on a command line (not just commands) like this `:gnick "some_gnick = some_command"`, e.g. `:gnick "x = /home/user/somewhere"`. List (g)nicks with `:nick?`. Remove a nick with `:nick "-some_command"`, e.g. `:nick "-ls"` to remove an `ls` nick. Same for gnicks.
data/bin/rsh CHANGED
@@ -2,11 +2,11 @@
2
2
  # encoding: utf-8
3
3
  #
4
4
  # SCRIPT INFO
5
- # Name: RTFM - Ruby Terminal File Manager
5
+ # Name: rsh - Ruby SHell
6
6
  # Language: Pure Ruby, best viewed in VIM
7
7
  # Author: Geir Isene <g@isene.com>
8
8
  # Web_site: http://isene.com/
9
- # Github: https://github.com/isene/RTFM
9
+ # Github: https://github.com/isene/rsh
10
10
  # License: I release all copyright claims. This code is in the public domain.
11
11
  # Permission is granted to use, copy modify, distribute, and sell
12
12
  # this software for any purpose. I make no guarantee about the
@@ -14,7 +14,7 @@
14
14
  # for any damages resulting from its use. Further, I am under no
15
15
  # obligation to maintain or extend this software. It is provided
16
16
  # on an 'as is' basis without any expressed or implied warranty.
17
- @version = "0.8"
17
+ @version = "0.10"
18
18
 
19
19
  # MODULES, CLASSES AND EXTENSIONS
20
20
  class String # Add coloring to strings (with escaping for Readline)
@@ -130,6 +130,68 @@ begin # Initialization
130
130
  end
131
131
 
132
132
  # GENERIC FUNCTIONS
133
+ def firstrun
134
+ @firstrun = <<~FIRSTRUN
135
+ Hello #{@user}, welcome to rsh - the Ruby SHell.
136
+
137
+ rsh does not attempt to compete with the grand old shells like bash and zsh.
138
+ It serves the specific needs and wants of its author. If you like it, then feel free
139
+ to ask for more or different features here: https://github.com/isene/rsh. Features:
140
+
141
+ * Aliases (called nicks in rsh) - both for commands and general nicks
142
+ * Syntax highlighting, matching nicks, system commands and valid dirs/files
143
+ * Tab completions for nicks, system commands, command switches and dirs/files
144
+ * Tab completion presents matches in a list to pick from
145
+ * When you start to write a command, rsh will suggest the first match in the history and
146
+ present that in "toned down" letters - press the arrow right key to accept the suggestion.
147
+ * History with editing, search
148
+ * Config file (.rshrc) updates on exit (with Ctrl-d) or not (with Ctrl-c)
149
+ * Set of simple rsh specific commands like nick, nick?, history and rmhistory
150
+ * rsh specific commands and full set of Ruby commands available via :<command>
151
+ * All colors are themeable in .rshrc (see github link for possibilities)
152
+
153
+ Special functions/integrations:
154
+ * Use `r` to launch rtfm (https://github.com/isene/RTFM) - if you have it installed
155
+ * Use `f` to launch fzf (https://github.com/junegunn/fzf) - if you have it installed
156
+ * Use `=` followed by xrpn commands separated by commas (https://github.com/isene/xrpn)
157
+ * Use `:` followed by a Ruby expression to access the whole world of Ruby
158
+ Special commands:
159
+ * `:nick 'll = ls -l'` to make a command alias (ll) point to a command (ls -l)
160
+ * `:gnick 'h = /home/me'` to make a general alias (h) point to something (/home/me)
161
+ * `:nick?` will list all command nicks and general nicks (you can edit your nicks in .rshrc)
162
+ * `:history` will list the command history, while `:rmhistory` will delete the history
163
+
164
+ Since there is no rsh configuration file (.rshrc), I will help you set it up to suit your needs.
165
+ FIRSTRUN
166
+
167
+ puts @firstrun
168
+ puts "The prompt you see now is the very basic rsh prompt: "
169
+ print "#{@prompt} (press ENTER)"
170
+ STDIN.gets
171
+ puts "I will now change the prompt into something more useful."
172
+ puts "Feel free to amend the prompt in your .rshrc."
173
+ rc = <<~RSHRC
174
+ # PROMPT
175
+ # The numbers in parenthesis are 256 color codes (the '.c()' is a String extention
176
+ # to color text in the terminal. Add '.b' for bold and '.i' for italics.
177
+ @prompt = "\#{@user}@\#{@node}".c(46) + ":".c(255) + " \#{Dir.pwd}/".c(196) + " ".c(7)
178
+
179
+ # THEME
180
+ @c_prompt = 196 # Color for basic prompt
181
+ @c_cmd = 48 # Color for valid command
182
+ @c_nick = 51 # Color for matching nick
183
+ @c_gnick = 87 # Color for matching gnick
184
+ @c_path = 208 # Color for valid path
185
+ @c_switch = 148 # Color for switches/options
186
+ @c_tabselect = 207 # Color for selected tabcompleted item
187
+ @c_taboption = 244 # Color for unselected tabcompleted item
188
+ @c_stamp = 244 # Color for time stamp/command
189
+
190
+ @nick = {"ls"=>"ls --color -F"}
191
+ RSHRC
192
+ File.write(Dir.home+'/.rshrc', rc)
193
+
194
+ end
133
195
  def getchr # Process key presses
134
196
  c = STDIN.getch
135
197
  case c
@@ -177,9 +239,10 @@ def getchr # Process key presses
177
239
  return chr
178
240
  end
179
241
  def getstr # A custom Readline-like function
180
- @stk = 0
242
+ @stk = 0
181
243
  @pos = 0
182
- chr = ""
244
+ right = false
245
+ chr = ""
183
246
  @history.insert(0, "")
184
247
  @history_copy = @history.map(&:clone)
185
248
  while chr != "ENTER" # Keep going with readline until user presses ENTER
@@ -188,6 +251,16 @@ def getstr # A custom Readline-like function
188
251
  print @prompt
189
252
  row, @pos0 = @c.pos
190
253
  print cmd_check(text)
254
+ begin
255
+ cmpl = @history[1..].find {|e| e =~ /^#{Regexp.escape(text)}/}
256
+ if text.length > 2 and cmpl
257
+ print cmpl[text.length..].to_s.c(@c_stamp)
258
+ right = true
259
+ else
260
+ right = false
261
+ end
262
+ rescue
263
+ end
191
264
  @c.col(@pos0 + @pos)
192
265
  chr = getchr
193
266
  return "\n" if chr == "C-G" # Ctrl-G escapes the reasdline
@@ -212,6 +285,10 @@ def getstr # A custom Readline-like function
212
285
  @pos = @history_copy[@stk].length
213
286
  end
214
287
  when 'RIGHT' # Move right on the readline
288
+ if right
289
+ @history_copy[@stk] = cmpl
290
+ @pos = @history_copy[@stk].length
291
+ end
215
292
  @pos += 1 unless @pos >= @history_copy[@stk].length
216
293
  when 'LEFT' # Move left on the readline
217
294
  @pos -= 1 unless @pos <= 0
@@ -321,6 +398,7 @@ def tab_switch(str) # TAB completion for command switches (TAB after "-")
321
398
  end
322
399
  def tab_hist(str)
323
400
  sel = @history.select {|el| el =~ /#{str}/}
401
+ sel.delete("")
324
402
  hist = tabselect(sel, true)
325
403
  @tabsearch = hist if hist
326
404
  @pos = @tabstr.length + @tabsearch.length if hist
@@ -357,7 +435,7 @@ def tabselect(ary, hist=false) # Let user select from the incoming array
357
435
  case chr
358
436
  when 'C-G', 'C-C'
359
437
  @c.clear_screen_down
360
- return ""
438
+ return @tabsearch
361
439
  when 'DOWN'
362
440
  i += 1 unless i > ary.length - 2
363
441
  when 'UP'
@@ -365,7 +443,11 @@ def tabselect(ary, hist=false) # Let user select from the incoming array
365
443
  when 'TAB'
366
444
  chr = "ENTER"
367
445
  when 'BACK'
368
- @tabsearch.chop! unless @tabsearch == ''
446
+ if @tabsearch == ''
447
+ @c.clear_screen_down
448
+ return ""
449
+ end
450
+ @tabsearch.chop!
369
451
  hist ? tab_hist(@tabsearch) : tab_all(@tabsearch)
370
452
  return @tabsearch
371
453
  when /^[[:print:]]$/
@@ -467,7 +549,8 @@ end
467
549
  # INITIAL SETUP
468
550
  begin # Load .rshrc and populate @history
469
551
  trap "SIGINT" do print "\n"; exit end
470
- load(Dir.home+'/.rshrc') if File.exist?(Dir.home+'/.rshrc') # Initial loading - to get history
552
+ firstrun unless File.exist?(Dir.home+'/.rshrc') # Initial loading - to get history
553
+ load(Dir.home+'/.rshrc')
471
554
  @c = Cursor # Initiate @c as Cursor
472
555
  @c.save # Get max row & col
473
556
  @c.row(8000)
@@ -490,17 +573,22 @@ loop do
490
573
  @cmd = "ls" if @cmd == "" # Default to ls when no command is given
491
574
  print "\n"; @c.clear_screen_down
492
575
  if @cmd == "r" # Integration with rtfm (https://github.com/isene/RTFM)
493
- File.write("/tmp/.rshpwd", Dir.pwd)
494
- system("rtfm /tmp/.rshpwd")
495
- Dir.chdir(File.read("/tmp/.rshpwd"))
576
+ t = Time.now
577
+ t0 = t.nsec.to_s
578
+ tf = "/tmp/.rshpwd" + t0
579
+ File.write(tf, Dir.pwd)
580
+ system("rtfm #{tf}")
581
+ Dir.chdir(File.read(tf))
582
+ File.delete(tf)
496
583
  next
497
584
  end
498
585
  @cmd = "echo \"#{@cmd[1...]},prx,off\" | xrpn" if @cmd =~ /^\=/ # Integration with xrpn (https://github.com/isene/xrpn)
499
586
  if @cmd.match(/^\s*:/) # Ruby commands are prefixed with ":"
500
587
  begin
501
588
  eval(@cmd[1..-1])
502
- rescue Exception => err
503
- puts "#{err}"
589
+ rescue StandardError => err
590
+ #rescue Exception => err
591
+ puts "\n#{err}"
504
592
  end
505
593
  else # Execute command
506
594
  @cmd.sub!(/^cd (\S*).*/, '\1')
@@ -526,7 +614,7 @@ loop do
526
614
  end
527
615
  end
528
616
  rescue StandardError => err # Throw error nicely
529
- puts "#{err}"
617
+ puts "\n#{err}"
530
618
  end
531
619
  end
532
620
 
metadata CHANGED
@@ -1,18 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-shell
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.8'
4
+ version: '0.10'
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-06-01 00:00:00.000000000 Z
11
+ date: 2023-06-03 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 and more. In continual development. New in
15
- 0.8: Better error handling.'
15
+ 0.10: Added introduction and creation of .rshrc on first run. Improved rtfm integration.'
16
16
  email: g@isene.com
17
17
  executables:
18
18
  - rsh