el4r 1.0.4
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.
- data/BUGS +2 -0
- data/Changes +2412 -0
- data/bin/el4r +26 -0
- data/bin/el4r-instance +1105 -0
- data/bin/el4r-rctool +279 -0
- data/bin/el4r-runtest +26 -0
- data/data/emacs/site-lisp/el4r.el +441 -0
- data/doc/classes/El4r.html +200 -0
- data/doc/classes/El4r.src/M000004.html +25 -0
- data/doc/classes/El4r.src/M000005.html +25 -0
- data/doc/classes/El4r.src/M000006.html +18 -0
- data/doc/classes/El4r.src/M000008.html +25 -0
- data/doc/classes/El4r.src/M000009.html +18 -0
- data/doc/classes/El4r/ELConsCell.html +145 -0
- data/doc/classes/El4r/ELConsCell.src/M000044.html +16 -0
- data/doc/classes/El4r/ELConsCell.src/M000046.html +16 -0
- data/doc/classes/El4r/ELConsCell.src/M000050.html +16 -0
- data/doc/classes/El4r/ELInstance.html +755 -0
- data/doc/classes/El4r/ELInstance.src/M000046.html +36 -0
- data/doc/classes/El4r/ELInstance.src/M000047.html +41 -0
- data/doc/classes/El4r/ELInstance.src/M000048.html +31 -0
- data/doc/classes/El4r/ELInstance.src/M000049.html +22 -0
- data/doc/classes/El4r/ELInstance.src/M000050.html +25 -0
- data/doc/classes/El4r/ELInstance.src/M000051.html +35 -0
- data/doc/classes/El4r/ELInstance.src/M000052.html +31 -0
- data/doc/classes/El4r/ELInstance.src/M000053.html +23 -0
- data/doc/classes/El4r/ELInstance.src/M000054.html +41 -0
- data/doc/classes/El4r/ELInstance.src/M000055.html +31 -0
- data/doc/classes/El4r/ELInstance.src/M000056.html +43 -0
- data/doc/classes/El4r/ELInstance.src/M000057.html +31 -0
- data/doc/classes/El4r/ELInstance.src/M000058.html +22 -0
- data/doc/classes/El4r/ELInstance.src/M000059.html +25 -0
- data/doc/classes/El4r/ELInstance.src/M000060.html +43 -0
- data/doc/classes/El4r/ELInstance.src/M000061.html +31 -0
- data/doc/classes/El4r/ELInstance.src/M000062.html +22 -0
- data/doc/classes/El4r/ELInstance.src/M000063.html +25 -0
- data/doc/classes/El4r/ELInstance.src/M000064.html +35 -0
- data/doc/classes/El4r/ELInstance.src/M000065.html +23 -0
- data/doc/classes/El4r/ELInstance.src/M000066.html +23 -0
- data/doc/classes/El4r/ELInstance.src/M000067.html +19 -0
- data/doc/classes/El4r/ELInstance.src/M000068.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000069.html +20 -0
- data/doc/classes/El4r/ELInstance.src/M000070.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000071.html +19 -0
- data/doc/classes/El4r/ELInstance.src/M000072.html +30 -0
- data/doc/classes/El4r/ELInstance.src/M000073.html +20 -0
- data/doc/classes/El4r/ELInstance.src/M000074.html +20 -0
- data/doc/classes/El4r/ELInstance.src/M000075.html +17 -0
- data/doc/classes/El4r/ELInstance.src/M000076.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000077.html +21 -0
- data/doc/classes/El4r/ELInstance.src/M000078.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000079.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000080.html +35 -0
- data/doc/classes/El4r/ELInstance.src/M000081.html +24 -0
- data/doc/classes/El4r/ELInstance.src/M000082.html +22 -0
- data/doc/classes/El4r/ELInstance.src/M000083.html +21 -0
- data/doc/classes/El4r/ELInstance.src/M000084.html +19 -0
- data/doc/classes/El4r/ELInstance.src/M000085.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000086.html +21 -0
- data/doc/classes/El4r/ELInstance.src/M000087.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000088.html +24 -0
- data/doc/classes/El4r/ELInstance.src/M000089.html +23 -0
- data/doc/classes/El4r/ELInstance.src/M000090.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000091.html +20 -0
- data/doc/classes/El4r/ELInstance.src/M000092.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000093.html +19 -0
- data/doc/classes/El4r/ELListCell.html +163 -0
- data/doc/classes/El4r/ELListCell.src/M000026.html +16 -0
- data/doc/classes/El4r/ELListCell.src/M000027.html +16 -0
- data/doc/classes/El4r/ELListCell.src/M000028.html +23 -0
- data/doc/classes/El4r/ELListCell.src/M000031.html +16 -0
- data/doc/classes/El4r/ELListCell.src/M000032.html +23 -0
- data/doc/classes/El4r/ELListCell.src/M000033.html +16 -0
- data/doc/classes/El4r/ELListCell.src/M000034.html +23 -0
- data/doc/classes/El4r/ELListCell.src/M000037.html +16 -0
- data/doc/classes/El4r/ELListCell.src/M000038.html +23 -0
- data/doc/classes/El4r/ELMethodsMixin.html +648 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000006.html +27 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000007.html +27 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000008.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000009.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000010.html +27 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000011.html +19 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000012.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000013.html +19 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000014.html +19 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000015.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000016.html +21 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000017.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000018.html +23 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000019.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000020.html +46 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000021.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000022.html +23 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000023.html +28 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000024.html +46 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000025.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000026.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000027.html +28 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000028.html +31 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000029.html +24 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000030.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000031.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000032.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000033.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000034.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000035.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000036.html +25 -0
- data/doc/classes/El4r/ELObject.html +235 -0
- data/doc/classes/El4r/ELObject.src/M000078.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000079.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000080.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000081.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000082.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000083.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000084.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000085.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000086.html +20 -0
- data/doc/classes/El4r/ELObject.src/M000087.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000088.html +20 -0
- data/doc/classes/El4r/ELObject.src/M000090.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000091.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000092.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000093.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000094.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000095.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000096.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000097.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000098.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000099.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000100.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000102.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000103.html +20 -0
- data/doc/classes/El4r/ELRubyObjectStock.html +283 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000030.html +21 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000031.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000032.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000033.html +42 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000034.html +19 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000035.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000036.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000037.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000038.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000039.html +17 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000040.html +17 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000041.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000042.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000043.html +17 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000044.html +17 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000045.html +46 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000046.html +19 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000047.html +21 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000048.html +19 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000049.html +18 -0
- data/doc/classes/El4r/ELSequence.html +221 -0
- data/doc/classes/El4r/ELSequence.src/M000040.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000041.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000042.html +20 -0
- data/doc/classes/El4r/ELSequence.src/M000043.html +19 -0
- data/doc/classes/El4r/ELSequence.src/M000044.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000045.html +19 -0
- data/doc/classes/El4r/ELSequence.src/M000048.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000049.html +20 -0
- data/doc/classes/El4r/ELSequence.src/M000050.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000051.html +20 -0
- data/doc/classes/El4r/ELSequence.src/M000052.html +19 -0
- data/doc/classes/El4r/ELSequence.src/M000053.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000054.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000055.html +20 -0
- data/doc/classes/El4r/ELSequence.src/M000056.html +19 -0
- data/doc/classes/El4r/ELSequence.src/M000057.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000058.html +19 -0
- data/doc/classes/El4r/ELVariables.html +173 -0
- data/doc/classes/El4r/ELVariables.src/M000037.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000038.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000039.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000040.html +23 -0
- data/doc/classes/El4r/ELVariables.src/M000045.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000046.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000047.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000048.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000049.html +23 -0
- data/doc/classes/El4r/ELVariables.src/M000051.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000052.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000053.html +23 -0
- data/doc/classes/El4r/ELVector.html +160 -0
- data/doc/classes/El4r/ELVector.src/M000028.html +22 -0
- data/doc/classes/El4r/ELVector.src/M000029.html +22 -0
- data/doc/classes/El4r/ELVector.src/M000030.html +16 -0
- data/doc/classes/El4r/ELVector.src/M000033.html +22 -0
- data/doc/classes/El4r/ELVector.src/M000034.html +16 -0
- data/doc/classes/El4r/ELVector.src/M000035.html +22 -0
- data/doc/classes/El4r/ELVector.src/M000036.html +16 -0
- data/doc/classes/El4r/ELVector.src/M000039.html +22 -0
- data/doc/classes/El4r/ELVector.src/M000040.html +16 -0
- data/doc/classes/El4r/El4rOutput.html +175 -0
- data/doc/classes/El4r/El4rOutput.src/M000080.html +18 -0
- data/doc/classes/El4r/El4rOutput.src/M000081.html +21 -0
- data/doc/classes/El4r/El4rOutput.src/M000088.html +18 -0
- data/doc/classes/El4r/El4rOutput.src/M000089.html +21 -0
- data/doc/classes/El4r/El4rOutput.src/M000090.html +18 -0
- data/doc/classes/El4r/El4rOutput.src/M000091.html +21 -0
- data/doc/classes/El4r/El4rOutput.src/M000092.html +18 -0
- data/doc/classes/El4r/El4rOutput.src/M000094.html +18 -0
- data/doc/classes/El4r/El4rOutput.src/M000095.html +21 -0
- data/doc/classes/El4r/El4rOutput.src/M000096.html +18 -0
- data/doc/classes/El4rAccessor.html +134 -0
- data/doc/classes/El4rAccessor.src/M000005.html +18 -0
- data/doc/classes/ElApp.html +211 -0
- data/doc/classes/ElApp.src/M000001.html +21 -0
- data/doc/classes/ElApp.src/M000002.html +17 -0
- data/doc/classes/ElApp.src/M000003.html +18 -0
- data/doc/classes/ElApp.src/M000004.html +18 -0
- data/doc/classes/ElMixin.html +163 -0
- data/doc/classes/ElMixin.src/M000001.html +19 -0
- data/doc/classes/ElMixin.src/M000002.html +19 -0
- data/doc/classes/ElMixin.src/M000003.html +18 -0
- data/doc/classes/ElMixin.src/M000004.html +18 -0
- data/doc/classes/ElMixin.src/M000006.html +19 -0
- data/doc/classes/ElMixin.src/M000007.html +18 -0
- data/doc/created.rid +1 -0
- data/doc/files/bin/el4r-instance.html +119 -0
- data/doc/fr_class_index.html +40 -0
- data/doc/fr_file_index.html +27 -0
- data/doc/fr_method_index.html +129 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/el4r.en.html +468 -0
- data/el4r.ja.html +640 -0
- data/files +29 -0
- data/lib/el4r/el4r-sub.rb +1023 -0
- data/lib/el4r/emacsruby/autoload/70el4r-mode.rb +9 -0
- data/lib/el4r/emacsruby/el4r-mode.rb +35 -0
- data/lib/el4r/emacsruby/stdlib.rb +37 -0
- data/lib/el4r/exec-el4r.rb +182 -0
- data/man/el4r.1 +125 -0
- data/setup.rb +1551 -0
- data/testing/alltest.rb +5 -0
- data/testing/badcase.rb +50 -0
- data/testing/el4r.e +262 -0
- data/testing/euc.txt +1 -0
- data/testing/jis.txt +1 -0
- data/testing/sjis.txt +1 -0
- data/testing/test-el4r.rb +1053 -0
- data/testing/test-gc.rb +81 -0
- data/testing/test.el +16 -0
- data/testing/test.rb +97 -0
- data/testing/utf8.txt +1 -0
- metadata +311 -0
data/bin/el4r-rctool
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
#### Embedded RCtool ####
|
|
3
|
+
# RCtool - Automatic generate/update rcfiles.
|
|
4
|
+
# Copyright (C) 2005 rubikitch <rubikitch@ruby-lang.org>
|
|
5
|
+
# Version: $Id: rctool.rb 1016 2005-12-09 00:33:33Z rubikitch $
|
|
6
|
+
|
|
7
|
+
# This program is free software; you can redistribute it and/or modify
|
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
|
9
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
10
|
+
# (at your option) any later version.
|
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
# GNU General Public License for more details.
|
|
15
|
+
# You should have received a copy of the GNU General Public License
|
|
16
|
+
# along with this program; if not, write to the Free Software
|
|
17
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
18
|
+
|
|
19
|
+
require 'fileutils'
|
|
20
|
+
require 'optparse'
|
|
21
|
+
|
|
22
|
+
class RCtool
|
|
23
|
+
def initialize(x={})
|
|
24
|
+
@no_op = x[:no_op]
|
|
25
|
+
@windows_p = (RUBY_PLATFORM =~ /win/i)
|
|
26
|
+
@backup_dir = x[:backup_dir] || "backup"
|
|
27
|
+
@home_dir = (x[:home_dir] || File.expand_path("~")).chomp "/"
|
|
28
|
+
@name = x[:name]
|
|
29
|
+
|
|
30
|
+
@patches = []
|
|
31
|
+
|
|
32
|
+
@verbose = true
|
|
33
|
+
|
|
34
|
+
unless @no_op
|
|
35
|
+
at_exit {
|
|
36
|
+
commit
|
|
37
|
+
}
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
Patch = Struct.new :file, :block, :comment_start, :template, :where
|
|
42
|
+
def define_patch(file, block, comment_start, template="%s", where=:append)
|
|
43
|
+
@patches << Patch.new(file, block, comment_start, template, where)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
#######
|
|
47
|
+
private
|
|
48
|
+
#######
|
|
49
|
+
|
|
50
|
+
def beginning_of_block(comment_start)
|
|
51
|
+
"#{comment_start} Beginning of the #{@name} block:"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def attention_msg(comment_start)
|
|
55
|
+
"#{comment_start} RCtool generated this block automatically. " +
|
|
56
|
+
"DO NOT MODIFY this block!"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def end_of_block(comment_start)
|
|
60
|
+
"#{comment_start} End of the #{@name} block."
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def user_area_msg(comment_start)
|
|
64
|
+
"#{comment_start} User-setting area is below this line."
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def set_filenames(file)
|
|
69
|
+
if file[0,1] == '/' then
|
|
70
|
+
backup_dir = "#{@backup_dir}/__absolute__"
|
|
71
|
+
@target_file = file
|
|
72
|
+
elsif @windows_p and file[0,2] =~ /[A-Z]:/i # for windows
|
|
73
|
+
backup_dir = "#{@backup_dir}/__absolute__"
|
|
74
|
+
@target_file = file
|
|
75
|
+
file = file[2..-1]
|
|
76
|
+
else
|
|
77
|
+
backup_dir = "#{@backup_dir}/"
|
|
78
|
+
@target_file = "#{@home_dir}/#{file}"
|
|
79
|
+
end
|
|
80
|
+
@backup_file = "#{backup_dir}#{file}.backup"
|
|
81
|
+
@modified_file = "#{backup_dir}#{file}.new"
|
|
82
|
+
|
|
83
|
+
FileUtils.mkdir_p [File.dirname(@target_file), File.dirname(@modified_file)] unless @no_op
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def apply_patch(patch)
|
|
88
|
+
file, block, comment_start, template, where = patch.to_a
|
|
89
|
+
|
|
90
|
+
use_template = false
|
|
91
|
+
unless File.exist? @target_file
|
|
92
|
+
use_template = true
|
|
93
|
+
File.open(@target_file, "w") {}
|
|
94
|
+
raise "failed to write #{@target_file}" unless File.exist? @target_file
|
|
95
|
+
end
|
|
96
|
+
FileUtils.cp @target_file, @backup_file, :verbose=>@verbose
|
|
97
|
+
|
|
98
|
+
open(@modified_file, "w") {|f|
|
|
99
|
+
puts "Generating #{@modified_file}..." if @verbose
|
|
100
|
+
old_content = File.read(@target_file)
|
|
101
|
+
|
|
102
|
+
bob = beginning_of_block comment_start
|
|
103
|
+
attention = attention_msg comment_start
|
|
104
|
+
eob = end_of_block comment_start
|
|
105
|
+
user_area = user_area_msg comment_start
|
|
106
|
+
|
|
107
|
+
bob_re = Regexp.quote bob
|
|
108
|
+
eob_re = Regexp.quote eob
|
|
109
|
+
user_area_re = Regexp.quote user_area
|
|
110
|
+
|
|
111
|
+
block = ["", bob, attention, block.chomp, eob, user_area]
|
|
112
|
+
|
|
113
|
+
m = old_content.match(/\n?#{bob_re}\n.+^#{eob_re}\n(#{user_area_re}\n)?/m)
|
|
114
|
+
if m # target_file exists / has block
|
|
115
|
+
block = block[1..-1] if where == :prepend and old_content =~ /\A#{bob_re}/
|
|
116
|
+
f.print m.pre_match
|
|
117
|
+
f.puts block
|
|
118
|
+
f.print m.post_match
|
|
119
|
+
elsif use_template # target_file does not exist
|
|
120
|
+
f.printf(template, block.join("\n").strip)
|
|
121
|
+
elsif where == :append # target_file exists / has no block
|
|
122
|
+
f.print old_content
|
|
123
|
+
f.puts block
|
|
124
|
+
elsif where == :prepend # target_file exists / has no block
|
|
125
|
+
f.puts block.join("\n").strip
|
|
126
|
+
f.print old_content
|
|
127
|
+
else
|
|
128
|
+
raise ArgumentError, "invalid where: #{where}"
|
|
129
|
+
end
|
|
130
|
+
}
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def install_file(patch)
|
|
134
|
+
FileUtils.cp @modified_file, @target_file, :verbose=>@verbose
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def uninstall_file(patch)
|
|
138
|
+
FileUtils.cp @backup_file, @target_file, :verbose=>@verbose
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def diff_file(patch)
|
|
142
|
+
system "diff -u #{@backup_file} #{@modified_file}"
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def commit
|
|
147
|
+
method_for_each_patch = nil
|
|
148
|
+
ARGV.options {|o|
|
|
149
|
+
o.on("-p", "--prepare",
|
|
150
|
+
"create the modified and backup rcfiles"
|
|
151
|
+
) { method_for_each_patch = :apply_patch}
|
|
152
|
+
o.on("-d", "--diff",
|
|
153
|
+
"show the differences between the modified and the backup rcfiles"
|
|
154
|
+
) { method_for_each_patch = :diff_file}
|
|
155
|
+
o.on("-i", "--install",
|
|
156
|
+
"copy the modified rcfiles from BACKUPDIR to HOME"
|
|
157
|
+
) { method_for_each_patch = :install_file}
|
|
158
|
+
o.on("-u", "--uninstall",
|
|
159
|
+
"copy the backup rcfiles from BACKUPDIR to HOME"
|
|
160
|
+
) { method_for_each_patch = :uninstall_file}
|
|
161
|
+
o.on("-q", "--quiet", "quiet output") { @verbose=false }
|
|
162
|
+
|
|
163
|
+
o.parse!
|
|
164
|
+
|
|
165
|
+
if method_for_each_patch
|
|
166
|
+
@patches.each do |patch|
|
|
167
|
+
set_filenames patch.file
|
|
168
|
+
__send__ method_for_each_patch, patch
|
|
169
|
+
end
|
|
170
|
+
else
|
|
171
|
+
puts o.help
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
}
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
#### Definition ####
|
|
181
|
+
# (shell-command "rm ~/.el4rrc.rb")
|
|
182
|
+
# (progn (find-sh "rake rctool; bin/el4r-rctool -p ; bin/el4r-rctool -d; bin/el4r-rctool -i") (find-filez "~/.el4rrc.rb ~/.emacs ~/.el4r/init.rb"))
|
|
183
|
+
# (find-sh "ruby ~/.el4rrc.rb")
|
|
184
|
+
require 'tmpdir'
|
|
185
|
+
require 'rbconfig'
|
|
186
|
+
include Config
|
|
187
|
+
|
|
188
|
+
home_dir_expr = %q!ENV['EL4R_HOME'] || File.expand_path("~/.el4r")!
|
|
189
|
+
home_dir = eval home_dir_expr
|
|
190
|
+
|
|
191
|
+
bindir = CONFIG["bindir"]
|
|
192
|
+
datadir = CONFIG["datadir"]
|
|
193
|
+
sitelibdir = CONFIG["sitelibdir"]
|
|
194
|
+
rubylibdir = CONFIG["rubylibdir"]
|
|
195
|
+
|
|
196
|
+
if File.directory? File.join(rubylibdir, "el4r") # debian
|
|
197
|
+
emacsrubydir = File.join(rubylibdir, "el4r/emacsruby")
|
|
198
|
+
siteemacsrubydir = File.join(sitelibdir, "el4r/emacsruby")
|
|
199
|
+
else
|
|
200
|
+
emacsrubydir = File.join(sitelibdir, "el4r/emacsruby")
|
|
201
|
+
siteemacsrubydir = File.join(home_dir, "site")
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
el_program = File.expand_path('emacs/site-lisp/el4r.el', datadir)
|
|
205
|
+
el_dir = File.dirname el_program
|
|
206
|
+
|
|
207
|
+
rc = RCtool.new(:name=>"el4r")
|
|
208
|
+
rc.define_patch(".el4rrc.rb", <<END_OF_BLOCK, "#", <<END_OF_TEMPLATE, :prepend)
|
|
209
|
+
### Internal variables
|
|
210
|
+
@stdlib_dir = #{emacsrubydir.dump}
|
|
211
|
+
@site_dir = #{siteemacsrubydir.dump}
|
|
212
|
+
@autoload_dir = #{File.join(emacsrubydir, "autoload").dump}
|
|
213
|
+
@el_program_relative = "data/emacs/site-lisp/el4r.el"
|
|
214
|
+
@instance_program_relative = "bin/el4r-instance"
|
|
215
|
+
@el_program = #{el_program.dump}
|
|
216
|
+
@instance_program = #{File.expand_path('el4r-instance', bindir).dump}
|
|
217
|
+
@lisp_object_gc_trigger_count = 100
|
|
218
|
+
@lisp_object_gc_trigger_increment = 100
|
|
219
|
+
@ruby_gc_trigger_count = 100
|
|
220
|
+
@ruby_gc_trigger_increment = 100
|
|
221
|
+
@log_buffer = "*el4r:log*"
|
|
222
|
+
@output_buffer = "*el4r:output*"
|
|
223
|
+
@unittest_lisp_object_gc_trigger_count = 5000
|
|
224
|
+
@unittest_lisp_object_gc_trigger_increment = 5000
|
|
225
|
+
@unittest_ruby_gc_trigger_count = 5000
|
|
226
|
+
@unittest_ruby_gc_trigger_increment = 5000
|
|
227
|
+
@temp_file = "#{Dir.tmpdir}/el4r-\#{ENV['USER'] || ENV['USERNAME'] || 'me'}.tmp"
|
|
228
|
+
|
|
229
|
+
### El4r bootstrap code
|
|
230
|
+
def __conf__
|
|
231
|
+
if ENV['EL4R_ROOT']
|
|
232
|
+
$: << File.join(ENV['EL4R_ROOT'], "lib")
|
|
233
|
+
end
|
|
234
|
+
require 'el4r/el4r-sub'
|
|
235
|
+
ConfigScript.new(__FILE__)
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def __elisp_init__
|
|
239
|
+
$> << "(setq \\n"
|
|
240
|
+
instance_variables.map{|iv| [iv[1..-1], instance_variable_get(iv)]}.each {|k,v| $> << "el4r-\#{k.gsub(/_/,'-')} \#{v.inspect}\\n" if Numeric === v or String === v}
|
|
241
|
+
$> << ')' << "\n"
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
at_exit { __elisp_init__ if __FILE__==$0 }
|
|
245
|
+
|
|
246
|
+
### Customizable variables
|
|
247
|
+
### You can override these variables in User-setting area.
|
|
248
|
+
# directory containing EmacsRuby scripts
|
|
249
|
+
@home_dir = #{home_dir_expr}
|
|
250
|
+
# startup EmacsRuby script
|
|
251
|
+
@init_script = "init.rb"
|
|
252
|
+
# EmacsRuby search path
|
|
253
|
+
@el4r_load_path = [ @home_dir, @site_dir, @stdlib_dir, "." ]
|
|
254
|
+
END_OF_BLOCK
|
|
255
|
+
%s
|
|
256
|
+
|
|
257
|
+
# Ruby interpreter name used by el4r
|
|
258
|
+
@ruby_program = "ruby"
|
|
259
|
+
# Emacs program name used by el4r / el4r-runtest.rb
|
|
260
|
+
@emacs_program = "emacs"
|
|
261
|
+
END_OF_TEMPLATE
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
dotemacs_block = <<END_OF_BLOCK
|
|
265
|
+
(add-to-list 'load-path #{el_dir.dump})
|
|
266
|
+
(require 'el4r)
|
|
267
|
+
(el4r-boot)
|
|
268
|
+
END_OF_BLOCK
|
|
269
|
+
|
|
270
|
+
rc.define_patch(".emacs", dotemacs_block, ";;", "%s", :append)
|
|
271
|
+
xemacs_init = ".xemacs/init.el"
|
|
272
|
+
if File.exist?(File.expand_path(xemacs_init, ENV['HOME']))
|
|
273
|
+
rc.define_patch(xemacs_init, dotemacs_block, ";;", "%s", :append)
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
rc.define_patch("#{home_dir}/init.rb", <<END_OF_BLOCK, "#", "%s", :prepend)
|
|
277
|
+
# This is the el4r initialization file.
|
|
278
|
+
END_OF_BLOCK
|
|
279
|
+
|
data/bin/el4r-runtest
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# el4r - EmacsLisp for Ruby
|
|
3
|
+
# Copyright (C) 2005 rubikitch <rubikitch@ruby-lang.org>
|
|
4
|
+
# Version: $Id: el4r-runtest 852 2005-11-15 19:38:07Z rubikitch $
|
|
5
|
+
|
|
6
|
+
# This program is free software; you can redistribute it and/or modify
|
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
9
|
+
# (at your option) any later version.
|
|
10
|
+
#
|
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
# GNU General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You should have received a copy of the GNU General Public License
|
|
17
|
+
# along with this program; if not, write to the Free Software
|
|
18
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
19
|
+
|
|
20
|
+
require 'el4r/exec-el4r'
|
|
21
|
+
exec_el4r true
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# Local Variables:
|
|
25
|
+
# modes: (ruby-mode emacs-lisp-mode)
|
|
26
|
+
# End:
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
;; el4r - EmacsLisp for Ruby
|
|
2
|
+
;; Copyright (C) 2005 rubikitch <rubikitch@ruby-lang.org>
|
|
3
|
+
;; Version: $Id: el4r.el 1280 2006-06-24 08:33:17Z rubikitch $
|
|
4
|
+
|
|
5
|
+
;; This file is *NOT* part of GNU Emacs.
|
|
6
|
+
|
|
7
|
+
;; This program is free software; you can redistribute it and/or
|
|
8
|
+
;; modify it under the terms of the GNU General Public License as
|
|
9
|
+
;; published by the Free Software Foundation; either version 2, or (at
|
|
10
|
+
;; your option) any later version.
|
|
11
|
+
|
|
12
|
+
;; This program is distributed in the hope that it will be useful, but
|
|
13
|
+
;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
15
|
+
;; General Public License for more details.
|
|
16
|
+
|
|
17
|
+
;; You should have received a copy of the GNU General Public License
|
|
18
|
+
;; along with GNU Emacs; see the file COPYING. If not, write to the
|
|
19
|
+
;; Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
(or (>= emacs-major-version 21)
|
|
23
|
+
(error "Sorry, el4r requires (X)Emacs21 or later, because it uses weak hash."))
|
|
24
|
+
|
|
25
|
+
(put 'el4r-ruby-error
|
|
26
|
+
'error-conditions
|
|
27
|
+
'(error el4r-ruby-error))
|
|
28
|
+
(put 'el4r-ruby-error 'error-message "Error raised in Ruby")
|
|
29
|
+
|
|
30
|
+
(defvar el4r-ruby-program "ruby"
|
|
31
|
+
"The name of Ruby binary.")
|
|
32
|
+
|
|
33
|
+
(defvar el4r-instance-program (expand-file-name "~/src/el4r/bin/el4r-instance")
|
|
34
|
+
"Full path of el4r-instance.")
|
|
35
|
+
|
|
36
|
+
(defvar el4r-instance-args nil)
|
|
37
|
+
(defvar el4r-debug-on-error nil)
|
|
38
|
+
(defvar el4r-coding-system nil)
|
|
39
|
+
|
|
40
|
+
(defvar el4r-process nil)
|
|
41
|
+
(defvar el4r-process-name "el4r")
|
|
42
|
+
(defvar el4r-process-bufname "*el4r:process*")
|
|
43
|
+
(defvar el4r-call-level 0)
|
|
44
|
+
(defvar el4r-last-error-desc nil)
|
|
45
|
+
|
|
46
|
+
(defvar el4r-ruby-object-ids nil)
|
|
47
|
+
(defvar el4r-ruby-object-weakhash nil)
|
|
48
|
+
;(defvar el4r-defun-hash nil)
|
|
49
|
+
(defvar el4r-defun-lambdas nil)
|
|
50
|
+
(defvar el4r-lisp-object-hash nil)
|
|
51
|
+
(defvar el4r-lisp-object-lastid 0)
|
|
52
|
+
(defvar el4r-lisp-object-gc-trigger-count 100)
|
|
53
|
+
(defvar el4r-lisp-object-gc-trigger-increment 100)
|
|
54
|
+
|
|
55
|
+
(defun call-process-to-string (program &rest args)
|
|
56
|
+
(with-temp-buffer
|
|
57
|
+
(apply 'call-process program nil t nil args)
|
|
58
|
+
(buffer-string)))
|
|
59
|
+
|
|
60
|
+
(defun call-process-and-eval (program &rest args)
|
|
61
|
+
(eval (read (apply 'call-process-to-string program args))))
|
|
62
|
+
|
|
63
|
+
(defun el4r-running-p ()
|
|
64
|
+
(not (null el4r-process)))
|
|
65
|
+
|
|
66
|
+
(unless (fboundp 'process-send-signal)
|
|
67
|
+
(defun process-send-signal (signal process-or-name)
|
|
68
|
+
(signal-process (process-id (get-process process-or-name)) signal))
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
(defun el4r-boot (&optional noinit)
|
|
72
|
+
"Start el4r process, load ~/.el4r/init.rb, and prepare log buffer."
|
|
73
|
+
(interactive "P")
|
|
74
|
+
(with-current-buffer (get-buffer-create el4r-process-bufname) (erase-buffer))
|
|
75
|
+
(with-current-buffer (get-buffer-create "*el4r:log*")
|
|
76
|
+
(let ((buffer-read-only))
|
|
77
|
+
(buffer-disable-undo)
|
|
78
|
+
(erase-buffer)))
|
|
79
|
+
(el4r-init)
|
|
80
|
+
(el4r-ruby-eval
|
|
81
|
+
(if noinit "el4r_boot__noinit" "el4r_boot"))
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
(defun el4r-shutdown ()
|
|
85
|
+
"Shutdown el4r."
|
|
86
|
+
(interactive)
|
|
87
|
+
(when (el4r-running-p)
|
|
88
|
+
(el4r-ruby-eval "el4r_shutdown")
|
|
89
|
+
(process-send-signal 'SIGTERM (process-name el4r-process))
|
|
90
|
+
(setq el4r-process nil)
|
|
91
|
+
))
|
|
92
|
+
|
|
93
|
+
(defun el4r-restart ()
|
|
94
|
+
"Shutdown then start el4r."
|
|
95
|
+
(interactive)
|
|
96
|
+
(el4r-shutdown)
|
|
97
|
+
(el4r-boot))
|
|
98
|
+
|
|
99
|
+
(defun el4r-load (script)
|
|
100
|
+
"Loads Ruby script from ~/.el4r directory."
|
|
101
|
+
(el4r-ruby-call nil "el4r_load" script))
|
|
102
|
+
|
|
103
|
+
(defun el4r-recover ()
|
|
104
|
+
(interactive)
|
|
105
|
+
(with-current-buffer el4r-process-bufname
|
|
106
|
+
(erase-buffer)))
|
|
107
|
+
|
|
108
|
+
(defun el4r-override-variables ())
|
|
109
|
+
|
|
110
|
+
(defun el4r-init ()
|
|
111
|
+
;; In many cases (eq el4r-process (get-buffer-process el4r-process-bufname))
|
|
112
|
+
;; But this sexp is nil when el4r-instance is accidentally dead.
|
|
113
|
+
(and (get-buffer-process el4r-process-bufname) (el4r-shutdown))
|
|
114
|
+
;; Override el4r-related variables from ~/.el4rrc.rb
|
|
115
|
+
(call-process-and-eval el4r-ruby-program (expand-file-name "~/.el4rrc.rb"))
|
|
116
|
+
(el4r-override-variables)
|
|
117
|
+
(setq el4r-lisp-object-hash (make-hash-table :test 'eq))
|
|
118
|
+
(setq el4r-ruby-object-weakhash (make-hash-table :test 'eq :weakness 'value))
|
|
119
|
+
; (setq el4r-defun-hash (make-hash-table :test 'eq))
|
|
120
|
+
(setq el4r-defun-lambdas nil)
|
|
121
|
+
(let ((buffer el4r-process-bufname)
|
|
122
|
+
(process-connection-type nil)) ; Use a pipe.
|
|
123
|
+
(and (get-buffer buffer) (kill-buffer buffer))
|
|
124
|
+
(get-buffer-create buffer)
|
|
125
|
+
(with-current-buffer buffer
|
|
126
|
+
(buffer-disable-undo)
|
|
127
|
+
;; fixme I do not know why.
|
|
128
|
+
;; (set (make-local-variable 'process-adaptive-read-buffering) nil)
|
|
129
|
+
(setq el4r-process (apply 'start-process el4r-process-name buffer
|
|
130
|
+
el4r-ruby-program el4r-instance-program el4r-instance-args))
|
|
131
|
+
(and el4r-coding-system
|
|
132
|
+
(set-process-coding-system el4r-process
|
|
133
|
+
el4r-coding-system el4r-coding-system)))
|
|
134
|
+
(message "el4r started.")
|
|
135
|
+
))
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
(defun el4r-check-alive ()
|
|
139
|
+
(or (eq (process-status el4r-process) 'run)
|
|
140
|
+
(error "el4r-instance is dead.")))
|
|
141
|
+
|
|
142
|
+
(defun el4r-scan-expr-from-ruby ()
|
|
143
|
+
(with-current-buffer el4r-process-bufname
|
|
144
|
+
(goto-char (point-min))
|
|
145
|
+
(save-match-data
|
|
146
|
+
(let ((point-after-zero (search-forward "\0" nil t))
|
|
147
|
+
expr)
|
|
148
|
+
(if point-after-zero
|
|
149
|
+
(progn
|
|
150
|
+
(setq expr
|
|
151
|
+
(buffer-substring (point-min) (- point-after-zero 1)))
|
|
152
|
+
(delete-region (point-min) point-after-zero)
|
|
153
|
+
expr
|
|
154
|
+
)))
|
|
155
|
+
)))
|
|
156
|
+
|
|
157
|
+
(defun el4r-recv ()
|
|
158
|
+
(let ((expr))
|
|
159
|
+
(while (eq nil (progn (setq expr (el4r-scan-expr-from-ruby)) expr))
|
|
160
|
+
(el4r-check-alive)
|
|
161
|
+
(accept-process-output el4r-process))
|
|
162
|
+
expr))
|
|
163
|
+
|
|
164
|
+
(defun el4r-send (rubyexpr)
|
|
165
|
+
(el4r-check-alive)
|
|
166
|
+
(process-send-string el4r-process rubyexpr)
|
|
167
|
+
(process-send-string el4r-process "\0\n"))
|
|
168
|
+
|
|
169
|
+
(defvar el4r-error-lisp-expression nil)
|
|
170
|
+
(defun el4r-get ()
|
|
171
|
+
(let ((result (el4r-recv)) expr)
|
|
172
|
+
(while (eq (length result) 0)
|
|
173
|
+
(el4r-wait-expr)
|
|
174
|
+
(setq result (el4r-recv)))
|
|
175
|
+
(condition-case err
|
|
176
|
+
(eval (setq expr (read result)))
|
|
177
|
+
;; !DRY! (find-function 'el4r-wait-expr)
|
|
178
|
+
(el4r-ruby-error (signal 'el4r-ruby-error nil))
|
|
179
|
+
(error (setq el4r-error-lisp-expression expr)
|
|
180
|
+
(signal (car err) (cdr err))))
|
|
181
|
+
))
|
|
182
|
+
|
|
183
|
+
(defun el4r-signal-last-error ()
|
|
184
|
+
(signal (car el4r-last-error-desc) (cdr el4r-last-error-desc)))
|
|
185
|
+
|
|
186
|
+
(defun el4r-enter-call () (setq el4r-call-level (+ el4r-call-level 1)))
|
|
187
|
+
(defun el4r-leave-call () (setq el4r-call-level (- el4r-call-level 1)))
|
|
188
|
+
(defun el4r-callback-p () (not (eq el4r-call-level 0)))
|
|
189
|
+
(defun el4r-send-interrupt () (el4r-send ""))
|
|
190
|
+
|
|
191
|
+
(defun el4r-no-properties (str)
|
|
192
|
+
(setq str (copy-sequence str))
|
|
193
|
+
(set-text-properties 0 (length str) nil str)
|
|
194
|
+
str)
|
|
195
|
+
|
|
196
|
+
(defvar el4r-treat-ctrl-codes nil)
|
|
197
|
+
|
|
198
|
+
(defvar el4r-temp-file nil)
|
|
199
|
+
(defvar obj nil)
|
|
200
|
+
(defsubst el4r-string-to-rubystr (str)
|
|
201
|
+
(let ((file-read "File.read(conf.temp_file)"))
|
|
202
|
+
(if (or (not el4r-treat-ctrl-codes)
|
|
203
|
+
(string= str file-read))
|
|
204
|
+
(concat "%q" (prin1-to-string (el4r-no-properties obj)))
|
|
205
|
+
(cond ((eq el4r-treat-ctrl-codes 'use-file) ;experimental
|
|
206
|
+
;; !FIXME! coding-system @ XEmacs
|
|
207
|
+
(with-temp-buffer
|
|
208
|
+
(insert str)
|
|
209
|
+
;; suppress "wrote file-name" message
|
|
210
|
+
;; (find-efunctiondescr 'write-region "VISIT is neither")
|
|
211
|
+
(write-region 1 (point-max) el4r-temp-file nil 0))
|
|
212
|
+
file-read)
|
|
213
|
+
(t
|
|
214
|
+
(concat "%Q"
|
|
215
|
+
(with-temp-buffer
|
|
216
|
+
(insert (prin1-to-string (el4r-no-properties str)))
|
|
217
|
+
(mapcar (lambda (x)
|
|
218
|
+
(goto-char 1)
|
|
219
|
+
(while (search-forward (car x) nil t)
|
|
220
|
+
(replace-match (cdr x))))
|
|
221
|
+
'(("#" . "\\\\#")
|
|
222
|
+
("\003" . "\\\\cc")
|
|
223
|
+
("\004" . "\\\\cd")
|
|
224
|
+
("\021" . "\\\\cq")
|
|
225
|
+
("\023" . "\\\\cs")
|
|
226
|
+
("\026" . "\\\\cv")
|
|
227
|
+
("\027" . "\\\\cw")
|
|
228
|
+
("\031" . "\\\\cy")
|
|
229
|
+
("\032" . "\\\\cz")
|
|
230
|
+
))
|
|
231
|
+
(buffer-string)))
|
|
232
|
+
|
|
233
|
+
)))))
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
(defun el4r-proper-list-p (expression)
|
|
237
|
+
;; Tell if a list is proper, id est, that it is `nil' or ends with `nil'.
|
|
238
|
+
(cond ((not expression))
|
|
239
|
+
((consp expression) (not (cdr (last expression))))))
|
|
240
|
+
|
|
241
|
+
(defun el4r-lisp2ruby (obj)
|
|
242
|
+
(cond ((eq obj nil) "nil")
|
|
243
|
+
((eq obj t) "true")
|
|
244
|
+
((numberp obj) (number-to-string obj))
|
|
245
|
+
((stringp obj) (el4r-string-to-rubystr obj))
|
|
246
|
+
((el4r-rubyexpr-p obj) (el4r-rubyexpr-string obj))
|
|
247
|
+
((el4r-rubyobj-p obj)
|
|
248
|
+
(format "el4r_rubyobj_stock.id2obj(%s)"
|
|
249
|
+
(el4r-rubyobj-id obj)))
|
|
250
|
+
((el4r-proper-list-p obj)
|
|
251
|
+
(format "el4r_elobject_new(%d, ELListCell)"
|
|
252
|
+
(el4r-lisp-object-to-id obj)))
|
|
253
|
+
((and (consp obj) (atom (cdr obj)))
|
|
254
|
+
(format "el4r_elobject_new(%d, ELConsCell)"
|
|
255
|
+
(el4r-lisp-object-to-id obj)))
|
|
256
|
+
((vectorp obj)
|
|
257
|
+
(format "el4r_elobject_new(%d, ELVector)"
|
|
258
|
+
(el4r-lisp-object-to-id obj)))
|
|
259
|
+
(t
|
|
260
|
+
(format "el4r_elobject_new(%d)"
|
|
261
|
+
(el4r-lisp-object-to-id obj)))
|
|
262
|
+
))
|
|
263
|
+
|
|
264
|
+
(defun el4r-wait-expr ()
|
|
265
|
+
(el4r-enter-call)
|
|
266
|
+
(let (evaled rubyexpr)
|
|
267
|
+
(condition-case err
|
|
268
|
+
(progn (setq evaled (el4r-get))
|
|
269
|
+
(setq rubyexpr (el4r-lisp2ruby evaled)))
|
|
270
|
+
(el4r-ruby-error (setq rubyexpr "el4r_reraise_last_error"))
|
|
271
|
+
(error (setq el4r-last-error-desc err)
|
|
272
|
+
(setq rubyexpr "el4r_raise_lisp_error")))
|
|
273
|
+
(el4r-send rubyexpr))
|
|
274
|
+
(el4r-leave-call))
|
|
275
|
+
|
|
276
|
+
(defun el4r-ruby-eval (rubyexpr)
|
|
277
|
+
(and (eq 0 (length rubyexpr)) (error "Empty expression is not evaluatable."))
|
|
278
|
+
(and (el4r-callback-p) (el4r-send-interrupt))
|
|
279
|
+
(el4r-enter-call)
|
|
280
|
+
(el4r-send rubyexpr)
|
|
281
|
+
(let ((result (el4r-get)))
|
|
282
|
+
(el4r-leave-call)
|
|
283
|
+
result
|
|
284
|
+
))
|
|
285
|
+
|
|
286
|
+
(defun el4r-lisp-object-from-id (id)
|
|
287
|
+
(or (gethash id el4r-lisp-object-hash)
|
|
288
|
+
(error "No such object for given ID: %d" id)))
|
|
289
|
+
|
|
290
|
+
(defun el4r-lisp-object-to-id (obj)
|
|
291
|
+
(el4r-gc-lisp-objects-if-required)
|
|
292
|
+
(let ((id el4r-lisp-object-lastid))
|
|
293
|
+
(setq el4r-lisp-object-lastid (+ id 1))
|
|
294
|
+
(puthash id obj el4r-lisp-object-hash)
|
|
295
|
+
id
|
|
296
|
+
))
|
|
297
|
+
|
|
298
|
+
(defun el4r-garbage-collect ()
|
|
299
|
+
"Force garbage collection for el4r."
|
|
300
|
+
(interactive)
|
|
301
|
+
(el4r-gc-lisp-objects)
|
|
302
|
+
(el4r-ruby-eval "el4r_rubyobj_stock.garbage_collect")
|
|
303
|
+
(message "el4r garbage collected"))
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
(defun el4r-gc-lisp-objects ()
|
|
307
|
+
(let ((ids (el4r-ruby-call nil 'el4r_get_garbage_lispobj_ids)))
|
|
308
|
+
(while ids
|
|
309
|
+
(remhash (car ids) el4r-lisp-object-hash)
|
|
310
|
+
(setq ids (cdr ids))
|
|
311
|
+
)))
|
|
312
|
+
|
|
313
|
+
(defun el4r-gc-lisp-objects-if-required ()
|
|
314
|
+
(if (>= (hash-table-count el4r-lisp-object-hash)
|
|
315
|
+
el4r-lisp-object-gc-trigger-count)
|
|
316
|
+
(progn (el4r-gc-lisp-objects)
|
|
317
|
+
(setq el4r-lisp-object-gc-trigger-count
|
|
318
|
+
(+ (hash-table-count el4r-lisp-object-hash)
|
|
319
|
+
el4r-lisp-object-gc-trigger-increment)))
|
|
320
|
+
))
|
|
321
|
+
|
|
322
|
+
(defun el4r-rubyobj-p (rubyobj)
|
|
323
|
+
(and (listp rubyobj) (eq (car rubyobj) 'el4r-rubyobj)))
|
|
324
|
+
(defun el4r-rubyobj-id (rubyobj)
|
|
325
|
+
(cdr rubyobj))
|
|
326
|
+
(defun el4r-rubyobj-create (id)
|
|
327
|
+
(let ((rubyobj (cons 'el4r-rubyobj id)))
|
|
328
|
+
(setq el4r-ruby-object-ids (cons id el4r-ruby-object-ids))
|
|
329
|
+
(puthash id rubyobj el4r-ruby-object-weakhash)
|
|
330
|
+
rubyobj))
|
|
331
|
+
(defun el4r-rubyobj-get-alive-ids ()
|
|
332
|
+
(garbage-collect)
|
|
333
|
+
;; (let (ids)
|
|
334
|
+
;; (maphash (lambda (id obj)
|
|
335
|
+
;; (setq ids (cons id ids)))
|
|
336
|
+
;; el4r-ruby-object-weakhash)
|
|
337
|
+
;; ids))
|
|
338
|
+
|
|
339
|
+
;; Introduce new variable `el4r-ruby-object-ids' and stop using
|
|
340
|
+
;; maphash to avoid fatal exception. I do not know why maphash
|
|
341
|
+
;; causes fatal. This idea is borrowed from pymacs.
|
|
342
|
+
(let ((ids el4r-ruby-object-ids)
|
|
343
|
+
used-ids)
|
|
344
|
+
(while ids
|
|
345
|
+
(let ((id (car ids)))
|
|
346
|
+
(setq ids (cdr ids))
|
|
347
|
+
(if (gethash id el4r-ruby-object-weakhash)
|
|
348
|
+
(setq used-ids (cons id used-ids))
|
|
349
|
+
)))
|
|
350
|
+
(setq el4r-ruby-object-ids used-ids)
|
|
351
|
+
used-ids))
|
|
352
|
+
|
|
353
|
+
(defun el4r-rubyexpr-p (rubyexpr)
|
|
354
|
+
(and (listp rubyexpr) (eq (car rubyexpr) 'el4r-rubyexpr)))
|
|
355
|
+
(defun el4r-rubyexpr-string (rubyexpr)
|
|
356
|
+
(cdr rubyexpr))
|
|
357
|
+
(defun el4r-rubyexpr-quote (string)
|
|
358
|
+
(cons 'el4r-rubyexpr string))
|
|
359
|
+
|
|
360
|
+
;; disabled
|
|
361
|
+
' (defun el4r-list-to-rubyseq (list)
|
|
362
|
+
(let (tokens)
|
|
363
|
+
(while list
|
|
364
|
+
(setq tokens
|
|
365
|
+
(cons ", " (cons (el4r-lisp2ruby (car list)) tokens)))
|
|
366
|
+
(setq list (cdr list)))
|
|
367
|
+
(setq tokens (nreverse (cdr tokens)))
|
|
368
|
+
(apply 'concat tokens)))
|
|
369
|
+
(defun el4r-list-to-rubyseq (list)
|
|
370
|
+
(mapconcat (lambda (x)
|
|
371
|
+
(el4r-lisp2ruby x))
|
|
372
|
+
list ", "))
|
|
373
|
+
|
|
374
|
+
(defun el4r-list-to-rubyary (list)
|
|
375
|
+
(el4r-rubyexpr-quote (format "[%s]" (el4r-list-to-rubyseq list))))
|
|
376
|
+
(defun el4r-cons-to-rubyary (cons)
|
|
377
|
+
(el4r-list-to-rubyary (list (car cons) (cdr cons))))
|
|
378
|
+
|
|
379
|
+
(defalias 'el4r-vector-to-rubyseq 'el4r-list-to-rubyseq)
|
|
380
|
+
(defalias 'el4r-vector-to-rubyary 'el4r-list-to-rubyary)
|
|
381
|
+
|
|
382
|
+
(defun el4r-ruby-call (receiver name &rest args)
|
|
383
|
+
"Invoke ruby's method. (RECEIVER can be nil.)"
|
|
384
|
+
(setq name (cond ((symbolp name) (symbol-name name))
|
|
385
|
+
((stringp name) name)
|
|
386
|
+
(t (error "Invalid value for method name: %s" name))))
|
|
387
|
+
(setq receiver (cond ((eq receiver nil) "self")
|
|
388
|
+
(t (format "el4r_rubyobj_stock.id2obj(%s)"
|
|
389
|
+
(el4r-rubyobj-id receiver)))))
|
|
390
|
+
(el4r-ruby-eval (format "%s.%s(%s)"
|
|
391
|
+
receiver
|
|
392
|
+
name
|
|
393
|
+
(el4r-list-to-rubyseq args))))
|
|
394
|
+
|
|
395
|
+
(defun el4r-lambda-for-rubyproc (rubyproc-id &rest preform)
|
|
396
|
+
(let ((lmd (eval (append '(lambda (&rest args)) ;; Lazy list play!
|
|
397
|
+
preform
|
|
398
|
+
(list (list 'el4r-ruby-call-proc-by-id
|
|
399
|
+
rubyproc-id
|
|
400
|
+
'args)))
|
|
401
|
+
)))
|
|
402
|
+
(setq el4r-ruby-object-ids (cons rubyproc-id el4r-ruby-object-ids))
|
|
403
|
+
(puthash rubyproc-id lmd el4r-ruby-object-weakhash)
|
|
404
|
+
lmd))
|
|
405
|
+
(defun el4r-ruby-call-proc-by-id (rubyproc-id args)
|
|
406
|
+
(el4r-ruby-eval (format "el4r_rubyobj_stock.id2obj(%s).call(%s)"
|
|
407
|
+
rubyproc-id (el4r-list-to-rubyseq args))))
|
|
408
|
+
(defun el4r-ruby-call-proc (rubyproc &rest args)
|
|
409
|
+
(el4r-ruby-call-proc-by-id (el4r-rubyobj-id rubyproc) args))
|
|
410
|
+
|
|
411
|
+
(defun el4r-ruby-eval-prompt (expr)
|
|
412
|
+
"Read and execute Ruby code."
|
|
413
|
+
(interactive "sEval Ruby: ")
|
|
414
|
+
(message (prin1-to-string (el4r-ruby-eval expr)))
|
|
415
|
+
)
|
|
416
|
+
|
|
417
|
+
(defun el4r-ruby-eval-region (point mark)
|
|
418
|
+
"Execute the region as Ruby code."
|
|
419
|
+
(interactive "r")
|
|
420
|
+
(el4r-ruby-eval-prompt (buffer-substring point mark)))
|
|
421
|
+
|
|
422
|
+
(defun el4r-ruby-eval-buffer ()
|
|
423
|
+
"Execute the buffer as Ruby code."
|
|
424
|
+
(interactive)
|
|
425
|
+
(el4r-ruby-eval-prompt (buffer-string)))
|
|
426
|
+
|
|
427
|
+
(defun el4r-debug-ruby-eval-report (expr)
|
|
428
|
+
(interactive "sEval Ruby: ")
|
|
429
|
+
(insert (format "%s\n => %s\n"
|
|
430
|
+
expr
|
|
431
|
+
(prin1-to-string (el4r-ruby-eval expr)))))
|
|
432
|
+
|
|
433
|
+
(defun el4r-register-lambda (func)
|
|
434
|
+
(setq el4r-defun-lambdas (cons func el4r-defun-lambdas)))
|
|
435
|
+
|
|
436
|
+
(defun el4r-define-function (name func)
|
|
437
|
+
(fset name func)
|
|
438
|
+
(el4r-register-lambda func)
|
|
439
|
+
nil)
|
|
440
|
+
|
|
441
|
+
(provide 'el4r)
|