reline 0.1.6 → 0.2.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/lib/reline.rb +23 -5
- data/lib/reline/ansi.rb +44 -3
- data/lib/reline/config.rb +3 -1
- data/lib/reline/general_io.rb +15 -1
- data/lib/reline/key_actor/emacs.rb +1 -1
- data/lib/reline/key_actor/vi_command.rb +2 -2
- data/lib/reline/kill_ring.rb +12 -0
- data/lib/reline/line_editor.rb +552 -232
- data/lib/reline/line_editor.rb.orig +2606 -0
- data/lib/reline/sibori.rb +14 -0
- data/lib/reline/unicode.rb +63 -33
- data/lib/reline/unicode/east_asian_width.rb +13 -13
- data/lib/reline/version.rb +1 -1
- data/lib/reline/windows.rb +8 -1
- metadata +3 -2
    
        data/lib/reline/sibori.rb
    CHANGED
    
    | @@ -1,5 +1,19 @@ | |
| 1 1 | 
             
            require 'reline/unicode'
         | 
| 2 2 |  | 
| 3 | 
            +
            =begin
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              \       |
         | 
| 6 | 
            +
               \      | <--- whipped cream
         | 
| 7 | 
            +
                \     |
         | 
| 8 | 
            +
                 \    |
         | 
| 9 | 
            +
                  \-~~|
         | 
| 10 | 
            +
                   \  | <--- shibori kutigane (piping nozzle in Japanese)
         | 
| 11 | 
            +
                    \Ml
         | 
| 12 | 
            +
                     (\    __ __
         | 
| 13 | 
            +
                     ( \--(  )  )
         | 
| 14 | 
            +
                      (__(__)__)  <--- compressed whipped cream
         | 
| 15 | 
            +
            =end
         | 
| 16 | 
            +
             | 
| 3 17 | 
             
            class Sibori
         | 
| 4 18 | 
             
              attr_writer :output
         | 
| 5 19 |  | 
    
        data/lib/reline/unicode.rb
    CHANGED
    
    | @@ -35,11 +35,16 @@ class Reline::Unicode | |
| 35 35 | 
             
              }
         | 
| 36 36 | 
             
              EscapedChars = EscapedPairs.keys.map(&:chr)
         | 
| 37 37 |  | 
| 38 | 
            -
              CSI_REGEXP = /\e\[[\d;]*[ABCDEFGHJKSTfminsuhl]/
         | 
| 39 | 
            -
              OSC_REGEXP = /\e\]\d+(?:;[^;]+)*\a/
         | 
| 40 38 | 
             
              NON_PRINTING_START = "\1"
         | 
| 41 39 | 
             
              NON_PRINTING_END = "\2"
         | 
| 42 | 
            -
               | 
| 40 | 
            +
              CSI_REGEXP = /\e\[[\d;]*[ABCDEFGHJKSTfminsuhl]/
         | 
| 41 | 
            +
              OSC_REGEXP = /\e\]\d+(?:;[^;]+)*\a/
         | 
