ruby-shell 2.3 → 2.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/bin/rsh +49 -20
  3. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 430ac5700dcc8216283045a1d608e0c53982018c39797921b39eb262e8df22bb
4
- data.tar.gz: 8af1ec08df62ec8c79f1f1177ee8629fd388dbf15975a827296ec99894b77fdd
3
+ metadata.gz: 5c5913a47ce444d23c974bea7579acfa7413ea40c127d8fe4f5fe22ff788b0ba
4
+ data.tar.gz: 9dc3737af78ee22e40f630f69e9ed60942edbd94d5bdbc08515b2e7692529fdd
5
5
  SHA512:
6
- metadata.gz: 1182b247e8c1128e748d2c24a3f1066e10be2c0e561b50ed02df1b39cbef77450035fa383f9fdb4da50552de56b867201acb9f6e3e8797034da1c9a437dd96e2
7
- data.tar.gz: 9b461d925debaed83878c368635c4b6a3b1a1543984896501ef43d5441d4c3b67667ffe4aae2cc0958ea8c82c226e7c46834352de90b3be56c98dcb0b17ed549
6
+ metadata.gz: ef49ff226a32103a6a345b5087f0b54776efbd02e4c7435dbb3e4ef2aac439c3221c6f8b4b361a7b38fecdc40b9301bdd6a247c7716353e69b8b8dfdf94dc1b0
7
+ data.tar.gz: 519693833b835995ab7cdd9f7c4c089c611646eb46d195a9f5dc7aa4565190c23f3e5303624169336c43711753173b6197db47f32404b02052031ad626778abb
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 = "2.3"
11
+ @version = "2.6"
12
12
 
13
13
  # MODULES, CLASSES AND EXTENSIONS
14
14
  class String # Add coloring to strings (with escaping for Readline)
@@ -42,6 +42,14 @@ module Cursor # Terminal cursor movement ANSI codes (thanks to https://github.co
42
42
  m = res.match /(?<row>\d+);(?<col>\d+)/
43
43
  return m[:row].to_i, m[:col].to_i
44
44
  end
45
+ def rowget
46
+ row, col = self.pos
47
+ return row
48
+ end
49
+ def colget
50
+ row, col = self.pos
51
+ return col
52
+ end
45
53
  def up(n = nil) # Move cursor up by n
46
54
  print(CSI + "#{(n || 1)}A")
47
55
  end
@@ -118,6 +126,7 @@ begin # Initialization
118
126
  @nick = {} # Initiate alias/nick hash
119
127
  @gnick = {} # Initiate generic/global alias/nick hash
120
128
  @history = [] # Initiate history array
129
+ @exe = []
121
130
  # Paths
122
131
  @user = Etc.getpwuid(Process.euid).name # For use in @prompt
123
132
  @path = ENV["PATH"].split(":") # Get paths
@@ -259,12 +268,16 @@ def getstr # A custom Readline-like function
259
268
  @pos = 0
260
269
  chr = ""
261
270
  @history.unshift("")
271
+ @row0, p = @c.pos
262
272
  while chr != "ENTER" # Keep going with readline until user presses ENTER
263
273
  @ci = nil
264
274
  lift = false
265
275
  right = false
276
+ # The actual printing og the command line
277
+ @c.row(@row0)
266
278
  @c.clear_line
267
279
  print @prompt
280
+ @c.clear_screen_down
268
281
  row, @pos0 = @c.pos
269
282
  #@history[0] = "" if @history[0].nil?
270
283
  print cmd_check(@history[0])
@@ -277,7 +290,15 @@ def getstr # A custom Readline-like function
277
290
  print @ciprompt.c(@c_stamp)
278
291
  right = true
279
292
  end
280
- @c.col(@pos0 + @pos)
293
+ c_col = @pos0 + @pos
294
+ c_row = @row0 + c_col/(@maxcol)
295
+ c_col == 0 ? @c.row(c_row + 1) : @c.row(c_row)
296
+ if c_col.modulo(@maxcol) == 0
297
+ @c.col(c_col)
298
+ @c.row(@c.rowget - 1)
299
+ else
300
+ @c.col(c_col.modulo(@maxcol))
301
+ end
281
302
  chr = getchr
282
303
  case chr
283
304
  when 'C-G', 'C-C'
@@ -310,6 +331,8 @@ def getstr # A custom Readline-like function
310
331
  end
311
332
  lift = false
312
333
  end
334
+ @c.row(@row0)
335
+ @c.clear_screen_down
313
336
  when 'DOWN' # Go down in history
314
337
  if lift
315
338
  @history.unshift("")
@@ -329,6 +352,8 @@ def getstr # A custom Readline-like function
329
352
  @pos = @history[0].length
330
353
  end
331
354
  lift = false
355
+ @c.row(@row0)
356
+ @c.clear_screen_down
332
357
  when 'RIGHT' # Move right on the readline
333
358
  if right
