forked from ChasManRors/ecb
-
Notifications
You must be signed in to change notification settings - Fork 20
/
ecb-help.el
657 lines (526 loc) · 26.7 KB
/
ecb-help.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
;;; ecb-help.el --- online help for ECB and bug reporting
;; Copyright (C) 2001 Jesper Nordenberg
;; Copyright (C) 2001 Free Software Foundation, Inc.
;; Copyright (C) 2001 Klaus Berndl <klaus.berndl@sdm.de>
;; Author: Klaus Berndl <klaus.berndl@sdm.de>
;; Maintainer: Klaus Berndl <klaus.berndl@sdm.de>
;; Keywords: java, class, browser
;; This program is free software; you can redistribute it and/or modify it
;; under the terms of the GNU General Public License as published by the Free
;; Software Foundation; either version 2, or (at your option) any later
;; version.
;; This program is distributed in the hope that it will be useful, but WITHOUT
;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
;; more details.
;; You should have received a copy of the GNU General Public License along
;; with GNU Emacs; see the file COPYING. If not, write to the Free Software
;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
;;; Commentary:
;;
;; Contains all online-help for ECB (stolen something from recentf.el)
;; $Id$
;;; Code
(require 'ecb-layout)
(defconst ecb-help-message
"
===================
General description
===================
ECB is a global minor-mode which offers a few ECB-windows for browsing your
sources comfortable with the mouse and the keyboard. There are currently three
different types of ECB-windows:
1. ECB Directories:
- Select directories \(and - if enabled - source files) in the \"*ECB
Directories*\" buffer by clicking a mouse button (see \"Usage of ECB\"
below) on the directory name or by hitting ENTER/RETURN when the cursor is
placed on the item line.
- Directory names with a \"[+]\" symbol after \(or before) them can be
expanded/collapsed by clicking on the symbol, pressing the TAB key when the
cursor is placed on the package line or clicking a mouse button (see \"Usage
of ECB\" below) on the item.
- Right clicking on an item will open a popup menu where different operations
on the item under the mouse cursor can be performed.
- Pressing F1 in the directories buffer will update it. Pressing F2 will open
the ECB customization group in the edit window ECB Sources:
2. ECB Sources:
- Source files can be selected by clicking a mouse button (see \"Usage of
ECB\" below) or hitting ENTER/RETURN on the source row in the \"*ECB
Sources*\" or \"*ECB History*\" windows.
IMPORTANT: If you hold down the SHIFT-key while clicking with the primary
mouse button (see \"Usage of ECB\" below) on a source row in the \"*ECB
Sources*\" or \"*ECB History*\" windows then the source will not be
displayed in the edit-window but it will be scanned in the background and
all it´s methods and variables are listed in the \"ECB Methods\" window. So
you can get an overlook over the source without changing the buffer in the
edit-window.
- Clicking on the source file with the secondary mouse button (see \"Usage of
ECB\" below) will open the class file in the other edit window.
- Right clicking on a source file will open a popup menu where different
operation on the item under the mouse cursor can be performed.
3. ECB Methods:
- The \"*ECB Methods*\" buffer contains the methods \(and variables, if you
want) in the selected source file. When a method/variable is selected with
the primary mouse button (see \"Usage of ECB\" below) or ENTER/RETURN the
edit buffer will jump to the method/variable.
- Clicking on a method/variable with the secondary mouse button (see \"Usage
of ECB\" below) will jump to the method in the other edit window.
In addition to these ECB-windows you have always one or two edit-windows in
the ECB-frame and \(if you want) at the bottom a compilation-window, where all
the output of Emacs-compilation \(compile, grep etc.) is shown.
===========================
Activation and deactivation
===========================
Call M-x `ecb-activate' and M-x `ecb-deactivate' to activate or deactivate
ECB. If you want ECB started in a new frame see the option
`ecb-new-ecb-frame' \(default is nil). `ecb-activate' always raises and
selects the ECB-frame even if ECB is already started.
Because ECB is a global minor-mode it can also be (de)activated/toggled by
M-x `ecb-minor-mode'.
============
Usage of ECB
============
Working with the mouse in the ECB-buffers:
------------------------------------------
Normally you get best usage if you use ECB with a mouse.
ECB distinguishes between a primary and a secondary mouse-button:
A click with the primary button causes the main effect in each ECB-buffer:
- ECB Directories: Expanding/collapsing nodes and displaying files in the ECB
Sources buffer.
- ECB sources/history: Opening the file in that edit-window specified by the
option `ecb-primary-mouse-jump-destination'.
- ECB Methods: Jumping to the method in that edit-window specified by the
option `ecb-primary-mouse-jump-destination'.
Per default the complete node-name of an item in a tree-buffer is displayed in
the echo-area if the mouse moves over it, regardless if the related window is
the active one or not \(for this see also the option
`ecb-show-node-name-in-minibuffer'). You get the same effect if you click with
the primary mouse-button onto a node while SHIFT is held.
IMPORTANT: Doing this SHIFT-click in the \"*ECB Sources*\" or \"*ECB
History*\" windows does not only show the node in the echo-area but it also
opens the clicked source only in the background and shows all its
methods/variables in \"ECB Methods\"; the buffer of the edit-window is not
changed! This is very useful to get only an overlook for a certain source.
The secondary mouse-button is for opening \(jumping to) the file in the other
window \(see the documentation `ecb-primary-mouse-jump-destination').
With the option `ecb-primary-secondary-mouse-buttons' the following
combinations of primary and secondary mouse-buttons are possible:
- primary: mouse-2, secondary: C-mouse-2 \(means mouse-2 while CTRL-key is
pressed). This is the default setting.
- primary: mouse-1, secondary: C-mouse-1
- primary: mouse-1, secondary: mouse-2
If you change this during ECB is activated you must deactivate and activate
ECB again to take effect
In each ECB-buffer mouse-3 \(= right button) opens a special context
popup-menu for the clicked item where you can choose several senseful actions.
Working with the keyboard in the ECB-buffers:
---------------------------------------------
In the ECB-buffers RET and TAB work as primary \"buttons\" \(see above), means
RET selects a directory or opens a source or jumps to a method and TAB toggles
expanding/collapsing of an expandable node.
Incremental search for a node in current tree-buffer. Each displayable key
\(e.g. all keys normally bound to `self-insert-command') is appended to the
current seach-pattern. The tree-buffer tries to jump to the first node which
matching the current search-pattern either as substring or as prefix \(see
below). If no match is found then nothing is done. There are some special
keys:
- \[backspace] and \[delete]: Delete the last character from the search-pattern.
- \[home]: Delete the complete search-pattern
- \[end]: Expand either to a complete node if current search-pattern is
already unique or expands to the greates common substring or prefix
of the nodes.
For better overlooking the current search-pattern is shown in the echo area.
After selecting a node with RET the search-pattern is cleared out.
With `ecb-tree-incremental-search' you can specify if the current
search-pattern must be a real prefix of the node \(default) or if any
substring is matched.
For faster and easier finding the right node in a ecb-window thi incremental
search ignores the following non interesting stuff:
+ any leading spaces
+ expand/collapse-buttons: [+] resp. [-]
+ protection-signs (+, -, #) in the method-window if uml-notation is used
+ variables types or returntypes in front of variable- or method-names.
+ const specifier for variables
This means: Just type in the prefix \(resp. a substring) of a class-,
variable-, method-, directory- or filename and ECB will bring you as fast as
possible to the node you want.
Tip: The `ecb-minor-mode' offers you in the `ecb-mode-map' some keys for
selecting every window of the ecb-frame. This makes window-selection a child´s
play. For example you can jump into the method-window by hitting \"C-c . m\".
Working with the edit-window of ECB:
------------------------------------
ECB offers you all what you need to work with the edit-window as if the
edit-window would be the only window of the ECB-frame.
ECB offers you to advice the following functions so they work best with ECB
- `other-window'
- `delete-window'
- `delete-other-windows'
- `split-window-horizontally'
- `split-window-vertically'
- `switch-to-buffer'
- `switch-to-buffer-other-window'
- `other-window-for-scrolling'
The behavior of the adviced functions is:
- All these adviced functions behaves exactly like their corresponding
original functons but they always act as if the edit-window\(s) of ECB would
be the only window\(s) of the ECB-frame. So the edit-window\(s) of ECB seems
to be a normal Emacs-frame to the user.
- If called in a not edit-window of ECB all these function jumps first to the
\(first) edit-window, so you can never destroy the ECB-window layout
unintentionally.
- If called in another frame than the ECB-frame these functions behave exactly
like the not adviced original versions!
**Attention**:
If you want to work within the edit-window with splitting and unsplitting the
edit-window\(s) it is highly recommended to use the adviced-functions of ECB
instead of the original Emacs-functions \(see above). For example the adviced
`other-window' can only work correctly if you split the edit window with the
adviced `split-window-vertically' \(or horizontally) and NOT with the original
`split-window-vertically'!
Per default ECB does advice all of the functions mentioned above but with the
option `ecb-advice-window-functions' you can customizes which functions should
be adviced by ECB. Please read carefully the documentation of this option!
Temp-buffer and compilation-buffer display in ECB:
--------------------------------------------------
If you call any help in Emacs, e.g. by calling `describe-function', or if you
do a completion in the minibuffer, then Emacs displays the result-buffer in
another window. This behavior you have also in ECB. If the edit-window is
already splitted then the temp-buffer is displayed in the \"other\"
edit-window otherwise the edit-window will be splitted first. The variables
`temp-buffer-max-height' and `temp-buffer-resize-mode' work also correctly
with ECB.
Same for all compilation output-buffers \(e.g. after a `compile' or `grep')
and the variable `compilation-window-height'.
This is default behavior of ECB. But there is also another way to display such
buffers:
With the option `ecb-compile-window-height' you can define if the ECB layout
should contain per default a compilation-window at the bottom \(and if yes the
height of it). If yes ECB displays all output of compilation-mode \(compile,
grep etc.) in this special window. Same for displaying help-buffers or similar
stuff.
With the option `ecb-compile-window-temporally-enlarge' you can allow Emacs to
enlarge temporally the ECB-compile-window after finishing compilation-output.
Please read the comment of this option.
But because ECB works best without such a durable compilation-window you
should read the comments of these two option carefully!
Rebuilding the ECB-method buffer:
---------------------------------
In almost all cases there is NO need to manually rebuild the method-buffer,
because it is always done automatically if necessary. But nevertheless there
exist a few rare scenarios where a complete manual rebuild is necessary. Here
are some of them:
+ If an elisp-file is parsed which contains a defun X in the middle where the
closing ) is missing, then semantic parses only until this defun X is reached
and you will get an incomplete ECB-method buffer. In such a case you must
complete the defun X and then completely reparse the elisp-file and rebuild
the ECB method buffer!
+ If you change only the name of a method or a variable and you want the new
name be shown immediately in the ECB-method buffer then you must call this
function.
A complete manually rebuild is done by `ecb-rebuild-methods-buffer'.
Redrawing the ECB-layout:
-------------------------
If you have unintenionally destroyed the ECB-layout, you can always restore the
layout with calling `ecb-redraw-layout'. This is even true, if you get
messages like \"wrong-type-argument window-live-p #<window 222>\".
Hiding/Showing the ECB windows:
-------------------------------
With `ecb-toggle-ecb-windows' you can hide/show all the ECB windows without
changing the activation state of ECB and also without deactivating the advices
for `delete-other-windows' and/or `delete-window'. This is most useful if you
use layout nr.10 \(see \"Tips and tricks\" below) or if you want to have
maximum space for editing and you don´t need the browsing windows all the
time.
Available interactive ECB commands:
-----------------------------------
- `ecb-minor-mode'
- `ecb-activate'
- `ecb-deactivate'
- `ecb-update-directories-buffer'
- `ecb-current-buffer-sync' \(normally not needed)
- `ecb-rebuild-methods-buffer' \(see \"Rebuilding the ECB-method buffer\")
- `ecb-redraw-layout'
- `ecb-clear-history'
- `ecb-show-help'
- `ecb-submit-problem-report'.
- `ecb-goto-window-directories' \(and much more `ecb-goto-window...'
functions)
- `ecb-toggle-ecb-windows'
Most of these functions are also available via the menu \"ECB\" and also via
the ECB keymap with prefix \"C-c .\" \(see `ecb-minor-mode' for a complete
list of the keybindings).
====================
Customization of ECB
====================
All customization of ECB is divided into the following customize groups:
- ecb-general: General customization of ECB
- ecb-directories: Customization of the ECB-directories buffer.
- ecb-sources: Customization of the ECB-sources buffer.
- ecb-methods: Customization of the ECB-methods buffer.
- ecb-history: Customization of the ECB-history buffer.
- ecb-layout: Customization of the layout of ECB.
You can highly customize all the ECB behavior/layout so just go to this groups
and you will see all well documented ECB-options. The easiest access for this
customize groups is via the menu \"ECB\".
Here are the most important options \(it is recommended to check the
following options before working with ECB):
- `ecb-source-path': You must set this option!
- `ecb-new-ecb-frame': Should ECB create a new frame at activation time.
- `ecb-primary-secondary-mouse-buttons', `ecb-primary-mouse-jump-destination':
Define how to use the mouse.
- `ecb-tree-expand-symbol-before' and `ecb-tree-indent' \(maybe you like a
value of 4 for the latter one if you display the expand-symbol before!).
- `ecb-source-file-regexps': Which files will \(not) be shown in ECB.
- `ecb-show-node-name-in-minibuffer': When the complete nodename should be
displayed in the minibuffer? Default is when the mouse moves over it and the
nodename is longer than the window-width.
- `ecb-layout-nr': The ECB layout, means which windows you want to be
displayed in the ECB-frame and also the location of these windows.
- All the options in the customize group 'ecb-layout'
===========================
Submitting a problem report
===========================
If you run into problems with ECB you can/should send a problem report to the
ECB mailing list \(ecb-list@lists.sourceforge.net). ECB offers you a command
which does all necessary for you to send a problem report. Just call
`ecb-submit-problem-report'! Please read the documentation of this command.
This command creates a problem-report buffer for you. After that you get a
menu \"Mail\" \(dependend on the mail-package used, the menu can have a
different name) with commands to send the problem report. But for this the
varibale `mail-user-agent' must be configured right for your system. If you
can´t get working this mechanism you can simply copy the whole problem-report
buffer after filling it out and sending it with your standard mail-client to
<ecb-list@lists.sourceforge.net>!
===============
Tips and tricks
===============
Working with small screens:
---------------------------
If your screen is very small so you need every sqare-centimeter for displaying
the buffer which you want to edit, ECB offers you a special layouts, where
only the ECB-methods buffer is displayed on top or on left-side. Here comes
what you should/can do to work best with ECB in such a situation:
- First customize your ECB:
1. Customize `ecb-layout-nr' to layout nr. 10 \(on top) or nr. 11 \(on left-side)
2. Ensure that `ecb-compile-window-height' is nil.
3. Optional: Ajust the `ecb-windows-height' resp. `ecb-windows-width'.
4. Save your changes.
- To edit your buffers:
Call `ecb-toggle-ecb-windows' \(also available via the menu \"ECB\" and by
\"C-c . t\") or `ecb-hide-ecb-windows' to hide the ECB-method buffer so you
get all the place of your screen for editing.
- To browse and select functions:
Call `ecb-toggle-ecb-windows' or `ecb-show-ecb-windows' to make the
ECB-method buffer visible if not already. If you want select a
method/variable with the keyboard instead with the mouse you should read the
section \"Working with the keyboard in the ECB-buffers\" in this online
help!
The possibility of hiding temporally the ECB windows like described above is
also useful for all the other layouts.
Simulating speedbar without an extra frame:
-------------------------------------------
You can simuate a speedbar-like layout within ONE frame by doing the following:
1. Customize `ecb-layout-nr' to layout nr. 11
2. Optional: Ensure that `ecb-compile-window-height' is nil.
3. Optional: Ajust the `ecb-windows-width'.
4. Save your changes.
==================================
Entry points for elisp programmers
==================================
Variables an elisp-program can use:
- `ecb-source-path-functions'
Available hooks:
- `ecb-activate-before-new-frame-created-hook'
- `ecb-activate-before-layout-draw-hook'
- `ecb-activate-hook'
- `ecb-deactivate-hook'
Look at the documentation of these variables and hooks to get description.
===================================
Known conflicts with other packages
===================================
Here is a list of known conflicts of ECB with other packages and helpful
solutions/hints/workarounds:
1. Package VC
The variable `vc-delete-logbuf-window' must be set to nil during active
ECB. This can be done with the hooks mentioned above.
2. Package follow-mouse.el
ECB works very well with follow-mouse if follow-mouse is turned on BEFORE
ECB is activated \(e.g. within the `ecb-activate-hook'). But if you
activate follow-mouse first after ECB is already activated, then the
follow-mouse stuff prevents the complete node-name to be displayed in the
echo-area if mouse moves over it.
Because ECB has a much more intelligent mouse tracking mechanism than
follow-mouse the follow-mouse stuff profit from ECB and works even better
and saver as without activated ECB!
3. Package avoid.el
With GNU Emacs ECB must deactivate `mouse-avoidance-mode' if the option
`ecb-show-node-name-in-minibuffer' is set to either 'if-too-long or
'always. This is only be done as long ECB is activated.
")
(defconst ecb-help-buffer-name "*ECB help*")
(defvar ecb-buffer-before-help nil)
(defun ecb-cancel-dialog (&rest ignore)
"Cancel the ECB dialog."
(interactive)
(kill-buffer (current-buffer))
(if ecb-buffer-before-help
(switch-to-buffer ecb-buffer-before-help t))
(setq ecb-buffer-before-help nil)
(message "ECB dialog canceled."))
(defvar ecb-dialog-mode-map nil
"`ecb-dialog-mode' keymap.")
(if ecb-dialog-mode-map
()
(setq ecb-dialog-mode-map (make-sparse-keymap))
(define-key ecb-dialog-mode-map "q" 'ecb-cancel-dialog)
(define-key ecb-dialog-mode-map (kbd "C-x k") 'ecb-cancel-dialog)
(set-keymap-parent ecb-dialog-mode-map help-mode-map))
(defun ecb-dialog-mode ()
"Major mode used to display the ECB-help
These are the special commands of `ecb-dialog-mode' mode:
q -- cancel this dialog."
(interactive)
(setq major-mode 'ecb-dialog-mode)
(setq mode-name "ecb-dialog")
(use-local-map ecb-dialog-mode-map))
(defun ecb-show-help ()
"Shows the online help of ECB."
(interactive)
(when (not (ecb-point-in-edit-window))
(ecb-select-edit-window))
(if (get-buffer ecb-help-buffer-name)
(switch-to-buffer ecb-help-buffer-name t)
(if (not ecb-buffer-before-help)
(setq ecb-buffer-before-help (current-buffer)))
(with-current-buffer (get-buffer-create ecb-help-buffer-name)
(switch-to-buffer (current-buffer) t)
(kill-all-local-variables)
(let ((inhibit-read-only t))
(erase-buffer))
(let ((all (overlay-lists)))
;; Delete all the overlays.
(mapcar 'delete-overlay (car all))
(mapcar 'delete-overlay (cdr all)))
;; Insert the dialog header
(insert "Type \"q\" to quit.\n")
(insert ecb-help-message)
(insert "\n\n")
(make-variable-buffer-local 'buffer-read-only)
(setq buffer-read-only t)
(ecb-dialog-mode)
(goto-char (point-min))
(ignore-errors (help-make-xrefs))
(goto-char (point-min)))))
;;
;; Problem reporting functions stolen from JDE
;;
(defvar ecb-problem-report-mail-address "ecb-list@lists.sourceforge.net" )
(defconst ecb-problem-report-message
"Please enter the details of your bug report here")
(defun ecb-submit-problem-report()
"Submit a problem report for the ECB to the ECB mailing-list. This command
generates in the edit-window a problem-report which contains already the
current values of all ECB options, the current backtrace-buffer if there is
any and the current message-buffer. You will be asked for a problem-report
subject and then you must insert a description of the problem. Please describe
the problem as detailed as possible!"
(interactive)
(if (not (ecb-point-in-edit-window))
(ecb-select-edit-window))
(if (not (locate-library "reporter"))
(error "You need the reporter.el package to submit a bugreport for ECB!")
(require 'reporter)
(and
(y-or-n-p "Do you want to submit a problem report on the ECB? ")
(progn
(message "Preparing problem report...")
;;prepare the basic buffer
;; (let ((reporter-prompt-for-summary-p "Subject of the report: "))
(reporter-submit-bug-report
ecb-problem-report-mail-address
(format "ECB: %s, Semantic: %s, JDE: %s"
ecb-version
(if (boundp 'semantic-version)
semantic-version
"<=1.3.3")
(if (boundp 'jde-version)
jde-version
"No JDE"))
(ecb-problem-report-list-all-variables)
nil
'ecb-problem-report-post-hook
ecb-problem-report-message)
(ecb-redraw-layout)
(mail-subject)
(insert (read-string "Problem report subject: "
(format "ECB-%s -- " ecb-version)))
(mail-text)
(search-forward ecb-problem-report-message)
(end-of-line)
(message "Preparing bug report...done")))))
(defun ecb-problem-report-post-hook()
"Function run the reporter package done its work. It looks for a message- and
a backtrace-buffer and inserts the contents of that."
(save-excursion
(beginning-of-buffer)
;; if the mail-packages has already inserted a signature we must not go to
;; the buffer-end but just before the signature
(if (re-search-forward "^--[ \t]*$" nil t)
(progn
(beginning-of-line)
(insert-string "\n\n\n")
(forward-line -2))
(goto-char (point-max))
(insert-string "\n\n"))
(let* ((messages-buffer
(get-buffer
(if running-xemacs " *Message-Log*" "*Messages*")))
(backtrace-buffer (get-buffer "*Backtrace*")))
;;insert the contents of the backtrace buffer if it is there.
(insert-string "\n\n-----------------------------------------------------\n")
(if backtrace-buffer
(progn
(insert-string "The contents of the *Backtrace* buffer were\n\n")
(insert-buffer backtrace-buffer)
;; we must force the mark
(goto-char (mark t))
(insert-string "\nEnd Insert *Backtrace* buffer" ))
(insert-string "There was no *Backtrace* buffer" ))
(insert-string "\n-----------------------------------------------------\n\n")
;;insert the contents of the messages buffer if it is there.
(insert-string "-----------------------------------------------------\n")
(if messages-buffer
(progn
(insert-string "The contents of the *Messages* buffer were\n\n")
(insert-buffer messages-buffer)
(goto-char (mark t))
(insert-string "\nEnd Insert *Messages* buffer" ))
(insert-string "There was no *Messages* buffer" ))
(insert-string "\n-----------------------------------------------------\n\n"))))
(defun ecb-problem-report-list-all-variables()
"List all variables starting with `ecb-' and some other variables which
could be interesting for support."
(let ((emacs-vars `(semantic-after-toplevel-bovinate-hook
pre-command-hook
post-command-hook
after-save-hook
help-mode-hook
,(if (boundp 'ediff-quit-hook)
'ediff-quit-hook)))
ecb-vars)
(mapatoms
(lambda (symbol)
(when (and (string-match "ecb-" (symbol-name symbol))
(get symbol 'custom-type))
(setq ecb-vars (cons symbol ecb-vars)))))
(setq ecb-vars
(sort ecb-vars
(function (lambda (l r)
(string< (symbol-name l) (symbol-name r))))))
(setq emacs-vars
(sort emacs-vars
(function (lambda (l r)
(string< (symbol-name l) (symbol-name r))))))
(append emacs-vars ecb-vars)))
(provide 'ecb-help)
;; ecb-help.el ends here