| 42 | 
            +
              WIDTH_SCANNER = /\G(?:(#{NON_PRINTING_START})|(#{NON_PRINTING_END})|(#{CSI_REGEXP})|(#{OSC_REGEXP})|(\X))/o
         | 
| 43 | 
            +
              NON_PRINTING_START_INDEX = 0
         | 
| 44 | 
            +
              NON_PRINTING_END_INDEX = 1
         | 
| 45 | 
            +
              CSI_REGEXP_INDEX = 2
         | 
| 46 | 
            +
              OSC_REGEXP_INDEX = 3
         | 
| 47 | 
            +
              GRAPHEME_CLUSTER_INDEX = 4
         | 
| 43 48 |  | 
| 44 49 | 
             
              def self.get_mbchar_byte_size_by_first_char(c)
         | 
| 45 50 | 
             
                # Checks UTF-8 character byte size
         | 
| @@ -72,20 +77,42 @@ class Reline::Unicode | |
| 72 77 | 
             
                }.join
         | 
| 73 78 | 
             
              end
         | 
| 74 79 |  | 
| 80 | 
            +
              require 'reline/unicode/east_asian_width'
         | 
| 81 | 
            +
             | 
| 82 | 
            +
              MBCharWidthRE = /
         | 
| 83 | 
            +
                (?<width_2_1>
         | 
| 84 | 
            +
                  [#{ EscapedChars.map {|c| "\\x%02x" % c.ord }.join }] (?# ^ + char, such as ^M, ^H, ^[, ...)
         | 
| 85 | 
            +
                )
         | 
| 86 | 
            +
              | (?<width_3>^\u{2E3B}) (?# THREE-EM DASH)
         | 
| 87 | 
            +
              | (?<width_0>^\p{M})
         | 
| 88 | 
            +
              | (?<width_2_2>
         | 
| 89 | 
            +
                  #{ EastAsianWidth::TYPE_F }
         | 
| 90 | 
            +
                | #{ EastAsianWidth::TYPE_W }
         | 
| 91 | 
            +
                )
         | 
| 92 | 
            +
              | (?<width_1>
         | 
| 93 | 
            +
                  #{ EastAsianWidth::TYPE_H }
         | 
| 94 | 
            +
                | #{ EastAsianWidth::TYPE_NA }
         | 
| 95 | 
            +
                | #{ EastAsianWidth::TYPE_N }
         | 
| 96 | 
            +
                )
         | 
| 97 | 
            +
              | (?<ambiguous_width>
         | 
| 98 | 
            +
                  #{EastAsianWidth::TYPE_A}
         | 
| 99 | 
            +
                )
         | 
| 100 | 
            +
              /x
         | 
| 101 | 
            +
             | 
| 75 102 | 
             
              def self.get_mbchar_width(mbchar)
         | 
| 76 | 
            -
                 | 
| 77 | 
            -
                 | 
| 78 | 
            -
                  2
         | 
| 79 | 
            -
                 | 
| 80 | 
            -
                   | 
| 81 | 
            -
                 | 
| 82 | 
            -
             | 
| 83 | 
            -
                 | 
| 84 | 
            -
             | 
| 85 | 
            -
                when  | 
| 86 | 
            -
             | 
| 87 | 
            -
                when  | 
| 88 | 
            -
             | 
| 103 | 
            +
                ord = mbchar.ord
         | 
| 104 | 
            +
                if (0x00 <= ord and ord <= 0x1F)
         | 
| 105 | 
            +
                  return 2
         | 
| 106 | 
            +
                elsif (0x20 <= ord and ord <= 0x7E)
         | 
| 107 | 
            +
                  return 1
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
                m = mbchar.encode(Encoding::UTF_8).match(MBCharWidthRE)
         | 
| 110 | 
            +
                case
         | 
| 111 | 
            +
                when m[:width_2_1], m[:width_2_2] then 2
         | 
| 112 | 
            +
                when m[:width_3] then 3
         | 
| 113 | 
            +
                when m[:width_0] then 0
         | 
| 114 | 
            +
                when m[:width_1] then 1
         | 
| 115 | 
            +
                when m[:ambiguous_width] then Reline.ambiguous_width
         | 
| 89 116 | 
             
                else
         | 
| 90 117 | 
             
                  nil
         | 
| 91 118 | 
             
                end
         | 
| @@ -97,13 +124,14 @@ class Reline::Unicode | |
| 97 124 | 
             
                  rest = str.encode(Encoding::UTF_8)
         | 
| 98 125 | 
             
                  in_zero_width = false
         | 
| 99 126 | 
             
                  rest.scan(WIDTH_SCANNER) do |gc|
         | 
| 100 | 
            -
                    case | 
| 101 | 
            -
                    when  | 
| 127 | 
            +
                    case
         | 
| 128 | 
            +
                    when gc[NON_PRINTING_START_INDEX]
         | 
| 102 129 | 
             
                      in_zero_width = true
         | 
| 103 | 
            -
                    when  | 
| 130 | 
            +
                    when gc[NON_PRINTING_END_INDEX]
         | 
| 104 131 | 
             
                      in_zero_width = false
         | 
| 105 | 
            -
                    when  | 
| 106 | 
            -
                     | 
| 132 | 
            +
                    when gc[CSI_REGEXP_INDEX], gc[OSC_REGEXP_INDEX]
         | 
| 133 | 
            +
                    when gc[GRAPHEME_CLUSTER_INDEX]
         | 
| 134 | 
            +
                      gc = gc[GRAPHEME_CLUSTER_INDEX]
         | 
| 107 135 | 
             
                      unless in_zero_width
         | 
| 108 136 | 
             
                        width += get_mbchar_width(gc)
         | 
| 109 137 | 
             
                      end
         | 
| @@ -124,14 +152,17 @@ class Reline::Unicode | |
| 124 152 | 
             
                rest = str.encode(Encoding::UTF_8)
         | 
| 125 153 | 
             
                in_zero_width = false
         | 
| 126 154 | 
             
                rest.scan(WIDTH_SCANNER) do |gc|
         | 
| 127 | 
            -
                  case | 
| 128 | 
            -
                  when  | 
| 155 | 
            +
                  case
         | 
| 156 | 
            +
                  when gc[NON_PRINTING_START_INDEX]
         | 
| 129 157 | 
             
                    in_zero_width = true
         | 
| 130 | 
            -
                  when  | 
| 158 | 
            +
                  when gc[NON_PRINTING_END_INDEX]
         | 
| 131 159 | 
             
                    in_zero_width = false
         | 
| 132 | 
            -
                  when  | 
| 133 | 
            -
                    lines.last << gc
         | 
| 134 | 
            -
                   | 
| 160 | 
            +
                  when gc[CSI_REGEXP_INDEX]
         | 
| 161 | 
            +
                    lines.last << gc[CSI_REGEXP_INDEX]
         | 
| 162 | 
            +
                  when gc[OSC_REGEXP_INDEX]
         | 
| 163 | 
            +
                    lines.last << gc[OSC_REGEXP_INDEX]
         | 
| 164 | 
            +
                  when gc[GRAPHEME_CLUSTER_INDEX]
         | 
| 165 | 
            +
                    gc = gc[GRAPHEME_CLUSTER_INDEX]
         | 
| 135 166 | 
             
                    unless in_zero_width
         | 
| 136 167 | 
             
                      mbchar_width = get_mbchar_width(gc)
         | 
| 137 168 | 
             
                      if (width += mbchar_width) > max_width
         | 
| @@ -427,8 +458,8 @@ class Reline::Unicode | |
| 427 458 | 
             
                [byte_size, width]
         | 
| 428 459 | 
             
              end
         | 
| 429 460 |  | 
| 430 | 
            -
              def self.vi_forward_word(line, byte_pointer)
         | 
| 431 | 
            -
                if  | 
| 461 | 
            +
              def self.vi_forward_word(line, byte_pointer, drop_terminate_spaces = false)
         | 
| 462 | 
            +
                if line.bytesize > byte_pointer
         | 
| 432 463 | 
             
                  size = get_next_mbchar_size(line, byte_pointer)
         | 
| 433 464 | 
             
                  mbchar = line.byteslice(byte_pointer, size)
         | 
| 434 465 | 
             
                  if mbchar =~ /\w/
         | 
| @@ -443,7 +474,7 @@ class Reline::Unicode | |
| 443 474 | 
             
                else
         | 
| 444 475 | 
             
                  return [0, 0]
         | 
| 445 476 | 
             
                end
         | 
| 446 | 
            -
                while  | 
| 477 | 
            +
                while line.bytesize > (byte_pointer + byte_size)
         | 
| 447 478 | 
             
                  size = get_next_mbchar_size(line, byte_pointer + byte_size)
         | 
| 448 479 | 
             
                  mbchar = line.byteslice(byte_pointer + byte_size, size)
         | 
| 449 480 | 
             
                  case started_by
         | 
| @@ -457,7 +488,8 @@ class Reline::Unicode | |
| 457 488 | 
             
                  width += get_mbchar_width(mbchar)
         | 
| 458 489 | 
             
                  byte_size += size
         | 
| 459 490 | 
             
                end
         | 
| 460 | 
            -
                 | 
| 491 | 
            +
                return [byte_size, width] if drop_terminate_spaces
         | 
| 492 | 
            +
                while line.bytesize > (byte_pointer + byte_size)
         | 
| 461 493 | 
             
                  size = get_next_mbchar_size(line, byte_pointer + byte_size)
         | 
| 462 494 | 
             
                  mbchar = line.byteslice(byte_pointer + byte_size, size)
         | 
| 463 495 | 
             
                  break if mbchar =~ /\S/
         | 
| @@ -591,5 +623,3 @@ class Reline::Unicode | |
| 591 623 | 
             
                [byte_size, width]
         | 
| 592 624 | 
             
              end
         | 
| 593 625 | 
             
            end
         | 
| 594 | 
            -
             | 
| 595 | 
            -
            require 'reline/unicode/east_asian_width'
         | 
| @@ -1,16 +1,16 @@ | |
| 1 1 | 
             
            class Reline::Unicode::EastAsianWidth
         | 
| 2 2 | 
             
              # This is based on EastAsianWidth.txt
         | 
| 3 | 
            -
              #  | 
| 3 | 
            +
              # EastAsianWidth.txt
         | 
| 4 4 |  | 
| 5 5 | 
             
              # Fullwidth
         | 
| 6 | 
            -
              TYPE_F = /^ | 
| 6 | 
            +
              TYPE_F = /^[#{ %W(
         | 
| 7 7 | 
             
                \u{3000}
         | 
| 8 8 | 
             
                \u{FF01}-\u{FF60}
         | 
| 9 9 | 
             
                \u{FFE0}-\u{FFE6}
         | 
| 10 | 
            -
              ).join }] | 
| 10 | 
            +
              ).join }]/
         | 
