langhelp 0.9.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,2 @@
1
+ el4r_load "langhelp.rb"
2
+ LangHelp::LangHelp.run
@@ -0,0 +1,864 @@
1
+ # -*- el4r -*-
2
+ # langhelp.rb - The EmacsRuby part of langhelp
3
+ #
4
+ # Copyright (C) 2005,2006 rubikitch <rubikitch@ruby-lang.org>
5
+ # Version: $Id: langhelp.rb 1363 2006-09-04 01:31:05Z 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 'langhelp/langhelp-sub'
20
+
21
+ module LangHelp
22
+
23
+ module DisplayResult
24
+ def search_line(line)
25
+ search_forward "\n#{line}\n", nil, true and previous_line 1
26
+ end
27
+
28
+ def search_anchor(anchor)
29
+ goto_char 1
30
+ search_forward(format(elvar.ee_anchor_format,anchor), nil, true) and forward_line 0
31
+ end
32
+
33
+ def flash_line
34
+ if fboundp :make_overlay
35
+ ovl = make_overlay point_at_bol, point_at_eol
36
+ duration = 1
37
+ overlay_put ovl, :face, :highlight
38
+ run_at_time duration, nil, :delete_overlay, ovl
39
+ end
40
+ end
41
+
42
+ def display_result_buffer(buf, pt, x)
43
+ # display_buffer buf
44
+ one_window_p and split_window
45
+ let(:pop_up_windows, true) { pop_to_buffer buf }
46
+ goto_char pt
47
+
48
+ recenter((elvar.langhelp_centering || x[:centering]) ? [1] : 0)
49
+ if x[:flash] || elvar.langhelp_flash
50
+ flash_line
51
+ end
52
+
53
+ sit_for 0
54
+ other_window 1 unless elvar.langhelp_edit
55
+ end
56
+
57
+ # keyword of x: :line / :anchor
58
+ def display_result(x={})
59
+ buf = nil
60
+ pt = nil
61
+ with(:save_window_excursion) do
62
+ yield
63
+ buf = current_buffer
64
+ if x[:line]
65
+ goto_char 1
66
+ # TODO: write test for lineno
67
+ if Fixnum === x[:line]
68
+ forward_line x[:line]-1
69
+ else
70
+ search_line x[:line]
71
+ end
72
+ elsif x[:anchor]
73
+ search_anchor x[:anchor]
74
+ elsif x[:preserve]
75
+ #
76
+ elsif !x[:w3m]
77
+ goto_char 1
78
+ end
79
+ pt = point
80
+ end
81
+ display_result_buffer buf, pt, x
82
+ buf
83
+ end
84
+
85
+ end
86
+
87
+ class FindXXX < ElApp
88
+ def initialize(x={})
89
+ name = x[:name]
90
+ cmd = x[:cmd]
91
+
92
+ # lh_sh is defined at (view-fline buffer-file-name '(4988 " defun(:lh_sh" "_view_functions\n"))
93
+ defun("lh-#{name}") do |arg|
94
+ lh_sh "#{cmd} #{arg.dump}", arg
95
+ end
96
+
97
+ meth = "override_#{name}"
98
+ respond_to? meth and __send__ meth
99
+ end
100
+
101
+ include DisplayResult
102
+
103
+ def override_ri
104
+ if locate_library "ri-ruby"
105
+ el_load "ri-ruby"
106
+ defun("lh-ri") do |x|
107
+ display_result {
108
+ ri x
109
+ unless fboundp :with_displaying_help_buffer # for FSF Emacs
110
+ other_window 1
111
+ end
112
+ }
113
+ end
114
+ end
115
+ end
116
+
117
+ def override_test0
118
+ # Mock-up for unit-test
119
+ defun("lh-test0") do |x|
120
+ newbuf(:name=>"test0", :contents=>"0\n", :display=>:pop)
121
+ end
122
+ end
123
+ end
124
+
125
+ class LangHelpInternal < ElApp
126
+ def initialize(x)
127
+ @mmode = x[:major_mode]
128
+ @dir = x[:datadir]
129
+ @efile = "#{@dir}/#{@mmode}.e"
130
+ @header = "#{@dir}/#{@mmode}-header.e"
131
+ @encoding = x[:encoding] || :euc_jp
132
+ @buffer_ctime = 0
133
+ @use_frame = x[:use_frame]
134
+ end
135
+ attr_reader :mmode, :dir, :efile, :header, :buf
136
+
137
+ def create_buffer
138
+ @buffer_ctime = Time.now
139
+ @buf = newbuf(:name => "*langhelp:#{mmode}*") do
140
+ let(:coding_system_for_read, @encoding) do
141
+ if File.exist?(header)
142
+ insert_file_contents header
143
+ goto_char point_max
144
+ insert "\n\n"
145
+ end
146
+ insert_file_contents efile
147
+ goto_char 1
148
+ end
149
+
150
+ cd dir
151
+ langhelp_menu_mode
152
+
153
+ # I do not know why `hack_local_variables' in langhelp_menu_mode does not work well.
154
+ hack_local_variables
155
+ with(:save_excursion) { lh_imenu_create_index }
156
+ end
157
+ @buf
158
+
159
+ end
160
+
161
+ def header_is_newer_than_buffer(file=@header)
162
+ File.mtime(file) > @buffer_ctime
163
+ end
164
+
165
+ def selbuf(buf)
166
+ if @use_frame
167
+ switch_to_buffer(buf)
168
+ bury_buffer(buf)
169
+ else
170
+ pop_to_buffer(buf)
171
+ end
172
+ end
173
+
174
+ def setup_buffer
175
+ if File.exist?(efile)
176
+ if @use_frame
177
+ langhelp_select_frame
178
+ else
179
+ winconf_push
180
+ end
181
+ if buffer_live_p(@buf) and not header_is_newer_than_buffer
182
+ selbuf @buf
183
+ else
184
+ selbuf create_buffer
185
+ end
186
+ yield(@buf)
187
+ end
188
+ end
189
+ end # /LangHelpInternal
190
+
191
+ class LangHelp < ElApp
192
+ def key_binding_default
193
+ {
194
+ ##### [key_binding]
195
+ 'n' => :next_line,
196
+ 'p' => :previous_line,
197
+
198
+ ## vi-like cursor movement
199
+ 'j' => :next_line,
200
+ 'k' => :previous_line,
201
+
202
+ ## follow the link
203
+ # [EVAL IT] (describe-function 'lh-goto-link)
204
+ # [EVAL IT] (describe-function 'lh-goto-link-centering)
205
+ # [EVAL IT] (describe-function 'lh-goto-link-edit)
206
+ 'l' => :lh_goto_link,
207
+ '\C-m' => :lh_goto_link,
208
+ ';' => :lh_goto_link_centering,
209
+ 'C' => :lh_goto_link_centering,
210
+ 'L' => :lh_goto_link_centering,
211
+ 'o' => :lh_goto_link_edit,
212
+ ## Kill help buffer
213
+ # [EVAL IT] (describe-function 'lh-kill-link)
214
+ 'D' => :lh_kill_link,
215
+ 'K' => :lh_kill_link,
216
+
217
+
218
+ ## Restore window configuration before langhelp-call.
219
+ '\C-c\C-c' => :winconf_pop,
220
+ 'h' => :winconf_pop,
221
+
222
+ ## scroll the langhelp buffer
223
+ ' ' => :scroll_up,
224
+ 'b' => :scroll_down,
225
+
226
+ '/' => :isearch_forward,
227
+ 's' => :isearch_forward,
228
+ 'g' => :beginning_of_buffer,
229
+
230
+ ## scroll help buffer (under the langhelp buffer)
231
+ # [EVAL IT] (describe-function 'scroll-other-window)
232
+ # [EVAL IT] (describe-function 'scroll-other-window-down)
233
+ 'v' => :scroll_other_window,
234
+ 'c' => :scroll_other_window_down,
235
+
236
+ ## Update langhelp buffer
237
+ # [EVAL IT] (describe-function 'langhelp-revert-buffer)
238
+ 'R' => :langhelp_revert_buffer,
239
+
240
+ ## bm.el : buffer bookmark.
241
+ # [EVAL IT] (describe-function 'bm-toggle)
242
+ # [EVAL IT] (describe-function 'bm-previous)
243
+ # [EVAL IT] (describe-function 'bm-next)
244
+ 'm' => :bm_toggle,
245
+ 'u' => :bm_toggle,
246
+ 'P' => :bm_previous,
247
+ 'N' => :bm_next,
248
+
249
+ ## show full index
250
+ # [EVAL IT] (describe-function 'langhelp-switch-to-index-buffer)
251
+ 'd' => :langhelp_switch_to_index_buffer,
252
+
253
+ ## narrowing
254
+ # [EVAL IT] (describe-function 'langhelp-toggle-narrowing)
255
+ '\C-c\C-n' => :langhelp_toggle_narrowing,
256
+
257
+ ## exclude
258
+ # [EVAL IT] (describe-function 'flush-lines)
259
+ 'V' => :flush_lines_whole_buffer,
260
+ 'G' => :keep_lines_whole_buffer,
261
+
262
+ ##### [/key_binding]
263
+ }
264
+ end
265
+
266
+ attr :conf
267
+
268
+ def initialize(x={})
269
+ el_require :info
270
+ el_require :cl
271
+ funcall :put, :ee_anchor_format, :safe_local_variable, :stringp
272
+ define_faces
273
+ defun_langhelp_update x
274
+ langhelp_update
275
+
276
+ defun_langhelp_menu_mode
277
+ defun_langhelp_setup_index_buffer
278
+ setup_man
279
+ setup_w3m
280
+ defun_langhelp_occur
281
+ langhelp_setup_index_buffer
282
+
283
+ defalias :lh, :progn
284
+ end
285
+
286
+ def define_faces
287
+ el4r_lisp_eval <<-EOL
288
+ (progn
289
+ (defface langhelp-sexp-face '((t (:foreground "SteelBlue" :underline t))) nil)
290
+ (defface langhelp-title-face '((t (:background "white" :foreground "black"))) nil)
291
+ (setq langhelp-sexp-face 'langhelp-sexp-face)
292
+
293
+ (setq langhelp-title-face 'langhelp-title-face)
294
+ )
295
+ EOL
296
+
297
+ end
298
+
299
+ def setup_font_lock
300
+ el4r_lisp_eval <<-'EOL'
301
+ (progn
302
+ (setq langhelp-font-lock-keywords
303
+ (list
304
+ '("^[^\n]+\\((lh[^\n]+)\\)$"
305
+ 1 langhelp-sexp-face)
306
+ '("^[^\n]+<<.+>>[^\n]*$"
307
+ 0 langhelp-title-face)
308
+ ))
309
+
310
+ (make-local-variable 'font-lock-defaults)
311
+ (setq font-lock-defaults '((langhelp-font-lock-keywords) t nil))
312
+ (make-local-variable 'font-lock-keywords)
313
+ (setq font-lock-keywords langhelp-font-lock-keywords)
314
+ (turn-on-font-lock)
315
+ )
316
+ EOL
317
+ # '
318
+ end
319
+
320
+ INDEX_BUFFER = "*langhelp index*"
321
+ def defun_langhelp_update(x)
322
+ defun(:langhelp_update, :interactive=>true) do
323
+ langhelprc = x[:langhelprc] || File.expand_path("~/.langhelp/config")
324
+ @conf = ConfigScript.new langhelprc
325
+ @use_frame = elvar.window_system && !@conf[:NO_FRAME]
326
+
327
+ conf.lang.each do |name, params|
328
+ Array[params].flatten.each do |x|
329
+ case x
330
+ when Hash
331
+ if x[:Info]
332
+ info_file = x[:Info]
333
+ dir = File.dirname(File.expand_path(info_file))
334
+ add_to_list :Info_directory_list, dir
335
+ else
336
+ command_klass, t = x.find{|k,v| k.to_s =~ %r/^[A-Z]/ and v == true }
337
+ command_klass = command_klass.to_s
338
+ if command_klass
339
+ cmd = command_klass.downcase
340
+ FindXXX.run(:name=>cmd, :cmd=>(x[:cmd] || cmd))
341
+ end
342
+ end
343
+ end
344
+ end
345
+ end
346
+
347
+ @alias2base = Hash.new{|hash,k|k}
348
+ conf.aliases.each do |base, aliases|
349
+ aliases.each do |ali|
350
+ @alias2base[ali] = base
351
+ end
352
+ end
353
+ end
354
+ end
355
+
356
+ def set_tab_width
357
+ tw = conf[:TAB_WIDTH]
358
+ if tw
359
+ elvar.tab_width = if tw <= 0
360
+ frame_width + tw
361
+ else
362
+ tw
363
+ end
364
+ end
365
+ end
366
+
367
+
368
+ def set_which_func
369
+ if locate_library "which-func"
370
+ el_require :which_func
371
+ add_to_list :which_func_modes, :langhelp_menu_mode
372
+ end
373
+ end
374
+
375
+ def defun_langhelp_menu_mode
376
+ set_which_func
377
+ defvar(:ee_anchor_format, "<<%s>>")
378
+
379
+ defvar(:langhelp_revert_buffer_function, nil)
380
+ define_derived_mode(:langhelp_menu_mode, :fundamental_mode, "LH",
381
+ "Major mode for selecting a langhelp link.") do
382
+ setup_font_lock
383
+ make_local_variable :langhelp_revert_buffer_function
384
+ elvar.truncate_lines = true
385
+ make_local_variable :outline_regexp
386
+ elvar.outline_regexp = '####\|# Node:'
387
+ make_local_variable :kill_whole_line
388
+ elvar.kill_whole_line = true
389
+ elvar.imenu_create_index_function = :lh_imenu_create_index
390
+ elvar.header_line_format = el4r_lisp_eval %('(which-func-mode ("" which-func-format))) # '
391
+ set_tab_width
392
+ which_func_mode 1 if fboundp :which_func_mode
393
+ hl_line_mode 1 if fboundp :hl_line_mode
394
+ end
395
+
396
+ suppress_keymap elvar.langhelp_menu_mode_map
397
+ key_binding = key_binding_default.update(conf[:KEY_BINDING] || {})
398
+ key_binding.each do |key, cmd|
399
+ define_key(:langhelp_menu_mode_map, key, cmd)
400
+ end
401
+ define_key :isearch_mode_map, (conf.isearch_occur_key || '\C-o'), :langhelp_isearch_occur
402
+ define_key :global_map, conf.langhelp_key, :langhelp if conf.langhelp_key
403
+
404
+ end
405
+
406
+ defun(:lh_goto_link, :interactive=>true,
407
+ :docstring=>"Follow link in this line and put point on screen top.
408
+ Internally eval sexp at the EOL.") do
409
+ b = current_buffer
410
+ end_of_line
411
+ backward_sexp
412
+ sexp = funcall :read, current_buffer
413
+ beginning_of_line
414
+ pt = point
415
+ funcall :eval, sexp
416
+ end
417
+
418
+ defvar(:langhelp_centering, nil)
419
+ defvar(:langhelp_flash, nil)
420
+ defun(:lh_goto_link_centering, :interactive=>true,
421
+ :docstring=>"Follow link in this line and center point in window.") do
422
+ let(:langhelp_centering, true,
423
+ :langhelp_flash, true) do
424
+ lh_goto_link
425
+ end
426
+ end
427
+
428
+ defvar(:langhelp_edit, nil)
429
+ defun(:lh_goto_link_edit, :interactive=>true,
430
+ :docstring=>"Follow link in this line and select the help window to edit.") do
431
+ let(:langhelp_edit, true,
432
+ :langhelp_centering, true) do
433
+ lh_goto_link
434
+ end
435
+ end
436
+
437
+ defun(:lh_kill_link, :interactive=>true,
438
+ :docstring=>"Kill the help window buffer.") do
439
+ with(:save_selected_window) do
440
+ other_window 1
441
+ kill_this_buffer
442
+ end
443
+ end
444
+
445
+ el4r_lisp_eval %q(
446
+ (defun lh-imenu-create-index ()
447
+ (goto-char 1)
448
+ (let ((search-re (format ee-anchor-format "\\\\(.+\\\\)"))
449
+ alist a p)
450
+ (while (re-search-forward search-re nil t)
451
+ (setq a (match-string 1)
452
+ p (match-beginning 0))
453
+ (unless (string= a "%s")
454
+ (setq alist (cons (cons a p) alist))))
455
+ (setq imenu--index-alist alist))
456
+ nil))
457
+
458
+ import_function :byte_compile
459
+ byte_compile :lh_imenu_create_index
460
+
461
+ defun(:langhelp_switch_to_index_buffer, :interactive=>true,
462
+ :docstring=>"Switch to *langhelp index* buffer.") do
463
+ unless get_buffer INDEX_BUFFER
464
+ langhelp_setup_index_buffer
465
+ end
466
+ switch_to_buffer INDEX_BUFFER
467
+ goto_char 1
468
+ end
469
+
470
+ # todo EGREP
471
+ defun(:flush_lines_whole_buffer,
472
+ :docstring=>"Delete lines containing matches for REGEXP.",
473
+ :interactive=>lambda{keep_lines_read_args("Flush lines (containing match for regexp): ")}) do |re|
474
+ with(:save_restriction) do
475
+ widen
476
+ flush_lines re, 1, point_max_marker
477
+ end
478
+ end
479
+
480
+ defun(:keep_lines_whole_buffer,
481
+ :docstring=>"Delete all lines except those containing matches for REGEXP.",
482
+ :interactive=>lambda{keep_lines_read_args("Keep lines (containing match for regexp): ")}) do |re|
483
+ with(:save_restriction) do
484
+ widen
485
+ keep_lines re, 1, point_max_marker
486
+ end
487
+ end
488
+
489
+
490
+
491
+ def real_mmode
492
+ @alias2base[symbol_name(getq(:major_mode)).sub(/-mode/, '')]
493
+ end
494
+
495
+ defun(:langhelp, :interactive=>"p",
496
+ :docstring=>"Open the langhelp buffer according to major-mode and prepare isearch.
497
+ With prefix arg, open the *langhelp index* buffer instead of major-mode's langhelp buffer.") do |narg|
498
+ # mmode = symbol_name(getq(:major_mode)).sub(/-mode/, '').gsub(/-/,'_')
499
+ mmode = real_mmode
500
+ if narg == 16
501
+ langhelp_at_point
502
+ elsif [1,nil].include?(narg) and conf.lang[mmode]
503
+ i = LangHelpInternal.new(:major_mode=>mmode, :datadir=>conf[:LANGHELP_HOME], :encoding=>conf[:ENCODING], :use_frame=>@use_frame)
504
+ i.setup_buffer do
505
+ isearch_forward
506
+ end
507
+ else
508
+ if @use_frame
509
+ langhelp_select_frame
510
+ else
511
+ winconf_push
512
+ end
513
+ langhelp_switch_to_index_buffer
514
+ let(:migemo_isearch_enable_p, nil) { isearch_forward }
515
+ end
516
+ end
517
+
518
+ defun(:langhelp_at_point, :interactive=>true,
519
+ :docstring=>"Open the langhelp buffer according to major-mode and point.") do
520
+ word = sexp_at_point.to_s.gsub(/_/, '[_-]')
521
+ mmode = real_mmode
522
+ i = LangHelpInternal.new(:major_mode=>mmode, :datadir=>conf[:LANGHELP_HOME], :encoding=>conf[:ENCODING], :use_frame=>@use_frame)
523
+ i.setup_buffer do
524
+ re = '\b' + word # + '\b'
525
+ langhelp_occur re
526
+ end
527
+ end
528
+
529
+ defun(:langhelp_revert_buffer_default, :interactive=>true,
530
+ :docstring=>"Reread info of this langhelp buffer.") do
531
+ # TODO: do not use buffer_name
532
+ mmode = buffer_name.scan(/\*langhelp:(.+)\*/).to_s
533
+ p = point
534
+ i = LangHelpInternal.new(:major_mode=>mmode, :datadir=>conf[:LANGHELP_HOME], :encoding=>conf[:ENCODING])
535
+ i.create_buffer
536
+ goto_char p
537
+ end
538
+
539
+ defun(:langhelp_revert_buffer, :interactive=>true,
540
+ :docstring=>"Reread and update this langhelp buffer.
541
+ If `langhelp-revert-buffer-function' is specified, use it.
542
+ Otherwise `langhelp-revert-buffer-default' is used.") do
543
+ if elvar.langhelp_revert_buffer_function
544
+ el4r_lisp_eval %q((funcall langhelp-revert-buffer-function))
545
+ else
546
+ langhelp_revert_buffer_default
547
+ end
548
+ end
549
+
550
+ def defun_langhelp_setup_index_buffer
551
+ defun(:langhelp_setup_index_buffer) do
552
+ index_content = conf.lang.sort.map {|lang, params|
553
+ %Q!# (lh-language-index "#{lang}")\n!
554
+ }.join
555
+ newbuf(:name=>INDEX_BUFFER, :contents=>index_content, :point=>1) {
556
+ langhelp_menu_mode
557
+ elvar.imenu_create_index_function = nil
558
+ }
559
+ end
560
+ end
561
+
562
+ defun(:lh_language_index,
563
+ :docstring=>"Open the LANG's langhelp index.") do |lang|
564
+ # TODO: do not use buffer_name
565
+ unless get_buffer "*langhelp:#{lang}*"
566
+ i = LangHelpInternal.new(:major_mode=>lang, :datadir=>conf[:LANGHELP_HOME], :encoding=>conf[:ENCODING])
567
+ i.create_buffer
568
+ end
569
+ switch_to_buffer "*langhelp:#{lang}*"
570
+ end
571
+
572
+ el4r_lisp_eval <<'EOL'
573
+ (defun langhelp-select-frame ()
574
+ (let ((get (lambda ()
575
+ (find-if (lambda (frame)
576
+ (equal (cdr (assq 'title (frame-parameters frame)))
577
+ "langhelp"))
578
+ (frame-list))))
579
+ (make (lambda ()
580
+ (if (boundp 'langhelp-frame-alist)
581
+ (make-frame `((title . "langhelp") ,@langhelp-frame-alist))
582
+ (make-frame '((title . "langhelp"))))))
583
+ (select (lambda (frm)
584
+ (select-frame frm)
585
+ (raise-frame frm)
586
+ (delete-other-windows))))
587
+ (funcall select (or (funcall get) (funcall make)))))
588
+ EOL
589
+ # `
590
+
591
+ include DisplayResult
592
+
593
+ defvar(:in_langhelp, nil)
594
+ defun(:__lh_ow) do |sexp|
595
+ let(:in_langhelp, true) do
596
+ display_result(:preserve=>true) do
597
+ funcall(:eval,sexp)
598
+ end
599
+ end
600
+ end
601
+
602
+ el4r_lisp_eval %(
603
+ (defmacro lh-ow (sexp)
604
+ "Eval SEXP and display result in other window."
605
+ `(--lh-ow ',sexp))) # '`
606
+
607
+ defun(:lh_sh,
608
+ :docstring=>"Hyperlink to the output of shell commands") do |command, line|
609
+ display_result(:line=>line) do
610
+ if get_buffer command
611
+ switch_to_buffer command
612
+ else
613
+ switch_to_buffer command
614
+ let(:coding_system_for_read, conf[:ENCODING],
615
+ :max_mini_window_height, 1) do
616
+ shell_command command, command
617
+ set_buffer command
618
+ #insert shell_command_to_string(command)
619
+ end
620
+ view_mode 1
621
+ end
622
+ end
623
+ end
624
+
625
+
626
+ defun(:lh_view, :interactive=>true,
627
+ :docstring=>"Hyperlink to text files. (view-mode)") do |line, filename|
628
+ display_result(:line=>line) do
629
+ view_file filename
630
+ end
631
+ end
632
+
633
+ defun(:lh_file, :interactive=>true,
634
+ :docstring=>"Hyperlink to text files.") do |line, filename|
635
+ display_result(:line=>line) do
636
+ find_file filename
637
+ end
638
+ end
639
+
640
+ defun(:lh_anchor, :interactive=>true,
641
+ :docstring=>"Hyperlink to anchors.") do |anchor, filename|
642
+ display_result(:anchor=>anchor) do
643
+ view_file filename
644
+ end
645
+ end
646
+
647
+
648
+ def setup_man
649
+ defalias :lh_man, :man
650
+
651
+ defvar :lh_man_line
652
+ defadvice(:Man_notify_when_ready, :around, :lh_man, :activate) do
653
+ if elvar.lh_man_line
654
+ display_result(:line=>elvar.lh_man_line) do
655
+ switch_to_buffer elvar.man_buffer
656
+ end
657
+ elvar.lh_man_line = nil
658
+ else
659
+ ad_do_it
660
+ end
661
+ end
662
+
663
+ end
664
+
665
+ defun("lh-man*", :docstring=>"Hyperlink to manpage.") do |line, manpage|
666
+ elvar.lh_man_line = line
667
+ man manpage
668
+ end
669
+
670
+ defun(:lh_info,
671
+ :docstring=>"Hyperlink to Info.") do |line, book|
672
+ let(:same_window_buffer_names,nil,
673
+ :same_window_regexps, nil) do
674
+ bufname = "*info*<langhelp>"
675
+ display_result(:line=>line) do
676
+ set_buffer(get_buffer_create(bufname))
677
+ Info_mode() unless elvar.major_mode.to_s == "Info-mode"
678
+ Info_goto_node(book)
679
+ end
680
+ end
681
+ end
682
+
683
+
684
+
685
+ defun(:lh_to, :interactive=>"sAnchor: ",
686
+ :docstring=>"Go to the anchor.") do |anchor|
687
+ winconf_push
688
+ search_anchor anchor
689
+ end
690
+
691
+
692
+
693
+ def abbreviate_url
694
+ abbreviate_file_name((elvar.w3m_current_url || '').sub(%r!^file://!,''))
695
+ end
696
+
697
+ def setup_w3m
698
+ ## for speed
699
+ el4r_lisp_eval %q(
700
+ (defun w3m-list-buffer-names ()
701
+ (mapcar (lambda (b) (buffer-name b)) (w3m-list-buffers)))
702
+ )
703
+ byte_compile :w3m_list_buffer_names
704
+
705
+ @w3m_buffers_cache = {}
706
+ defun(:langhelp_w3m_fontify_after_hook0) do
707
+ b = buffer_name
708
+ url = abbreviate_url
709
+ @w3m_buffers_cache[b] = [url,b]
710
+ end
711
+ add_hook :w3m_fontify_after_hook, :langhelp_w3m_fontify_after_hook0
712
+
713
+ end
714
+
715
+ defun(:lh_w3m, :interactive=>true,
716
+ :docstring=>"Hyperlink to files in HTML.") do |line, filename|
717
+ display_result(:line=>line, :w3m=>true) do
718
+ el_require :w3m
719
+ filename.sub!(%r!file://!, '')
720
+ filename = abbreviate_file_name filename
721
+ filename, name_anchor = filename.split(/#/,2)
722
+ urlfile = w3m_expand_file_name_as_url filename
723
+ url, buf = w3m_list_buffer_names.to_a.map{|b|
724
+ unless @w3m_buffers_cache[b]
725
+ with(:with_current_buffer,b){
726
+ @w3m_buffers_cache[b] = [abbreviate_url, b]
727
+ }
728
+ end
729
+ @w3m_buffers_cache[b]
730
+ }.find {|url, buf|
731
+ url == filename
732
+ }
733
+ if buf
734
+ funcall :message, "reuse #{buf} buffer"
735
+ switch_to_buffer buf
736
+ else
737
+ w3m(urlfile, true)
738
+ end
739
+ if name_anchor
740
+ w3m_search_name_anchor name_anchor
741
+ else
742
+ goto_char 1
743
+ end
744
+ end
745
+ end
746
+
747
+ defun(:langhelp_isearch_occur, :interactive=>true,
748
+ :docstring=>"Invoke `langhelp-occur' from within isearch.") do
749
+ let(:case_fold_search, elvar.isearch_case_fold_search) do
750
+
751
+ re = if elvar.isearch_regexp
752
+ elvar.isearch_string
753
+ else
754
+ regexp_quote(elvar.isearch_string)
755
+ end
756
+
757
+ if elvar.major_mode.to_s == "langhelp-menu-mode"
758
+ isearch_exit
759
+ langhelp_occur re
760
+ else
761
+ occur re
762
+ end
763
+ end
764
+ end
765
+
766
+ def defun_langhelp_occur
767
+ if conf.occur_by_grep
768
+ defun(:langhelp_occur, :interactive=>true,
769
+ :docstring=>"Show all lines in the current buffer containing a match for isearch.") do |re|
770
+ occur_buf = generate_new_buffer "*langhelp occur /#{re}/*"
771
+ re = re + "|<<<.+>>>"
772
+
773
+ let(:display_buffer_function, :switch_to_buffer) do
774
+ shell_command_on_region(point_min, point_max, "grep -E -i -- #{re.dump}", occur_buf)
775
+ switch_to_buffer occur_buf
776
+ langhelp_menu_mode
777
+ end
778
+ end
779
+ else
780
+ defun(:langhelp_occur, :interactive=>true,
781
+ :docstring=>"Show all lines in the current buffer containing a match for isearch.") do |re|
782
+ occur_buf = generate_new_buffer "*langhelp occur [#{re}]*"
783
+ re = re + "\\|<<<.+>>>"
784
+ empty = true
785
+ with(:save_excursion) do
786
+ while re_search_forward(re, nil, true)
787
+ empty = false
788
+ line = thing_at_point :line
789
+ with(:with_current_buffer, occur_buf) do
790
+ insert line
791
+ end
792
+ end
793
+ end
794
+ unless empty
795
+ switch_to_buffer occur_buf
796
+ goto_char point_min
797
+ langhelp_menu_mode
798
+ end
799
+ end
800
+ end
801
+ end
802
+
803
+ def narrowing?
804
+ buffer_size != point_max-1 or point_min != 1
805
+ end
806
+
807
+ defun(:langhelp_narrow_to_section, :interactive=>true,
808
+ :docstring=>"Restrict showing in this buffer to the current section.") do
809
+ anchor_re = format(elvar.ee_anchor_format, '\(.+\)')
810
+ s, e = nil
811
+ with(:save_excursion) do
812
+ end_of_line
813
+ re_search_backward(anchor_re, nil, true)
814
+ s = point
815
+ end_of_line
816
+ if re_search_forward(anchor_re, nil, true)
817
+ beginning_of_line
818
+ else
819
+ goto_char point_max
820
+ end
821
+ e = point
822
+ end
823
+
824
+ narrow_to_region s, e
825
+ end
826
+
827
+ defun(:langhelp_toggle_narrowing, :interactive=>true,
828
+ :docstring=>"Toggle narrowing to the current section.") do
829
+ if narrowing?
830
+ widen
831
+ else
832
+ langhelp_narrow_to_section
833
+ end
834
+ end
835
+
836
+ el4r_lisp_eval %q(
837
+ (defmacro lh-center (&rest body)
838
+ `(progn
839
+ ,@body
840
+ (save-selected-window
841
+ (other-window 1)
842
+ (recenter '(1)))))) #'`
843
+
844
+ defun(:langhelp_test_definition, :interactive=>"sLanghelp doc definition: ",
845
+ :docstring=>"Issue `mklanghelp --eval' for input") do |docdef|
846
+ docdef = docdef.sub(/,\s*$/,'')
847
+ shell_command "mklanghelp --eval='#{docdef}'"
848
+ end
849
+
850
+ defun(:langhelp_test_definition_this_line, :interactive=>true,
851
+ :docstring=>"Issue `mklanghelp --eval' for this line") do
852
+ langhelp_test_definition(buffer_substring(point_at_bol, point_at_eol))
853
+ end
854
+
855
+ end #/LangHelp::LangHelp
856
+
857
+ # (lh-sh "(echo a;echo b)" "b")
858
+ # (el4r-ruby-eval "LangHelp.run")
859
+
860
+ end #/LangHelp
861
+
862
+ # Local Variables:
863
+ # modes: (el4r-mode emacs-lisp-mode)
864
+ # End: