Skip to content

Commit 97f1e7d

Browse files
committed
Support XDG_CONFIG_HOME
In the XDG Specification, if ~/.config/readline/inputrc exists, then ~/.inputrc should not be read, but for compatibility with GNU Readline, if ~/.inputrc exists, then it is given priority.
1 parent a646238 commit 97f1e7d

File tree

2 files changed

+55
-5
lines changed

2 files changed

+55
-5
lines changed

lib/reline/config.rb

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
class Reline::Config
44
attr_reader :test_mode
55

6-
DEFAULT_PATH = '~/.inputrc'
7-
86
KEYSEQ_PATTERN = /\\(?:C|Control)-[A-Za-z_]|\\(?:M|Meta)-[0-9A-Za-z_]|\\(?:C|Control)-(?:M|Meta)-[A-Za-z_]|\\(?:M|Meta)-(?:C|Control)-[A-Za-z_]|\\e|\\[\\\"\'abdfnrtv]|\\\d{1,3}|\\x\h{1,2}|./
97

108
class InvalidInputrc < RuntimeError
@@ -86,14 +84,28 @@ def keymap
8684
def inputrc_path
8785
case ENV['INPUTRC']
8886
when nil, ''
89-
DEFAULT_PATH
9087
else
91-
ENV['INPUTRC']
88+
return File.expand_path(ENV['INPUTRC'])
89+
end
90+
91+
# In the XDG Specification, if ~/.config/readline/inputrc exists, then
92+
# ~/.inputrc should not be read, but for compatibility with GNU Readline,
93+
# if ~/.inputrc exists, then it is given priority.
94+
path = File.expand_path('~/.inputrc')
95+
return path if File.exist?(path)
96+
97+
case ENV['XDG_CONFIG_HOME']
98+
when nil, ''
99+
path = File.expand_path('~/.config/readline/inputrc')
100+
return path if File.exist?(path)
101+
else
102+
path = File.expand_path("#{ENV['XDG_CONFIG_HOME']}/readline/inputrc")
103+
return path if File.exist?(path)
92104
end
93105
end
94106

95107
def read(file = nil)
96-
file ||= File.expand_path(inputrc_path)
108+
file ||= inputrc_path
97109
begin
98110
if file.respond_to?(:readlines)
99111
lines = file.readlines

test/reline/test_config.rb

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,4 +215,42 @@ def test_empty_inputrc_env
215215
end
216216
ENV['INPUTRC'] = inputrc_backup
217217
end
218+
219+
def test_inputrc
220+
inputrc_backup = ENV['INPUTRC']
221+
expected = "#{@tmpdir}/abcde"
222+
ENV['INPUTRC'] = expected
223+
assert_equal expected, @config.inputrc_path
224+
ENV['INPUTRC'] = inputrc_backup
225+
end
226+
227+
def test_xdg_config_home
228+
home_backup = ENV['HOME']
229+
xdg_config_home_backup = ENV['XDG_CONFIG_HOME']
230+
nonexistence_dir = '/the_nonexistence_dir!!!!!!'
231+
xdg_config_home = File.expand_path("#{@tmpdir}/.config/example_dir")
232+
expected = File.expand_path("#{xdg_config_home}/readline/inputrc")
233+
FileUtils.mkdir_p(File.dirname(expected))
234+
FileUtils.touch(expected)
235+
ENV['HOME'] = nonexistence_dir
236+
ENV['XDG_CONFIG_HOME'] = xdg_config_home
237+
assert_equal expected, @config.inputrc_path
238+
FileUtils.rm(expected)
239+
ENV['XDG_CONFIG_HOME'] = xdg_config_home_backup
240+
ENV['HOME'] = home_backup
241+
end
242+
243+
def test_empty_xdg_config_home
244+
home_backup = ENV['HOME']
245+
xdg_config_home_backup = ENV['XDG_CONFIG_HOME']
246+
ENV['HOME'] = @tmpdir
247+
ENV['XDG_CONFIG_HOME'] = ''
248+
expected = File.expand_path('~/.config/readline/inputrc')
249+
FileUtils.mkdir_p(File.dirname(expected))
250+
FileUtils.touch(expected)
251+
assert_equal expected, @config.inputrc_path
252+
FileUtils.rm(expected)
253+
ENV['XDG_CONFIG_HOME'] = xdg_config_home_backup
254+
ENV['HOME'] = home_backup
255+
end
218256
end

0 commit comments

Comments
 (0)