| 11 11 |  | 
| 12 12 | 
             
              # Halfwidth
         | 
| 13 | 
            -
              TYPE_H = /^ | 
| 13 | 
            +
              TYPE_H = /^[#{ %W(
         | 
| 14 14 | 
             
                \u{20A9}
         | 
| 15 15 | 
             
                \u{FF61}-\u{FFBE}
         | 
| 16 16 | 
             
                \u{FFC2}-\u{FFC7}
         | 
| @@ -18,10 +18,10 @@ class Reline::Unicode::EastAsianWidth | |
| 18 18 | 
             
                \u{FFD2}-\u{FFD7}
         | 
| 19 19 | 
             
                \u{FFDA}-\u{FFDC}
         | 
| 20 20 | 
             
                \u{FFE8}-\u{FFEE}
         | 
| 21 | 
            -
              ).join }] | 
| 21 | 
            +
              ).join }]/
         | 
| 22 22 |  | 
| 23 23 | 
             
              # Wide
         | 
| 24 | 
            -
              TYPE_W = /^ | 
| 24 | 
            +
              TYPE_W = /^[#{ %W(
         | 
| 25 25 | 
             
                \u{1100}-\u{115F}
         | 
| 26 26 | 
             
                \u{231A}-\u{231B}
         | 
| 27 27 | 
             
                \u{2329}-\u{232A}
         | 
| @@ -136,10 +136,10 @@ class Reline::Unicode::EastAsianWidth | |
| 136 136 | 
             
                \u{1FAD0}-\u{1FAD6}
         | 
| 137 137 | 
             
                \u{20000}-\u{2FFFD}
         | 
| 138 138 | 
             
                \u{30000}-\u{3FFFD}
         | 
| 139 | 
            -
              ).join }] | 
