mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
[ruby/reline] The config file must accept any character encoding
In Japan, so many programmers used EUC-JP to write text files that contain Japanese. Many .inputrc files which contain EUC-JP are still being copied and used. This commit supports the whole encoding of what user set including UTF-8. ref. https://github.com/ruby/reline/pull/280 https://github.com/ruby/reline/commit/0b45022e16
This commit is contained in:
parent
c59bbd86a6
commit
b0cc46b484
6 changed files with 39 additions and 9 deletions
|
@ -158,6 +158,9 @@ class Reline::Config
|
||||||
end
|
end
|
||||||
|
|
||||||
def read_lines(lines, file = nil)
|
def read_lines(lines, file = nil)
|
||||||
|
if lines.first.encoding != Reline.encoding_system_needs
|
||||||
|
lines = lines.map { |l| l.encode(Reline.encoding_system_needs) }
|
||||||
|
end
|
||||||
conditions = [@skip_section, @if_stack]
|
conditions = [@skip_section, @if_stack]
|
||||||
@skip_section = nil
|
@skip_section = nil
|
||||||
@if_stack = []
|
@if_stack = []
|
||||||
|
@ -293,7 +296,7 @@ class Reline::Config
|
||||||
|
|
||||||
def retrieve_string(str)
|
def retrieve_string(str)
|
||||||
str = $1 if str =~ /\A"(.*)"\z/
|
str = $1 if str =~ /\A"(.*)"\z/
|
||||||
parse_keyseq(str).map { |c| c.chr(Reline::IOGate.encoding) }.join
|
parse_keyseq(str).map { |c| c.chr(Reline.encoding_system_needs) }.join
|
||||||
end
|
end
|
||||||
|
|
||||||
def bind_key(key, func_name)
|
def bind_key(key, func_name)
|
||||||
|
|
|
@ -1,12 +1,19 @@
|
||||||
require 'timeout'
|
require 'timeout'
|
||||||
|
|
||||||
class Reline::GeneralIO
|
class Reline::GeneralIO
|
||||||
def self.reset
|
def self.reset(encoding: nil)
|
||||||
@@pasting = false
|
@@pasting = false
|
||||||
|
@@encoding = encoding
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.encoding
|
def self.encoding
|
||||||
RUBY_PLATFORM =~ /mswin|mingw/ ? Encoding::UTF_8 : Encoding::default_external
|
if @@encoding
|
||||||
|
@@encoding
|
||||||
|
elsif RUBY_PLATFORM =~ /mswin|mingw/
|
||||||
|
Encoding::UTF_8
|
||||||
|
else
|
||||||
|
Encoding::default_external
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.win?
|
def self.win?
|
||||||
|
|
|
@ -7,7 +7,8 @@ module Reline
|
||||||
def test_mode
|
def test_mode
|
||||||
remove_const('IOGate') if const_defined?('IOGate')
|
remove_const('IOGate') if const_defined?('IOGate')
|
||||||
const_set('IOGate', Reline::GeneralIO)
|
const_set('IOGate', Reline::GeneralIO)
|
||||||
Reline::GeneralIO.reset
|
encoding = (RELINE_TEST_ENCODING rescue nil)
|
||||||
|
Reline::GeneralIO.reset(encoding: encoding)
|
||||||
send(:core).config.instance_variable_set(:@test_mode, true)
|
send(:core).config.instance_variable_set(:@test_mode, true)
|
||||||
send(:core).config.reset
|
send(:core).config.reset
|
||||||
end
|
end
|
||||||
|
|
|
@ -286,14 +286,25 @@ class Reline::Config::Test < Reline::TestCase
|
||||||
ENV['INPUTRC'] = inputrc_backup
|
ENV['INPUTRC'] = inputrc_backup
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_inputrc_with_utf
|
def test_inputrc_with_utf8
|
||||||
|
# This file is encoded by UTF-8 so this heredoc string is also UTF-8.
|
||||||
@config.read_lines(<<~'LINES'.lines)
|
@config.read_lines(<<~'LINES'.lines)
|
||||||
set editing-mode vi
|
set editing-mode vi
|
||||||
set vi-cmd-mode-string 🍸
|
set vi-cmd-mode-string 🍸
|
||||||
set vi-ins-mode-string 🍶
|
set vi-ins-mode-string 🍶
|
||||||
LINES
|
LINES
|
||||||
assert_equal @config.vi_cmd_mode_string, "🍸"
|
assert_equal '🍸', @config.vi_cmd_mode_string
|
||||||
assert_equal @config.vi_ins_mode_string, "🍶"
|
assert_equal '🍶', @config.vi_ins_mode_string
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_inputrc_with_eucjp
|
||||||
|
@config.read_lines(<<~"LINES".encode(Encoding::EUC_JP).lines)
|
||||||
|
set editing-mode vi
|
||||||
|
set vi-cmd-mode-string ォャッ
|
||||||
|
set vi-ins-mode-string 能
|
||||||
|
LINES
|
||||||
|
assert_equal 'ォャッ'.encode(Reline.encoding_system_needs), @config.vi_cmd_mode_string
|
||||||
|
assert_equal '能'.encode(Reline.encoding_system_needs), @config.vi_ins_mode_string
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_xdg_config_home
|
def test_xdg_config_home
|
||||||
|
|
|
@ -292,7 +292,9 @@ class Reline::History::Test < Reline::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_default_internal_encoding
|
def get_default_internal_encoding
|
||||||
if RUBY_PLATFORM =~ /mswin|mingw/
|
if encoding = (RELINE_TEST_ENCODING rescue nil)
|
||||||
|
encoding
|
||||||
|
elsif RUBY_PLATFORM =~ /mswin|mingw/
|
||||||
Encoding.default_internal || Encoding::UTF_8
|
Encoding.default_internal || Encoding::UTF_8
|
||||||
else
|
else
|
||||||
Encoding.default_internal || Encoding.find("locale")
|
Encoding.default_internal || Encoding.find("locale")
|
||||||
|
|
|
@ -314,6 +314,12 @@ class Reline::Test < Reline::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_reline_encoding
|
def get_reline_encoding
|
||||||
RUBY_PLATFORM =~ /mswin|mingw/ ? Encoding::UTF_8 : Encoding::default_external
|
if encoding = (RELINE_TEST_ENCODING rescue nil)
|
||||||
|
encoding
|
||||||
|
elsif RUBY_PLATFORM =~ /mswin|mingw/
|
||||||
|
Encoding::UTF_8
|
||||||
|
else
|
||||||
|
Encoding::default_external
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue