diff options
author | tomoya ishida <[email protected]> | 2024-11-15 08:14:14 +0900 |
---|---|---|
committer | git <[email protected]> | 2024-11-14 23:14:18 +0000 |
commit | 8f3a6ebcf4cc585c60687f3d9941bf9bcd7eb9b6 (patch) | |
tree | 8b6aa1f259871cba785c544cada920fe51e83aad /lib | |
parent | 4074c6b427ff53fc9e3dbffcd2792e5dd8b3a7ef (diff) |
[ruby/reline] Drop loading terminfo, remove fiddle dependency in
non-windows environment.
(https://github.com/ruby/reline/pull/769)
Reline works perfectly in most major terminal emulators without terminfo.
In minor/old terminal emulator, we used to get key bindings from terminfo, but I think it is not used so much.
https://github.com/ruby/reline/commit/3ceba3bff7
Diffstat (limited to 'lib')
-rw-r--r-- | lib/reline.rb | 1 | ||||
-rw-r--r-- | lib/reline/io/ansi.rb | 49 | ||||
-rw-r--r-- | lib/reline/terminfo.rb | 158 |
3 files changed, 4 insertions, 204 deletions
diff --git a/lib/reline.rb b/lib/reline.rb index ae522d4b38..0770204926 100644 --- a/lib/reline.rb +++ b/lib/reline.rb @@ -6,7 +6,6 @@ require 'reline/key_actor' require 'reline/key_stroke' require 'reline/line_editor' require 'reline/history' -require 'reline/terminfo' require 'reline/io' require 'reline/face' require 'rbconfig' diff --git a/lib/reline/io/ansi.rb b/lib/reline/io/ansi.rb index a14ae18e2a..4fd0023259 100644 --- a/lib/reline/io/ansi.rb +++ b/lib/reline/io/ansi.rb @@ -29,10 +29,6 @@ class Reline::ANSI < Reline::IO 'H' => [:ed_move_to_beg, {}], } - if Reline::Terminfo.enabled? - Reline::Terminfo.setupterm(0, 2) - end - def initialize @input = STDIN @output = STDOUT @@ -44,14 +40,10 @@ class Reline::ANSI < Reline::IO @input.external_encoding || Encoding.default_external end - def set_default_key_bindings(config, allow_terminfo: true) + def set_default_key_bindings(config) set_bracketed_paste_key_bindings(config) set_default_key_bindings_ansi_cursor(config) - if allow_terminfo && Reline::Terminfo.enabled? - set_default_key_bindings_terminfo(config) - else - set_default_key_bindings_comprehensive_list(config) - end + set_default_key_bindings_comprehensive_list(config) { [27, 91, 90] => :completion_journey_up, # S-Tab }.each_pair do |key, func| @@ -98,23 +90,6 @@ class Reline::ANSI < Reline::IO end end - def set_default_key_bindings_terminfo(config) - key_bindings = CAPNAME_KEY_BINDINGS.map do |capname, key_binding| - begin - key_code = Reline::Terminfo.tigetstr(capname) - [ key_code.bytes, key_binding ] - rescue Reline::Terminfo::TerminfoError - # capname is undefined - end - end.compact.to_h - - key_bindings.each_pair do |key, func| - config.add_default_key_binding_by_keymap(:emacs, key, func) - config.add_default_key_binding_by_keymap(:vi_insert, key, func) - config.add_default_key_binding_by_keymap(:vi_command, key, func) - end - end - def set_default_key_bindings_comprehensive_list(config) { # xterm @@ -281,27 +256,11 @@ class Reline::ANSI < Reline::IO end def hide_cursor - seq = "\e[?25l" - if Reline::Terminfo.enabled? && Reline::Terminfo.term_supported? - begin - seq = Reline::Terminfo.tigetstr('civis') - rescue Reline::Terminfo::TerminfoError - # civis is undefined - end - end - @output.write seq + @output.write "\e[?25l" end def show_cursor - seq = "\e[?25h" - if Reline::Terminfo.enabled? && Reline::Terminfo.term_supported? - begin - seq = Reline::Terminfo.tigetstr('cnorm') - rescue Reline::Terminfo::TerminfoError - # cnorm is undefined - end - end - @output.write seq + @output.write "\e[?25h" end def erase_after_cursor diff --git a/lib/reline/terminfo.rb b/lib/reline/terminfo.rb deleted file mode 100644 index c2b1f681b4..0000000000 --- a/lib/reline/terminfo.rb +++ /dev/null @@ -1,158 +0,0 @@ -begin - # Ignore warning `Add fiddle to your Gemfile or gemspec` in Ruby 3.4. - # terminfo.rb and ansi.rb supports fiddle unavailable environment. - verbose, $VERBOSE = $VERBOSE, nil - require 'fiddle' - require 'fiddle/import' -rescue LoadError - module Reline::Terminfo - def self.curses_dl - false - end - end -ensure - $VERBOSE = verbose -end - -module Reline::Terminfo - extend Fiddle::Importer - - class TerminfoError < StandardError; end - - def self.curses_dl_files - case RUBY_PLATFORM - when /mingw/, /mswin/ - # aren't supported - [] - when /cygwin/ - %w[cygncursesw-10.dll cygncurses-10.dll] - when /darwin/ - %w[libncursesw.dylib libcursesw.dylib libncurses.dylib libcurses.dylib] - else - %w[libncursesw.so libcursesw.so libncurses.so libcurses.so] - end - end - - @curses_dl = false - def self.curses_dl - return @curses_dl unless @curses_dl == false - if Fiddle.const_defined?(:TYPE_VARIADIC) - curses_dl_files.each do |curses_name| - result = Fiddle::Handle.new(curses_name) - rescue Fiddle::DLError - next - else - @curses_dl = result - break - end - end - @curses_dl = nil if @curses_dl == false - @curses_dl - end -end if not Reline.const_defined?(:Terminfo) or not Reline::Terminfo.respond_to?(:curses_dl) - -module Reline::Terminfo - dlload curses_dl - #extern 'int setupterm(char *term, int fildes, int *errret)' - @setupterm = Fiddle::Function.new(curses_dl['setupterm'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT, Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT) - #extern 'char *tigetstr(char *capname)' - @tigetstr = Fiddle::Function.new(curses_dl['tigetstr'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOIDP) - begin - #extern 'char *tiparm(const char *str, ...)' - @tiparm = Fiddle::Function.new(curses_dl['tiparm'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VARIADIC], Fiddle::TYPE_VOIDP) - rescue Fiddle::DLError - # OpenBSD lacks tiparm - #extern 'char *tparm(const char *str, ...)' - @tiparm = Fiddle::Function.new(curses_dl['tparm'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VARIADIC], Fiddle::TYPE_VOIDP) - end - begin - #extern 'int tigetflag(char *str)' - @tigetflag = Fiddle::Function.new(curses_dl['tigetflag'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT) - rescue Fiddle::DLError - # OpenBSD lacks tigetflag - #extern 'int tgetflag(char *str)' - @tigetflag = Fiddle::Function.new(curses_dl['tgetflag'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT) - end - begin - #extern 'int tigetnum(char *str)' - @tigetnum = Fiddle::Function.new(curses_dl['tigetnum'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT) - rescue Fiddle::DLError - # OpenBSD lacks tigetnum - #extern 'int tgetnum(char *str)' - @tigetnum = Fiddle::Function.new(curses_dl['tgetnum'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT) - end - - def self.setupterm(term, fildes) - errret_int = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INT, Fiddle::RUBY_FREE) - ret = @setupterm.(term, fildes, errret_int) - case ret - when 0 # OK - @term_supported = true - when -1 # ERR - @term_supported = false - end - end - - class StringWithTiparm < String - def tiparm(*args) # for method chain - Reline::Terminfo.tiparm(self, *args) - end - end - - def self.tigetstr(capname) - raise TerminfoError, "capname is not String: #{capname.inspect}" unless capname.is_a?(String) - capability = @tigetstr.(capname) - case capability.to_i - when 0, -1 - raise TerminfoError, "can't find capability: #{capname}" - end - StringWithTiparm.new(capability.to_s) - end - - def self.tiparm(str, *args) - new_args = [] - args.each do |a| - new_args << Fiddle::TYPE_INT << a - end - @tiparm.(str, *new_args).to_s - end - - def self.tigetflag(capname) - raise TerminfoError, "capname is not String: #{capname.inspect}" unless capname.is_a?(String) - flag = @tigetflag.(capname).to_i - case flag - when -1 - raise TerminfoError, "not boolean capability: #{capname}" - when 0 - raise TerminfoError, "can't find capability: #{capname}" - end - flag - end - - def self.tigetnum(capname) - raise TerminfoError, "capname is not String: #{capname.inspect}" unless capname.is_a?(String) - num = @tigetnum.(capname).to_i - case num - when -2 - raise TerminfoError, "not numeric capability: #{capname}" - when -1 - raise TerminfoError, "can't find capability: #{capname}" - end - num - end - - # NOTE: This means Fiddle and curses are enabled. - def self.enabled? - true - end - - def self.term_supported? - @term_supported - end -end if Reline::Terminfo.curses_dl - -module Reline::Terminfo - def self.enabled? - false - end -end unless Reline::Terminfo.curses_dl |