| 139 | 
            +
              ).join }]/
         | 
| 140 140 |  | 
| 141 141 | 
             
              # Narrow
         | 
| 142 | 
            -
              TYPE_NA = /^ | 
| 142 | 
            +
              TYPE_NA = /^[#{ %W(
         | 
| 143 143 | 
             
                \u{0020}-\u{007E}
         | 
| 144 144 | 
             
                \u{00A2}-\u{00A3}
         | 
| 145 145 | 
             
                \u{00A5}-\u{00A6}
         | 
| @@ -147,10 +147,10 @@ class Reline::Unicode::EastAsianWidth | |
| 147 147 | 
             
                \u{00AF}
         | 
| 148 148 | 
             
                \u{27E6}-\u{27ED}
         | 
| 149 149 | 
             
                \u{2985}-\u{2986}
         | 
| 150 | 
            -
              ).join }] | 
| 150 | 
            +
              ).join }]/
         | 
| 151 151 |  | 
| 152 152 | 
             
              # Ambiguous
         | 
| 153 | 
            -
              TYPE_A = /^ | 
| 153 | 
            +
              TYPE_A = /^[#{ %W(
         | 
| 154 154 | 
             
                \u{00A1}
         | 
| 155 155 | 
             
                \u{00A4}
         | 
| 156 156 | 
             
                \u{00A7}-\u{00A8}
         | 
| @@ -330,10 +330,10 @@ class Reline::Unicode::EastAsianWidth | |
| 330 330 | 
             
                \u{E0100}-\u{E01EF}
         | 
| 331 331 | 
             
                \u{F0000}-\u{FFFFD}
         | 
| 332 332 | 
             
                \u{100000}-\u{10FFFD}
         | 
| 333 | 
            -
              ).join }] | 
