open 0.1.30 → 0.2.22
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/README.md +110 -31
- data/bin/open +1 -1
- data/bin/open_in_browser +1 -1
- data/doc/README.gen +72 -8
- data/doc/deprecated_code/deprecated_code.md +26 -0
- data/img/open_logo.png +0 -0
- data/lib/open/base/base.rb +265 -128
- data/lib/open/books/README.md +8 -0
- data/lib/open/books/books.rb +100 -0
- data/lib/open/constants/constants.rb +86 -8
- data/lib/open/in_browser/in_browser.rb +501 -319
- data/lib/open/in_editor/in_editor.rb +367 -162
- data/lib/open/last/last.rb +14 -12
- data/lib/open/last_url/last_url.rb +4 -3
- data/lib/open/nano_open/nano_open.rb +30 -5
- data/lib/open/{open.rb → open/open.rb} +596 -654
- data/lib/open/project/project.rb +3 -2
- data/lib/open/requires/failsafe_require_of_beautiful_url.rb +9 -0
- data/lib/open/requires/require_the_project.rb +2 -2
- data/lib/open/requires/require_yaml.rb +13 -0
- data/lib/open/these_files/these_files.rb +1 -1
- data/lib/open/toplevel_methods/browser.rb +71 -0
- data/lib/open/toplevel_methods/delay.rb +23 -0
- data/lib/open/toplevel_methods/e.rb +14 -0
- data/lib/open/toplevel_methods/editor.rb +41 -0
- data/lib/open/toplevel_methods/host_os.rb +25 -0
- data/lib/open/toplevel_methods/is_on_roebe.rb +16 -0
- data/lib/open/toplevel_methods/is_on_windows.rb +26 -0
- data/lib/open/toplevel_methods/misc.rb +50 -0
- data/lib/open/version/version.rb +2 -2
- data/lib/open/with_delay/with_delay.rb +10 -11
- data/open.gemspec +3 -3
- data/test/testing_open.rb +1 -1
- data/test/testing_open_in_browser.rb +16 -0
- data/test/testing_open_via_launchy.rb +3 -0
- data/test/testing_shortcuts.rb +3 -0
- metadata +25 -9
- data/lib/open/toplevel_code/toplevel_code.rb +0 -189
@@ -6,12 +6,16 @@
|
|
6
6
|
#
|
7
7
|
# This class can specifically be used to open a local file via your
|
8
8
|
# favourite editor. This is admittedly more useful for GUI-based editors
|
9
|
-
# such as "geany" or "gedit" than, say, "vim" or "nano".
|
9
|
+
# such as "geany" or "gedit" than, say, "vim" or "nano". Nonetheless
|
10
|
+
# I also use this class as base-class for class Open::NanoOpen - that is,
|
11
|
+
# opening a local file via the nano editor.
|
10
12
|
#
|
11
|
-
# If the file was not found, and BeautifulUrl is available, then
|
12
|
-
#
|
13
|
-
#
|
14
|
-
# "
|
13
|
+
# If the file at hand was not found, and BeautifulUrl is available, then this
|
14
|
+
# class will tap into the functionality made available by BeautifulUrl, in
|
15
|
+
# order to see whether that leads to a file that can be found. If the file
|
16
|
+
# can not be found then "dfind" will be tried, as last attempt, which in
|
17
|
+
# turn is based on "locate / updatedb" - so it only works on Linux systems
|
18
|
+
# really or some UNIX-variants.
|
15
19
|
#
|
16
20
|
# Usage example:
|
17
21
|
#
|
@@ -33,20 +37,28 @@ class InEditor < Base # === Open::InEditor
|
|
33
37
|
# The first argument should be the name of the file that we wish to open.
|
34
38
|
# ========================================================================= #
|
35
39
|
def initialize(
|
36
|
-
|
37
|
-
run_already
|
40
|
+
commandline_arguments = ARGV,
|
41
|
+
run_already = true
|
38
42
|
)
|
39
43
|
register_sigint
|
40
44
|
reset
|
41
|
-
|
45
|
+
commandline_arguments = [commandline_arguments].flatten.compact
|
46
|
+
set_commandline_arguments(
|
47
|
+
commandline_arguments
|
48
|
+
)
|
49
|
+
set_work_on_these_files(
|
50
|
+
commandline_arguments.reject {|entry|
|
51
|
+
entry.start_with?('--')
|
52
|
+
}
|
53
|
+
)
|
42
54
|
# ======================================================================= #
|
43
55
|
# === Handle blocks next
|
44
56
|
# ======================================================================= #
|
45
57
|
if block_given?
|
46
58
|
yielded = yield
|
47
|
-
#
|
59
|
+
# ======================================================================= #
|
48
60
|
# === Handle Hashes next
|
49
|
-
#
|
61
|
+
# ======================================================================= #
|
50
62
|
if yielded.is_a? Hash
|
51
63
|
# =================================================================== #
|
52
64
|
# === :use_this_editor
|
@@ -61,7 +73,7 @@ class InEditor < Base # === Open::InEditor
|
|
61
73
|
# =================================================================== #
|
62
74
|
if yielded.has_key? :this_file
|
63
75
|
_ = yielded[:this_file]
|
64
|
-
|
76
|
+
set_work_on_these_files(_)
|
65
77
|
end
|
66
78
|
end
|
67
79
|
end
|
@@ -73,158 +85,377 @@ class InEditor < Base # === Open::InEditor
|
|
73
85
|
# ========================================================================= #
|
74
86
|
def reset
|
75
87
|
super()
|
88
|
+
infer_the_namespace
|
89
|
+
# ======================================================================= #
|
90
|
+
# === @internal_hash
|
76
91
|
# ======================================================================= #
|
77
|
-
|
92
|
+
reset_the_internal_hash
|
78
93
|
# ======================================================================= #
|
79
|
-
|
94
|
+
# === :use_this_editor
|
95
|
+
# ======================================================================= #
|
96
|
+
set_use_this_editor(:use_the_default_editor_from_the_yaml_file)
|
97
|
+
# ======================================================================= #
|
98
|
+
# === :work_on_these_files
|
99
|
+
#
|
100
|
+
# This variable must be nil initially.
|
101
|
+
# ======================================================================= #
|
102
|
+
@internal_hash[:work_on_these_files] = nil
|
80
103
|
end
|
81
104
|
|
82
105
|
# ========================================================================= #
|
83
|
-
# ===
|
106
|
+
# === start_the_editor_in_the_background
|
84
107
|
# ========================================================================= #
|
85
|
-
def
|
86
|
-
|
87
|
-
end; alias
|
108
|
+
def start_the_editor_in_the_background
|
109
|
+
system "#{use_which_editor?} &"
|
110
|
+
end; alias start_editor_in_background start_the_editor_in_the_background # === start_editor_in_background
|
88
111
|
|
89
112
|
# ========================================================================= #
|
90
|
-
# ===
|
91
|
-
#
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
if entry.start_with? ':' # If this is a "symbol" we assume to do a special action.
|
107
|
-
name = entry[1 .. -1]
|
108
|
-
# =================================================================== #
|
109
|
-
# Since as of March 2023 we will distinguish two use cases:
|
110
|
-
#
|
111
|
-
# (1) first, we will try to use the dataset in the file called
|
112
|
-
# shortcuts.yml. If the input is part of a key in that file
|
113
|
-
# then the key will be fetched, and the associated files
|
114
|
-
# will be opened in the editor
|
115
|
-
#
|
116
|
-
# (2) otherwise we will look through RUBY_SRC and simply open
|
117
|
-
# the project-specific .rb file instead
|
118
|
-
#
|
119
|
-
# =================================================================== #
|
120
|
-
base_dir = RUBY_SRC+name
|
121
|
-
if File.exist?(FILE_SHORTCUTS)
|
122
|
-
dataset = YAML.load_file(FILE_SHORTCUTS)
|
123
|
-
end
|
124
|
-
if dataset and dataset.has_key?(name) # Invoke via: openineditors :gamebooks
|
125
|
-
entry = dataset[name]
|
126
|
-
elsif File.directory? base_dir
|
127
|
-
target = base_dir+'/lib/'+name+'/*.rb' # This is, sort of, the special action.
|
128
|
-
entry = Dir[target]
|
129
|
-
end
|
130
|
-
end
|
131
|
-
if entry.include? '#' # Then chop off. It is probably not necessary, though.
|
132
|
-
entry = entry[0..entry.index('#')]
|
133
|
-
end
|
134
|
-
if entry.respond_to?(:start_with?) and entry.start_with?('file://')
|
135
|
-
entry[0, 'file://'.size] = ''
|
136
|
-
end
|
137
|
-
entry
|
138
|
-
} if i.is_a? Array
|
139
|
-
i = i.flatten if i.is_a? Array
|
140
|
-
@input = i # Must be an Array.
|
141
|
-
end
|
113
|
+
# === set_work_on_these_files
|
114
|
+
#
|
115
|
+
# The variable has to be an Array at all times.
|
116
|
+
# ========================================================================= #
|
117
|
+
def set_work_on_these_files(i)
|
118
|
+
i = [i].flatten.compact.reject {|entry| entry.start_with?('--') }
|
119
|
+
@internal_hash[:work_on_these_files] = i
|
120
|
+
end; alias set_work_on_this_file set_work_on_these_files # === set_work_on_this_file
|
121
|
+
|
122
|
+
# ========================================================================= #
|
123
|
+
# === work_on_these_files?
|
124
|
+
# ========================================================================= #
|
125
|
+
def work_on_these_files?
|
126
|
+
@internal_hash[:work_on_these_files]
|
127
|
+
end; alias work_on_this_file? work_on_these_files? # === work_on_this_file?
|
128
|
+
alias input? work_on_these_files? # === input?
|
142
129
|
|
143
130
|
# ========================================================================= #
|
144
131
|
# === try_to_find_expanded_alias_for
|
145
132
|
#
|
146
|
-
# We delegate towards FindExpandedAlias
|
133
|
+
# We delegate towards FindExpandedAlias here.
|
147
134
|
# ========================================================================= #
|
148
135
|
def try_to_find_expanded_alias_for(i)
|
149
|
-
result = false # Default.
|
136
|
+
result = false # Default return value.
|
137
|
+
if i and i.include?('$')
|
138
|
+
i = sanitize_global_environment(i)
|
139
|
+
end
|
140
|
+
if i.include? ' ' # For instance, when it includes a ' &'
|
141
|
+
i = i[0, i.index(' ')]
|
142
|
+
end if i
|
150
143
|
if Object.const_defined?(:Roebe) and
|
151
144
|
Roebe.const_defined?(:FindExpandedAlias)
|
152
|
-
|
153
|
-
|
145
|
+
expanded_alias = Roebe::FindExpandedAlias.new(i) { :be_quiet }
|
146
|
+
if expanded_alias.does_include?(i)
|
147
|
+
result = true
|
148
|
+
end
|
154
149
|
end
|
155
|
-
if result.include? ' ' # For instance, when it includes a ' &'
|
156
|
-
result = result[0, result.index(' ')]
|
157
|
-
end if result
|
158
150
|
return result
|
159
151
|
end
|
152
|
+
|
153
|
+
# ========================================================================= #
|
154
|
+
# === use_this_editor?
|
155
|
+
# ========================================================================= #
|
156
|
+
def use_this_editor?
|
157
|
+
@internal_hash[:use_this_editor]
|
158
|
+
end; alias editor? use_this_editor? # === editor?
|
159
|
+
alias use_which_editor? use_this_editor? # === use_which_editor?
|
160
|
+
|
161
|
+
# ========================================================================= #
|
162
|
+
# === set_editor
|
163
|
+
# ========================================================================= #
|
164
|
+
def set_editor(
|
165
|
+
i = :use_the_default_editor_from_the_yaml_file
|
166
|
+
)
|
167
|
+
case i
|
168
|
+
# ======================================================================= #
|
169
|
+
# === :use_the_default_editor_from_the_yaml_file
|
170
|
+
# ======================================================================= #
|
171
|
+
when :use_the_default_editor_from_the_yaml_file
|
172
|
+
i = file_load_default_editor?
|
173
|
+
end
|
174
|
+
@internal_hash[:use_this_editor] = i
|
175
|
+
end; alias editor= set_editor # === editor=
|
176
|
+
alias set_use_this_editor set_editor # === set_use_this_editor
|
177
|
+
|
178
|
+
# ========================================================================= #
|
179
|
+
# === do_save_this_file_into_a_local_yaml_file
|
180
|
+
#
|
181
|
+
# Since as of August 2019, this will also be logged into a local file,
|
182
|
+
# if we are on a roebe-system.
|
183
|
+
# ========================================================================= #
|
184
|
+
def do_save_this_file_into_a_local_yaml_file(i)
|
185
|
+
if File.file?(i) and
|
186
|
+
Object.const_defined?(:Roebe) and
|
187
|
+
File.directory?(Roebe.log_dir?) and
|
188
|
+
is_on_roebe?
|
189
|
+
into = "#{Roebe.log_dir?}opened_files.yml"
|
190
|
+
array = []
|
191
|
+
if File.exist? into
|
192
|
+
array << YAML.load_file(into)
|
193
|
+
end
|
194
|
+
array.flatten!
|
195
|
+
array << i unless array.include?(i)
|
196
|
+
what = YAML.dump(array)
|
197
|
+
unless Object.const_defined?(:SaveFile)
|
198
|
+
require 'save_file'
|
199
|
+
end
|
200
|
+
SaveFile.write_what_into(what, into)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
# ========================================================================= #
|
205
|
+
# === verbose_notify_the_user_that_a_default_delay_will_be_used_next
|
206
|
+
# ========================================================================= #
|
207
|
+
def verbose_notify_the_user_that_a_default_delay_will_be_used_next
|
208
|
+
opne "More than #{steelblue('3 arguments')} were given, thus we will "\
|
209
|
+
"use a small delay of #{simp(N_DELAY.to_s)} seconds."
|
210
|
+
end
|
211
|
+
|
212
|
+
# ========================================================================= #
|
213
|
+
# === menu (menu tag)
|
214
|
+
# ========================================================================= #
|
215
|
+
def menu(
|
216
|
+
i = commandline_arguments?
|
217
|
+
)
|
218
|
+
if i.is_a? Array
|
219
|
+
i.each {|entry| menu(entry) }
|
220
|
+
else
|
221
|
+
case i # (case tag)
|
222
|
+
# ======================================================================= #
|
223
|
+
# === open_in_editor --show-help
|
224
|
+
# ======================================================================= #
|
225
|
+
when /help$/
|
226
|
+
show_help
|
227
|
+
exit
|
228
|
+
# ======================================================================= #
|
229
|
+
# === open_in_editor --editor?
|
230
|
+
# ======================================================================= #
|
231
|
+
when /^-?-?editor\??$/i
|
232
|
+
show_the_editor_in_use
|
233
|
+
exit
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
# ========================================================================= #
|
239
|
+
# === show_the_editor_in_use
|
240
|
+
#
|
241
|
+
# Invocation example:
|
242
|
+
#
|
243
|
+
# open_in_editor --editor?
|
244
|
+
#
|
245
|
+
# ========================================================================= #
|
246
|
+
def show_the_editor_in_use
|
247
|
+
e steelblue(::Open.editor?)
|
248
|
+
end
|
160
249
|
|
161
250
|
# ========================================================================= #
|
162
|
-
# ===
|
251
|
+
# === show_help (help tag)
|
163
252
|
# ========================================================================= #
|
164
|
-
def
|
165
|
-
|
253
|
+
def show_help
|
254
|
+
e 'The following help-options are documented:'
|
255
|
+
e
|
256
|
+
e ' --editor? # show the current main editor in use'
|
257
|
+
e
|
166
258
|
end
|
167
259
|
|
168
260
|
# ========================================================================= #
|
169
|
-
# ===
|
261
|
+
# === consider_opening_files
|
170
262
|
# ========================================================================= #
|
171
|
-
def
|
172
|
-
|
263
|
+
def consider_opening_files(
|
264
|
+
array = work_on_these_files?,
|
265
|
+
use_this_delay_by_default = 0
|
266
|
+
)
|
267
|
+
if array.empty?
|
268
|
+
opne 'No argument was given - thus, starting the primary editor in the background.'
|
269
|
+
start_the_editor_in_the_background
|
270
|
+
else
|
271
|
+
if array.size > 3
|
272
|
+
verbose_notify_the_user_that_a_default_delay_will_be_used_next
|
273
|
+
use_this_delay_by_default = N_DELAY
|
274
|
+
# Old code in use prior to the rewrite in June 2023 was:
|
275
|
+
# case use_this_editor?
|
276
|
+
# when 'bluefish'
|
277
|
+
# sleep(use_which_delay?) if array.size > 3 # To prevent bluefish from acting silly.
|
278
|
+
# end
|
279
|
+
end
|
280
|
+
array.each {|entry|
|
281
|
+
open_this_file_in_the_editor(entry, use_this_delay_by_default)
|
282
|
+
}
|
283
|
+
end
|
173
284
|
end
|
174
285
|
|
175
286
|
# ========================================================================= #
|
176
|
-
# ===
|
287
|
+
# === open_this_file_in_the_editor
|
177
288
|
#
|
178
289
|
# The optional second argument allows us to wait a little before
|
179
290
|
# opening something in the editor.
|
180
291
|
# ========================================================================= #
|
181
|
-
def
|
182
|
-
i,
|
292
|
+
def open_this_file_in_the_editor(
|
293
|
+
i,
|
294
|
+
optional_delay = nil
|
183
295
|
)
|
296
|
+
use_this_editor = use_which_editor?
|
297
|
+
i = i.to_s.dup # So to avoid frozen strings here.
|
298
|
+
i = sanitize_global_environment(i) if i.include? '$'
|
299
|
+
i = rds(i) # Get rid of // again, just in case.
|
300
|
+
# ======================================================================= #
|
301
|
+
# Next, we chop off '?' characters. This is, however had, not good if
|
302
|
+
# this is part of the filename. So we must check if the file exists,
|
303
|
+
# prior to doing this check.
|
304
|
+
# ======================================================================= #
|
305
|
+
if i.include?('?') and !File.exist?(i)
|
306
|
+
i = i[0..i.index('?')]
|
307
|
+
end
|
308
|
+
# ======================================================================= #
|
309
|
+
# === Handle fake "Symbols" next:
|
310
|
+
# ======================================================================= #
|
311
|
+
if i.start_with?(':') # If this is a "symbol" we assume to do a special action.
|
312
|
+
name = i[1 .. -1] # Get rid of the leading ':' here.
|
313
|
+
# ======================================================================= #
|
314
|
+
# Since as of March 2023 we will distinguish two use cases here
|
315
|
+
# for such fake-symbols:
|
316
|
+
#
|
317
|
+
# (1) first, we will try to use the dataset in the file called
|
318
|
+
# shortcuts.yml. If the input is part of a key in that file
|
319
|
+
# then the key will be fetched, and the associated files
|
320
|
+
# will be opened in the editor
|
321
|
+
#
|
322
|
+
# (2) otherwise we will look through RUBY_SRC and simply open
|
323
|
+
# the project-specific .rb file instead
|
324
|
+
#
|
325
|
+
# These shortcuts are defined in the .yml file at:
|
326
|
+
#
|
327
|
+
# open/yaml/shortcuts.yml
|
328
|
+
#
|
329
|
+
# ======================================================================= #
|
330
|
+
base_dir = RUBY_SRC+name
|
331
|
+
if File.exist?(FILE_SHORTCUTS) # Load the dataset next.
|
332
|
+
dataset = YAML.load_file(FILE_SHORTCUTS)
|
333
|
+
end
|
334
|
+
# ======================================================================= #
|
335
|
+
# The next clause may turn i into an Array - both if and elsif
|
336
|
+
# clauses:
|
337
|
+
# ======================================================================= #
|
338
|
+
if dataset and dataset.has_key?(name) # Invoke via: openineditors :gamebooks
|
339
|
+
i = dataset[name]
|
340
|
+
elsif File.directory? base_dir
|
341
|
+
target = base_dir+'/lib/'+name+'/*.rb' # This is, sort of, the special action.
|
342
|
+
i = Dir[target] # This will make it an Array.
|
343
|
+
end
|
344
|
+
end
|
184
345
|
if i.is_a? Array
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
}
|
346
|
+
use_this_delay = 0
|
347
|
+
if i.size > 3
|
348
|
+
verbose_notify_the_user_that_a_default_delay_will_be_used_next
|
349
|
+
use_this_delay = N_DELAY
|
350
|
+
end
|
351
|
+
i.each {|entry| open_this_file_in_the_editor(entry, use_this_delay) }
|
191
352
|
else
|
192
|
-
|
353
|
+
# ======================================================================= #
|
354
|
+
# We never want to have localhost entries:
|
355
|
+
# ======================================================================= #
|
193
356
|
if i.include? 'localhost'
|
194
|
-
i.
|
357
|
+
i.sub!(/^http\:\/\/localhost\//, MY_DATA+'/')
|
358
|
+
end
|
359
|
+
if i.respond_to?(:start_with?) and i.start_with?('file://')
|
360
|
+
i[0, 'file://'.size] = ''
|
195
361
|
end
|
196
362
|
if i.end_with?(':') and !File.exist?(i)
|
197
|
-
i
|
198
|
-
elsif i =~ /(:\d+)/ # Has a : and
|
363
|
+
i.chop! # Chop off the last character in this case.
|
364
|
+
elsif i =~ /(:\d+)/ # Has a : and also number, such as ":5".
|
199
365
|
i.gsub!(/#{$1.to_s.dup}/,'')
|
200
366
|
end
|
201
|
-
|
202
|
-
|
367
|
+
if i.include? '#' # Then chop off. It is probably not necessary, though.
|
368
|
+
# =================================================================== #
|
369
|
+
# In December 2023 it was noticed that there may be files that
|
370
|
+
# are called "foo#bar.itm". So we need to make a check, for the
|
371
|
+
# file existing or not. If it exists then we will not truncate
|
372
|
+
# it.
|
373
|
+
# =================================================================== #
|
374
|
+
i = i[0 .. i.index('#')] unless File.exist?(i)
|
375
|
+
end
|
376
|
+
if i.count('/home') > 1 # We have more than one entry of '/home'.
|
203
377
|
i.gsub!(/#{MY_DATA}#{MY_DATA}/, MY_DATA)
|
204
378
|
end
|
205
379
|
if i.start_with?('http:') and !File.exist?(i)
|
206
380
|
i.delete_prefix!('http:')
|
207
381
|
end
|
382
|
+
# ======================================================================= #
|
383
|
+
# First check whether the file at `i` exists or whether it does not.
|
384
|
+
# ======================================================================= #
|
208
385
|
if File.exist? i
|
209
386
|
# =================================================================== #
|
210
|
-
#
|
387
|
+
# The file exists, so we can open it in our editor next. We will
|
388
|
+
# work on the absolute path to it since as of June 2023.
|
211
389
|
# =================================================================== #
|
212
|
-
|
390
|
+
i = File.absolute_path(i)
|
391
|
+
# =================================================================== #
|
392
|
+
# Make an exception for .cpp files but only for roebe-systems:
|
393
|
+
# =================================================================== #
|
394
|
+
case File.extname(i).delete('.')
|
395
|
+
when 'cpp'
|
396
|
+
if is_on_roebe?
|
397
|
+
if ENV.has_key?('CPP_EDITOR')
|
398
|
+
use_this_editor = ENV['CPP_EDITOR'].to_s.dup
|
399
|
+
else
|
400
|
+
use_this_editor = 'geany' # We use geany for cpp files.
|
401
|
+
end
|
402
|
+
end
|
403
|
+
end
|
404
|
+
if i.include?("'") and !i.include?('"')
|
405
|
+
i = '"'+i+'"'
|
406
|
+
end
|
407
|
+
if i.include? '('
|
408
|
+
i = '"'+i+'"'
|
409
|
+
end
|
410
|
+
esystem "#{use_this_editor} #{i}"
|
411
|
+
do_save_this_file_into_a_local_yaml_file(i) # Only on roebe-systems though.
|
412
|
+
sleep(optional_delay) if optional_delay # In this case we will also sleep.
|
213
413
|
else # Ok, the file does not exist at this point.
|
214
|
-
#
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
414
|
+
# ======================================================================= #
|
415
|
+
# Next assume it is a local link.
|
416
|
+
# ======================================================================= #
|
417
|
+
if BeautifulUrl.is_a_local_link?(i)
|
418
|
+
i = BeautifulUrl.local_menu(i)
|
419
|
+
else
|
420
|
+
# ================================================================= #
|
421
|
+
# First try a purl.
|
422
|
+
# ================================================================= #
|
423
|
+
_ = BeautifulUrl::BeautifulUrl.new(i, replace: true)
|
424
|
+
end
|
425
|
+
if _ and _.url_was_found
|
426
|
+
esystem "#{use_this_editor} #{_.url_as_string}"
|
427
|
+
elsif Dir["#{i}*"].size > 0 # Try to find matches.
|
428
|
+
# ================================================================= #
|
429
|
+
# Here we have to be careful, as we may hit an infinite loop:
|
430
|
+
# ================================================================= #
|
431
|
+
opne "#{rev}Did not find #{sfile(i)}#{rev}"
|
432
|
+
opne "#{rev}but we may have found at least one other entry."
|
433
|
+
new_selection = Dir["#{i}*"].reject {|entry|
|
434
|
+
File.directory?(entry) or
|
435
|
+
entry.include?('.tar')
|
436
|
+
}
|
437
|
+
# ================================================================= #
|
438
|
+
# We will thus select one random entry:
|
439
|
+
# ================================================================= #
|
440
|
+
open_in_editor(new_selection.sample)
|
441
|
+
# =================================================================== #
|
442
|
+
# === Run through the expanded-aliases next:
|
443
|
+
# =================================================================== #
|
444
|
+
elsif try_to_find_expanded_alias_for(i)
|
445
|
+
i = sanitize_global_environment(i) if i and i.include?('$')
|
446
|
+
if i.include? ' ' # For instance, when it includes a ' &'.
|
447
|
+
i = i[0, i.index(' ')]
|
448
|
+
end if i
|
449
|
+
if Object.const_defined?(:Roebe) and
|
450
|
+
Roebe.const_defined?(:FindExpandedAlias)
|
451
|
+
expanded_alias = Roebe::FindExpandedAlias.new(i) { :be_quiet }
|
452
|
+
i = expanded_alias[i]
|
453
|
+
end
|
454
|
+
open_in_editor(i) if i and !i.empty? # Recursive call.
|
455
|
+
# =================================================================== #
|
225
456
|
# Now the string can include 'project_', in which case we
|
226
457
|
# will handle it in a special way.
|
227
|
-
#
|
458
|
+
# =================================================================== #
|
228
459
|
elsif i.include? 'project_'
|
229
460
|
i.gsub!(/project_/,'')
|
230
461
|
i << 'task'
|
@@ -241,57 +472,13 @@ class InEditor < Base # === Open::InEditor
|
|
241
472
|
end
|
242
473
|
end
|
243
474
|
end
|
244
|
-
|
245
|
-
end
|
246
|
-
|
247
|
-
# ========================================================================= #
|
248
|
-
# === set_editor
|
249
|
-
# ========================================================================= #
|
250
|
-
def set_editor(i = use_which_editor?)
|
251
|
-
@use_this_editor = i
|
252
|
-
end; alias editor= set_editor # === editor=
|
253
|
-
|
254
|
-
# ========================================================================= #
|
255
|
-
# === input?
|
256
|
-
# ========================================================================= #
|
257
|
-
def input?
|
258
|
-
@input
|
259
|
-
end
|
260
|
-
|
261
|
-
# ========================================================================= #
|
262
|
-
# === consider_opening_files
|
263
|
-
# ========================================================================= #
|
264
|
-
def consider_opening_files(
|
265
|
-
i = input?
|
266
|
-
)
|
267
|
-
if i.is_a? Array
|
268
|
-
i.flatten!
|
269
|
-
i.map! {|file|
|
270
|
-
file.chop! if file.end_with? ':'
|
271
|
-
file
|
272
|
-
}
|
273
|
-
if i.empty?
|
274
|
-
start_editor_in_background
|
275
|
-
else
|
276
|
-
optional_delay = 0
|
277
|
-
if i.size > 3
|
278
|
-
opn; e "More than 3 arguments were given, thus we will use "\
|
279
|
-
"a delay of #{simp(N_DELAY.to_s)} seconds."
|
280
|
-
optional_delay = N_DELAY
|
281
|
-
end
|
282
|
-
i.each {|entry|
|
283
|
-
open_in_editor(entry, optional_delay)
|
284
|
-
}
|
285
|
-
end
|
286
|
-
else
|
287
|
-
open_in_editor(i)
|
288
|
-
end
|
289
|
-
end
|
475
|
+
end; alias open_in_editor open_this_file_in_the_editor # === open_in_editor
|
290
476
|
|
291
477
|
# ========================================================================= #
|
292
478
|
# === run (run tag)
|
293
479
|
# ========================================================================= #
|
294
480
|
def run
|
481
|
+
menu
|
295
482
|
consider_opening_files
|
296
483
|
end
|
297
484
|
|
@@ -309,21 +496,39 @@ end
|
|
309
496
|
# =========================================================================== #
|
310
497
|
# === Open.in_editor
|
311
498
|
#
|
499
|
+
# Note that the behaviour of Open.in_editor() is in-sync with the
|
500
|
+
# method Open.in_browser(), in regards to joinable arguments
|
501
|
+
# (typically an Array as input). If you do not want this behaviour
|
502
|
+
# then you may have to prepare for this in your own code, such
|
503
|
+
# as by having an Array and iterating over it before passing
|
504
|
+
# the individual entries into Open.in_editor().
|
505
|
+
#
|
312
506
|
# Usage examples:
|
313
507
|
#
|
314
508
|
# Open.in_editor('/home/x/programming/ruby/src/open/open.gemspec')
|
315
509
|
#
|
316
|
-
# Or
|
510
|
+
# Or the lock variant:
|
317
511
|
#
|
318
512
|
# Open.in_editor {{
|
319
513
|
# this_file: first_argument?,
|
320
514
|
# use_this_editor: :nano
|
321
515
|
# }}
|
322
516
|
#
|
517
|
+
# Which may also look like this:
|
518
|
+
#
|
519
|
+
# ::Open.in_editor {{
|
520
|
+
# this_file: _,
|
521
|
+
# use_this_editor: :bluefish
|
522
|
+
# }}
|
523
|
+
#
|
323
524
|
# =========================================================================== #
|
324
525
|
def self.in_editor(
|
325
|
-
i = ARGV,
|
526
|
+
i = ARGV,
|
527
|
+
&block
|
326
528
|
)
|
529
|
+
if i.respond_to? :join
|
530
|
+
i.join(' ').strip
|
531
|
+
end
|
327
532
|
::Open::InEditor.new(i, &block)
|
328
533
|
end
|
329
534
|
|
@@ -333,9 +538,9 @@ end
|
|
333
538
|
# === open_in_editor
|
334
539
|
# =========================================================================== #
|
335
540
|
def open_in_editor(i, &block)
|
336
|
-
Open.in_editor(i, &block)
|
541
|
+
::Open.in_editor(i, &block)
|
337
542
|
end
|
338
543
|
|
339
544
|
if __FILE__ == $PROGRAM_NAME
|
340
|
-
Open
|
341
|
-
end # openineditor
|
545
|
+
ARGV.each {|entry| Open.in_editor(entry) }
|
546
|
+
end # openineditor localruby
|