334
359
  if lift
@@ -355,6 +380,7 @@ def getstr # A custom Readline-like function
355
380
  @history[0][@pos] = ""
356
381
  end
357
382
  lift = true
383
+ @c.clear_line_after
358
384
  when 'WBACK' # Delete one word to the left (Ctrl-W)
359
385
  unless @pos == @pos0
360
386
  until @history[0][@pos - 1] == " " or @pos == 0
@@ -367,6 +393,7 @@ def getstr # A custom Readline-like function
367
393
  end
368
394
  end
369
395
  lift = true
396
+ @c.clear_line_after
370
397
  when 'C-Y' # Copy command line to primary selection
371
398
  system("echo -n '#{@history[0]}' | xclip")
372
399
  puts "\n#{Time.now.strftime("%H:%M:%S")}: Copied to primary selection (paste with middle buttoni)".c(@c_stamp)
@@ -405,7 +432,7 @@ def getstr # A custom Readline-like function
405
432
  @pos += 1
406
433
  end
407
434
  end
408
- @c.col(@pos0 + @history[0].length)
435
+ #@c.col(@pos0 + @history[0].length)
409
436
  @c.clear_screen_down
410
437
  end
411
438
  def tab(type)
@@ -434,16 +461,12 @@ def tab(type)
434
461
  hlp = hlp.reject{|h| /-</ =~ h}
435
462
  @tabarray = hlp
436
463
  when "all" # Handle all other tab completions
437
- exe = []
438
- @path.each do |p| # Add all executables in @path
439
- Dir.glob(p).each do |c|
440
- exe.append(File.basename(c)) if File.executable?(c) and not Dir.exist?(c)
441
- end
442
- end
443
- exe.sort!
444
- exe.prepend(*@nick.keys) # Add nicks
445
- exe.prepend(*@gnick.keys) # Add gnicks
446
- compl = exe.select {|s| s =~ Regexp.new(@tabstr)} # Select only that which matches so far
464
+ ex = []
465
+ ex += @exe
466
+ ex.sort!
467
+ ex.prepend(*@nick.keys) # Add nicks
468
+ ex.prepend(*@gnick.keys) # Add gnicks
469
+ compl = ex.select {|s| s =~ Regexp.new(@tabstr)} # Select only that which matches so far
447
470
  fdir = @tabstr + "*"
448
471
  compl.prepend(*Dir.glob(fdir)).map! do |e|
449
472
  if e =~ /(?<!\\) /
@@ -549,18 +572,18 @@ end
549
572
  def cmd_check(str) # Check if each element on the readline matches commands, nicks, paths; color them
550
573
  return if str.nil?
551
574
  str.gsub(/(?:\S'[^']*'|[^ '])+/) do |el|
552
- if @nick.include?(el)
575
+ if @exe.include?(el)
576
+ el.c(@c_cmd)
577
+ elsif el == "cd"
578
+ el.c(@c_cmd)
579
+ elsif File.exist?(el.gsub("'", ""))
580
+ el.c(@c_path)
581
+ elsif @nick.include?(el)
553
582
  el.c(@c_nick)
554
583
  elsif el == "r" or el == "f"
555
584
  el.c(@c_nick)
556
585
  elsif @gnick.include?(el)
557
586
  el.c(@c_gnick)
558
- elsif File.exist?(el.gsub("'", ""))
559
- el.c(@c_path)
560
- elsif system "which #{el}", %i[out err] => File::NULL
561
- el.c(@c_cmd)
562
- elsif el == "cd"
563
- el.c(@c_cmd)
564
587
  elsif el[0] == "-"
565
588
  el.c(@c_switch)
566
589
  else
@@ -669,6 +692,12 @@ loop do
669
692
  @prompt.gsub!(/#{Dir.home}/, '~') # Simplify path in prompt
670
693
  system("printf \"\033]0;rsh: #{Dir.pwd}\007\"") # Set Window title to path
671
694
  @history[0] = "" unless @history[0]
695
+ @exe = []
696
+ @path.each do |p| # Add all executables in @path
697
+ Dir.glob(p).each do |c|
698
+ @exe.append(File.basename(c)) if File.executable?(c) and not Dir.exist?(c)
699
+ end
700
+ end
672
701
  getstr # Main work is here
673
702
  @cmd = @history[0]
674
703
  @dirs.unshift(Dir.pwd)
metadata CHANGED
@@ -1,19 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-shell
3
3
  version: !ruby/object:Gem::Version
4
- version: '2.3'
4
+ version: '2.6'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Geir Isene
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-24 00:00:00.000000000 Z
11
+ date: 2024-10-30 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. In
15
15
  continual development. New in 2.0: Full rewrite of tab completion engine. Lots of
16
- other bug fixes. 2.3: Better history search.'
16
+ other bug fixes. 2.6: Handling line longer than terminal width.'
17
17
  email: g@isene.com
18
18
  executables:
19
19
  - rsh