| 333 | 
            +
              ).join }]/
         | 
| 334 334 |  | 
| 335 335 | 
             
              # Neutral
         | 
| 336 | 
            -
              TYPE_N = /^ | 
| 336 | 
            +
              TYPE_N = /^[#{ %W(
         | 
| 337 337 | 
             
                \u{0000}-\u{001F}
         | 
| 338 338 | 
             
                \u{007F}-\u{00A0}
         | 
| 339 339 | 
             
                \u{00A9}
         | 
| @@ -1160,5 +1160,5 @@ class Reline::Unicode::EastAsianWidth | |
| 1160 1160 | 
             
                \u{1FBF0}-\u{1FBF9}
         | 
| 1161 1161 | 
             
                \u{E0001}
         | 
| 1162 1162 | 
             
                \u{E0020}-\u{E007F}
         | 
| 1163 | 
            -
              ).join }] | 
| 1163 | 
            +
              ).join }]/
         | 
| 1164 1164 | 
             
            end
         | 
    
        data/lib/reline/version.rb
    CHANGED
    
    
    
        data/lib/reline/windows.rb
    CHANGED
    
    | @@ -233,7 +233,9 @@ class Reline::Windows | |
| 233 233 |  | 
| 234 234 | 
             
              def self.move_cursor_up(val)
         | 
| 235 235 | 
             
                if val > 0
         | 
| 236 | 
            -
                   | 
| 236 | 
            +
                  y = cursor_pos.y - val
         | 
| 237 | 
            +
                  y = 0 if y < 0
         | 
| 238 | 
            +
                  @@SetConsoleCursorPosition.call(@@hConsoleHandle, y * 65536 + cursor_pos.x)
         | 
| 237 239 | 
             
                elsif val < 0
         | 
| 238 240 | 
             
                  move_cursor_down(-val)
         | 
| 239 241 | 
             
                end
         | 
| @@ -241,6 +243,9 @@ class Reline::Windows | |
| 241 243 |  | 
| 242 244 | 
             
              def self.move_cursor_down(val)
         | 
| 243 245 | 
             
                if val > 0
         | 
| 246 | 
            +
                  screen_height = get_screen_size.first
         | 
| 247 | 
            +
                  y = cursor_pos.y + val
         | 
| 248 | 
            +
                  y = screen_height - 1 if y > (screen_height - 1)
         | 
| 244 249 | 
             
                  @@SetConsoleCursorPosition.call(@@hConsoleHandle, (cursor_pos.y + val) * 65536 + cursor_pos.x)
         | 
| 245 250 | 
             
                elsif val < 0
         | 
| 246 251 | 
             
                  move_cursor_up(-val)
         | 
| @@ -257,6 +262,8 @@ class Reline::Windows | |
| 257 262 |  | 
| 258 263 | 
             
              def self.scroll_down(val)
         | 
| 259 264 | 
             
                return if val.zero?
         | 
| 265 | 
            +
                screen_height = get_screen_size.first
         | 
| 266 | 
            +
                val = screen_height - 1 if val > (screen_height - 1)
         | 
| 260 267 | 
             
                scroll_rectangle = [0, val, get_screen_size.last, get_screen_size.first].pack('s4')
         | 
| 261 268 | 
             
                destination_origin = 0 # y * 65536 + x
         | 
| 262 269 | 
             
                fill = [' '.ord, 0].pack('SS')
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: reline
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - aycabta
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2020- | 
| 11 | 
            +
            date: 2020-12-24 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: io-console
         | 
| @@ -103,6 +103,7 @@ files: | |
| 103 103 | 
             
            - lib/reline/key_stroke.rb
         | 
| 104 104 | 
             
            - lib/reline/kill_ring.rb
         | 
| 105 105 | 
             
            - lib/reline/line_editor.rb
         | 
| 106 | 
            +
            - lib/reline/line_editor.rb.orig
         | 
| 106 107 | 
             
            - lib/reline/sibori.rb
         | 
| 107 108 | 
             
            - lib/reline/unicode.rb
         | 
| 108 109 | 
             
            - lib/reline/unicode/east_asian_width.rb
         |