Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ruby/irb] Add edit command (ruby/irb#453)
* Add edit command * Make find_source a public singleton method * Add document for the edit command * Make find_end private * Remove duplicated private ruby/irb@4321674aa7 Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com>
- Loading branch information
Showing
5 changed files
with
197 additions
and
44 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
require 'shellwords' | ||
require_relative "nop" | ||
|
||
module IRB | ||
# :stopdoc: | ||
|
||
module ExtendCommand | ||
class Edit < Nop | ||
class << self | ||
def transform_args(args) | ||
# Return a string literal as is for backward compatibility | ||
if args.nil? || args.empty? || string_literal?(args) | ||
args | ||
else # Otherwise, consider the input as a String for convenience | ||
args.strip.dump | ||
end | ||
end | ||
|
||
private | ||
|
||
def string_literal?(args) | ||
sexp = Ripper.sexp(args) | ||
sexp && sexp.size == 2 && sexp.last&.first&.first == :string_literal | ||
end | ||
end | ||
|
||
def execute(*args) | ||
path = args.first | ||
|
||
if path.nil? && (irb_path = @irb_context.irb_path) | ||
path = irb_path | ||
end | ||
|
||
if !File.exist?(path) | ||
require_relative "show_source" | ||
|
||
source = | ||
begin | ||
ShowSource.find_source(path, @irb_context) | ||
rescue NameError | ||
# if user enters a path that doesn't exist, it'll cause NameError when passed here because find_source would try to evaluate it as well | ||
# in this case, we should just ignore the error | ||
end | ||
|
||
if source && File.exist?(source.file) | ||
path = source.file | ||
else | ||
puts "Can not find file: #{path}" | ||
return | ||
end | ||
end | ||
|
||
if editor = ENV['EDITOR'] | ||
puts "command: '#{editor}'" | ||
puts " path: #{path}" | ||
system(*Shellwords.split(editor), path) | ||
else | ||
puts "Can not find editor setting: ENV['EDITOR']" | ||
end | ||
end | ||
end | ||
end | ||
|
||
# :startdoc: | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters