Mercurial > hg > xemacs-beta
annotate lisp/next-error.el @ 4952:19a72041c5ed
Mule-izing, various fixes related to char * arguments
-------------------- ChangeLog entries follow: --------------------
modules/ChangeLog addition:
2010-01-26 Ben Wing <ben@xemacs.org>
* postgresql/postgresql.c:
* postgresql/postgresql.c (CHECK_LIVE_CONNECTION):
* postgresql/postgresql.c (print_pgresult):
* postgresql/postgresql.c (Fpq_conn_defaults):
* postgresql/postgresql.c (Fpq_connectdb):
* postgresql/postgresql.c (Fpq_connect_start):
* postgresql/postgresql.c (Fpq_result_status):
* postgresql/postgresql.c (Fpq_res_status):
Mule-ize large parts of it.
2010-01-26 Ben Wing <ben@xemacs.org>
* ldap/eldap.c (print_ldap):
* ldap/eldap.c (allocate_ldap):
Use write_ascstring().
src/ChangeLog addition:
2010-01-26 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (build_ascstring):
* alloc.c (build_msg_cistring):
* alloc.c (staticpro_1):
* alloc.c (staticpro_name):
* alloc.c (staticpro_nodump_1):
* alloc.c (staticpro_nodump_name):
* alloc.c (unstaticpro_nodump_1):
* alloc.c (mcpro_1):
* alloc.c (mcpro_name):
* alloc.c (object_memory_usage_stats):
* alloc.c (common_init_alloc_early):
* alloc.c (init_alloc_once_early):
* buffer.c (print_buffer):
* buffer.c (vars_of_buffer):
* buffer.c (common_init_complex_vars_of_buffer):
* buffer.c (init_initial_directory):
* bytecode.c (invalid_byte_code):
* bytecode.c (print_compiled_function):
* bytecode.c (mark_compiled_function):
* chartab.c (print_table_entry):
* chartab.c (print_char_table):
* config.h.in:
* console-gtk.c:
* console-gtk.c (gtk_device_to_console_connection):
* console-gtk.c (gtk_semi_canonicalize_console_connection):
* console-gtk.c (gtk_canonicalize_console_connection):
* console-gtk.c (gtk_semi_canonicalize_device_connection):
* console-gtk.c (gtk_canonicalize_device_connection):
* console-stream.c (stream_init_frame_1):
* console-stream.c (vars_of_console_stream):
* console-stream.c (init_console_stream):
* console-x.c (x_semi_canonicalize_console_connection):
* console-x.c (x_semi_canonicalize_device_connection):
* console-x.c (x_canonicalize_device_connection):
* console-x.h:
* data.c (eq_with_ebola_notice):
* data.c (Fsubr_interactive):
* data.c (Fnumber_to_string):
* data.c (digit_to_number):
* device-gtk.c (gtk_init_device):
* device-msw.c (print_devmode):
* device-x.c (x_event_name):
* dialog-msw.c (handle_directory_dialog_box):
* dialog-msw.c (handle_file_dialog_box):
* dialog-msw.c (vars_of_dialog_mswindows):
* doc.c (weird_doc):
* doc.c (Fsnarf_documentation):
* doc.c (vars_of_doc):
* dumper.c (pdump):
* dynarr.c:
* dynarr.c (Dynarr_realloc):
* editfns.c (Fuser_real_login_name):
* editfns.c (get_home_directory):
* elhash.c (print_hash_table_data):
* elhash.c (print_hash_table):
* emacs.c (main_1):
* emacs.c (vars_of_emacs):
* emodules.c:
* emodules.c (_emodules_list):
* emodules.c (Fload_module):
* emodules.c (Funload_module):
* emodules.c (Flist_modules):
* emodules.c (find_make_module):
* emodules.c (attempt_module_delete):
* emodules.c (emodules_load):
* emodules.c (emodules_doc_subr):
* emodules.c (emodules_doc_sym):
* emodules.c (syms_of_module):
* emodules.c (vars_of_module):
* emodules.h:
* eval.c (print_subr):
* eval.c (signal_call_debugger):
* eval.c (build_error_data):
* eval.c (signal_error):
* eval.c (maybe_signal_error):
* eval.c (signal_continuable_error):
* eval.c (maybe_signal_continuable_error):
* eval.c (signal_error_2):
* eval.c (maybe_signal_error_2):
* eval.c (signal_continuable_error_2):
* eval.c (maybe_signal_continuable_error_2):
* eval.c (signal_ferror):
* eval.c (maybe_signal_ferror):
* eval.c (signal_continuable_ferror):
* eval.c (maybe_signal_continuable_ferror):
* eval.c (signal_ferror_with_frob):
* eval.c (maybe_signal_ferror_with_frob):
* eval.c (signal_continuable_ferror_with_frob):
* eval.c (maybe_signal_continuable_ferror_with_frob):
* eval.c (syntax_error):
* eval.c (syntax_error_2):
* eval.c (maybe_syntax_error):
* eval.c (sferror):
* eval.c (sferror_2):
* eval.c (maybe_sferror):
* eval.c (invalid_argument):
* eval.c (invalid_argument_2):
* eval.c (maybe_invalid_argument):
* eval.c (invalid_constant):
* eval.c (invalid_constant_2):
* eval.c (maybe_invalid_constant):
* eval.c (invalid_operation):
* eval.c (invalid_operation_2):
* eval.c (maybe_invalid_operation):
* eval.c (invalid_change):
* eval.c (invalid_change_2):
* eval.c (maybe_invalid_change):
* eval.c (invalid_state):
* eval.c (invalid_state_2):
* eval.c (maybe_invalid_state):
* eval.c (wtaerror):
* eval.c (stack_overflow):
* eval.c (out_of_memory):
* eval.c (print_multiple_value):
* eval.c (issue_call_trapping_problems_warning):
* eval.c (backtrace_specials):
* eval.c (backtrace_unevalled_args):
* eval.c (Fbacktrace):
* eval.c (warn_when_safe):
* event-Xt.c (modwarn):
* event-Xt.c (modbarf):
* event-Xt.c (check_modifier):
* event-Xt.c (store_modifier):
* event-Xt.c (emacs_Xt_format_magic_event):
* event-Xt.c (describe_event):
* event-gtk.c (dragndrop_data_received):
* event-gtk.c (store_modifier):
* event-gtk.c (gtk_reset_modifier_mapping):
* event-msw.c (dde_eval_string):
* event-msw.c (Fdde_alloc_advise_item):
* event-msw.c (mswindows_dde_callback):
* event-msw.c (FROB):
* event-msw.c (emacs_mswindows_format_magic_event):
* event-stream.c (external_debugging_print_event):
* event-stream.c (execute_help_form):
* event-stream.c (vars_of_event_stream):
* events.c (print_event_1):
* events.c (print_event):
* events.c (event_equal):
* extents.c (print_extent_1):
* extents.c (print_extent):
* extents.c (vars_of_extents):
* faces.c (print_face):
* faces.c (complex_vars_of_faces):
* file-coding.c:
* file-coding.c (print_coding_system):
* file-coding.c (print_coding_system_in_print_method):
* file-coding.c (default_query_method):
* file-coding.c (find_coding_system):
* file-coding.c (make_coding_system_1):
* file-coding.c (chain_print):
* file-coding.c (undecided_print):
* file-coding.c (gzip_print):
* file-coding.c (vars_of_file_coding):
* file-coding.c (complex_vars_of_file_coding):
* fileio.c:
* fileio.c (report_file_type_error):
* fileio.c (report_error_with_errno):
* fileio.c (report_file_error):
* fileio.c (barf_or_query_if_file_exists):
* fileio.c (vars_of_fileio):
* floatfns.c (matherr):
* fns.c (print_bit_vector):
* fns.c (Fmapconcat):
* fns.c (add_suffix_to_symbol):
* fns.c (add_prefix_to_symbol):
* frame-gtk.c:
* frame-gtk.c (Fgtk_window_id):
* frame-x.c (def):
* frame-x.c (x_cde_transfer_callback):
* frame.c:
* frame.c (Fmake_frame):
* gc.c (show_gc_cursor_and_message):
* gc.c (vars_of_gc):
* glyphs-eimage.c (png_instantiate):
* glyphs-eimage.c (tiff_instantiate):
* glyphs-gtk.c (gtk_print_image_instance):
* glyphs-msw.c (mswindows_print_image_instance):
* glyphs-x.c (x_print_image_instance):
* glyphs-x.c (update_widget_face):
* glyphs.c (make_string_from_file):
* glyphs.c (print_image_instance):
* glyphs.c (signal_image_error):
* glyphs.c (signal_image_error_2):
* glyphs.c (signal_double_image_error):
* glyphs.c (signal_double_image_error_2):
* glyphs.c (xbm_mask_file_munging):
* glyphs.c (pixmap_to_lisp_data):
* glyphs.h:
* gui.c (gui_item_display_flush_left):
* hpplay.c (player_error_internal):
* hpplay.c (myHandler):
* intl-win32.c:
* intl-win32.c (langcode_to_lang):
* intl-win32.c (sublangcode_to_lang):
* intl-win32.c (Fmswindows_get_locale_info):
* intl-win32.c (lcid_to_locale_mule_or_no):
* intl-win32.c (mswindows_multibyte_to_unicode_print):
* intl-win32.c (complex_vars_of_intl_win32):
* keymap.c:
* keymap.c (print_keymap):
* keymap.c (ensure_meta_prefix_char_keymapp):
* keymap.c (Fkey_description):
* keymap.c (Ftext_char_description):
* lisp.h:
* lisp.h (struct):
* lisp.h (DECLARE_INLINE_HEADER):
* lread.c (Fload_internal):
* lread.c (locate_file):
* lread.c (read_escape):
* lread.c (read_raw_string):
* lread.c (read1):
* lread.c (read_list):
* lread.c (read_compiled_function):
* lread.c (init_lread):
* lrecord.h:
* marker.c (print_marker):
* marker.c (marker_equal):
* menubar-msw.c (displayable_menu_item):
* menubar-x.c (command_builder_operate_menu_accelerator):
* menubar.c (vars_of_menubar):
* minibuf.c (reinit_complex_vars_of_minibuf):
* minibuf.c (complex_vars_of_minibuf):
* mule-charset.c (Fmake_charset):
* mule-charset.c (complex_vars_of_mule_charset):
* mule-coding.c (iso2022_print):
* mule-coding.c (fixed_width_query):
* number.c (bignum_print):
* number.c (ratio_print):
* number.c (bigfloat_print):
* number.c (bigfloat_finalize):
* objects-msw.c:
* objects-msw.c (mswindows_color_to_string):
* objects-msw.c (mswindows_color_list):
* objects-tty.c:
* objects-tty.c (tty_font_list):
* objects-tty.c (tty_find_charset_font):
* objects-xlike-inc.c (xft_find_charset_font):
* objects-xlike-inc.c (endif):
* print.c:
* print.c (write_istring):
* print.c (write_ascstring):
* print.c (Fterpri):
* print.c (Fprint):
* print.c (print_error_message):
* print.c (print_vector_internal):
* print.c (print_cons):
* print.c (print_string):
* print.c (printing_unreadable_object):
* print.c (print_internal):
* print.c (print_float):
* print.c (print_symbol):
* process-nt.c (mswindows_report_winsock_error):
* process-nt.c (nt_canonicalize_host_name):
* process-unix.c (unix_canonicalize_host_name):
* process.c (print_process):
* process.c (report_process_error):
* process.c (report_network_error):
* process.c (make_process_internal):
* process.c (Fstart_process_internal):
* process.c (status_message):
* process.c (putenv_internal):
* process.c (vars_of_process):
* process.h:
* profile.c (vars_of_profile):
* rangetab.c (print_range_table):
* realpath.c (vars_of_realpath):
* redisplay.c (vars_of_redisplay):
* search.c (wordify):
* search.c (Freplace_match):
* sheap.c (sheap_adjust_h):
* sound.c (report_sound_error):
* sound.c (Fplay_sound_file):
* specifier.c (print_specifier):
* symbols.c (Fsubr_name):
* symbols.c (do_symval_forwarding):
* symbols.c (set_default_buffer_slot_variable):
* symbols.c (set_default_console_slot_variable):
* symbols.c (store_symval_forwarding):
* symbols.c (default_value):
* symbols.c (defsymbol_massage_name_1):
* symbols.c (defsymbol_massage_name_nodump):
* symbols.c (defsymbol_massage_name):
* symbols.c (defsymbol_massage_multiword_predicate_nodump):
* symbols.c (defsymbol_massage_multiword_predicate):
* symbols.c (defsymbol_nodump):
* symbols.c (defsymbol):
* symbols.c (defkeyword):
* symbols.c (defkeyword_massage_name):
* symbols.c (check_module_subr):
* symbols.c (deferror_1):
* symbols.c (deferror):
* symbols.c (deferror_massage_name):
* symbols.c (deferror_massage_name_and_message):
* symbols.c (defvar_magic):
* symeval.h:
* symeval.h (DEFVAR_SYMVAL_FWD):
* sysdep.c:
* sysdep.c (init_system_name):
* sysdll.c:
* sysdll.c (MAYBE_PREPEND_UNDERSCORE):
* sysdll.c (dll_function):
* sysdll.c (dll_variable):
* sysdll.c (dll_error):
* sysdll.c (dll_open):
* sysdll.c (dll_close):
* sysdll.c (image_for_address):
* sysdll.c (my_find_image):
* sysdll.c (search_linked_libs):
* sysdll.h:
* sysfile.h:
* sysfile.h (DEFAULT_DIRECTORY_FALLBACK):
* syswindows.h:
* tests.c (DFC_CHECK_LENGTH):
* tests.c (DFC_CHECK_CONTENT):
* tests.c (Ftest_hash_tables):
* text.c (vars_of_text):
* text.h:
* tooltalk.c (tt_opnum_string):
* tooltalk.c (tt_message_arg_ival_string):
* tooltalk.c (Ftooltalk_default_procid):
* tooltalk.c (Ftooltalk_default_session):
* tooltalk.c (init_tooltalk):
* tooltalk.c (vars_of_tooltalk):
* ui-gtk.c (Fdll_load):
* ui-gtk.c (type_to_marshaller_type):
* ui-gtk.c (Fgtk_import_function_internal):
* ui-gtk.c (emacs_gtk_object_printer):
* ui-gtk.c (emacs_gtk_boxed_printer):
* unicode.c (unicode_to_ichar):
* unicode.c (unicode_print):
* unicode.c (unicode_query):
* unicode.c (vars_of_unicode):
* unicode.c (complex_vars_of_unicode):
* win32.c:
* win32.c (mswindows_report_process_error):
* window.c (print_window):
* xemacs.def.in.in:
BASIC IDEA: Further fixing up uses of char * and CIbyte *
to reflect their actual semantics; Mule-izing some code;
redoing of the not-yet-working code to handle message translation.
Clean up code to handle message-translation (not yet working).
Create separate versions of build_msg_string() for working with
Ibyte *, CIbyte *, and Ascbyte * arguments. Assert that Ascbyte *
arguments are pure-ASCII. Make build_msg_string() be the same
as build_msg_ascstring(). Create same three versions of GETTEXT()
and DEFER_GETTEXT(). Also create build_defer_string() and
variants for the equivalent of DEFER_GETTEXT() when building a
string. Remove old CGETTEXT(). Clean up code where GETTEXT(),
DEFER_GETTEXT(), build_msg_string(), etc. was being called and
introduce some new calls to build_msg_string(), etc. Remove
GETTEXT() from calls to weird_doc() -- we assume that the
message snarfer knows about weird_doc(). Remove uses of
DEFER_GETTEXT() from error messages in sysdep.c and instead use
special comments /* @@@begin-snarf@@@ */ and /* @@@end-snarf@@@ */
that the message snarfer presumably knows about.
Create build_ascstring() and use it in many instances in place
of build_string(). The purpose of having Ascbyte * variants is
to make the code more self-documenting in terms of what sort of
semantics is expected for char * strings. In fact in the process
of looking for uses of build_string(), much improperly Mule-ized
was discovered.
Mule-ize a lot of code as described in previous paragraph,
e.g. in sysdep.c.
Make the error functions take Ascbyte * strings and fix up a
couple of places where non-pure-ASCII strings were being passed in
(file-coding.c, mule-coding.c, unicode.c). (It's debatable whether
we really need to make the error functions work this way. It
helps catch places where code is written in a way that message
translation won't work, but we may well never implement message
translation.)
Make staticpro() and friends take Ascbyte * strings instead of
raw char * strings. Create a const_Ascbyte_ptr dynarr type
to describe what's held by staticpro_names[] and friends,
create pdump descriptions for const_Ascbyte_ptr dynarrs, and
use them in place of specially-crafted staticpro descriptions.
Mule-ize certain other functions (e.g. x_event_name) by correcting
raw use of char * to Ascbyte *, Rawbyte * or another such type,
and raw use of char[] buffers to another type (usually Ascbyte[]).
Change many uses of write_c_string() to write_msg_string(),
write_ascstring(), etc.
Mule-ize emodules.c, emodules.h, sysdll.h.
Fix some un-Mule-ized code in intl-win32.c.
A comment in event-Xt.c and the limitations of the message
snarfer (make-msgfile or whatever) is presumably incorrect --
it should be smart enough to handle function calls spread over
more than one line. Clean up code in event-Xt.c that was
written awkwardly for this reason.
In config.h.in, instead of NEED_ERROR_CHECK_TYPES_INLINES,
create a more general XEMACS_DEFS_NEEDS_INLINE_DECLS to
indicate when inlined functions need to be declared in
xemacs.defs.in.in, and make use of it in xemacs.defs.in.in.
We need to do this because postgresql.c now calls qxestrdup(),
which is an inline function.
Make nconc2() and other such functions MODULE_API and put
them in xemacs.defs.in.in since postgresql.c now uses them.
Clean up indentation in lread.c and a few other places.
In text.h, document ASSERT_ASCTEXT_ASCII() and
ASSERT_ASCTEXT_ASCII_LEN(), group together the stand-in
encodings and add some more for DLL symbols, function and
variable names, etc.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Tue, 26 Jan 2010 23:22:30 -0600 |
parents | b593e47979a5 |
children | 308d34e9f07d |
rev | line source |
---|---|
3000 | 1 ;;; next-error.el --- Next error support framework |
2 | |
3 ;; Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1996, 1997, 1998, 1999, | |
4 ;; 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. | |
5 | |
6 ;; Maintainer: XEmacs Development Team | |
7 ;; Keywords: internal | |
8 | |
9 ;; This file is part of XEmacs. | |
10 | |
11 ;; XEmacs is free software; you can redistribute it and/or modify | |
12 ;; it under the terms of the GNU General Public License as published by | |
13 ;; the Free Software Foundation; either version 2, or (at your option) | |
14 ;; any later version. | |
15 | |
16 ;; XEmacs is distributed in the hope that it will be useful, | |
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 ;; GNU General Public License for more details. | |
20 | |
21 ;; You should have received a copy of the GNU General Public License | |
22 ;; along with XEmacs; see the file COPYING. If not, write to the | |
23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
24 ;; Boston, MA 02110-1301, USA. | |
25 | |
26 ;;; Synched up with: FSF 22.0.50.1 (CVS) | |
3299 | 27 ;;; Some functions renamed with the next-error-framework prefix to avoid |
28 ;;; clashes with the next-error code in compile.el. One day compile.el | |
29 ;;; will use this framework. | |
3000 | 30 |
31 (defgroup next-error nil | |
32 "`next-error' support framework." | |
33 :group 'compilation | |
34 :version "22.1") | |
35 | |
36 (defface next-error | |
37 '((t (:inherit region))) | |
38 "Face used to highlight next error locus." | |
39 :group 'next-error | |
40 :version "22.1") | |
41 | |
42 (defcustom next-error-highlight 0.1 | |
43 "*Highlighting of locations in selected source buffers. | |
44 If number, highlight the locus in `next-error' face for given time in seconds. | |
45 If t, use persistent overlays fontified in `next-error' face. | |
46 If nil, don't highlight the locus in the source buffer. | |
47 If `fringe-arrow', indicate the locus by the fringe arrow." | |
48 :type '(choice (number :tag "Delay") | |
49 (const :tag "Persistent overlay" t) | |
50 (const :tag "No highlighting" nil) | |
51 (const :tag "Fringe arrow" 'fringe-arrow)) | |
52 :group 'next-error | |
53 :version "22.1") | |
54 | |
55 (defcustom next-error-highlight-no-select 0.1 | |
56 "*Highlighting of locations in non-selected source buffers. | |
57 If number, highlight the locus in `next-error' face for given time in seconds. | |
58 If t, use persistent overlays fontified in `next-error' face. | |
59 If nil, don't highlight the locus in the source buffer. | |
60 If `fringe-arrow', indicate the locus by the fringe arrow." | |
61 :type '(choice (number :tag "Delay") | |
62 (const :tag "Persistent overlay" t) | |
63 (const :tag "No highlighting" nil) | |
64 (const :tag "Fringe arrow" 'fringe-arrow)) | |
65 :group 'next-error | |
66 :version "22.1") | |
67 | |
68 (defcustom next-error-hook nil | |
69 "*List of hook functions run by `next-error' after visiting source file." | |
70 :type 'hook | |
71 :group 'next-error) | |
72 | |
73 (defvar next-error-highlight-timer nil) | |
74 | |
75 ;(defvar next-error-overlay-arrow-position nil) | |
76 ;(put 'next-error-overlay-arrow-position 'overlay-arrow-string "=>") | |
77 ;(add-to-list 'overlay-arrow-variable-list 'next-error-overlay-arrow-position) | |
78 | |
79 (defvar next-error-last-buffer nil | |
80 "The most recent `next-error' buffer. | |
81 A buffer becomes most recent when its compilation, grep, or | |
82 similar mode is started, or when it is used with \\[next-error] | |
83 or \\[compile-goto-error].") | |
84 | |
85 (defvar next-error-function nil | |
86 "Function to use to find the next error in the current buffer. | |
87 The function is called with 2 parameters: | |
88 ARG is an integer specifying by how many errors to move. | |
89 RESET is a boolean which, if non-nil, says to go back to the beginning | |
90 of the errors before moving. | |
91 Major modes providing compile-like functionality should set this variable | |
92 to indicate to `next-error' that this is a candidate buffer and how | |
93 to navigate in it.") | |
94 | |
95 (make-variable-buffer-local 'next-error-function) | |
96 | |
97 (defsubst next-error-buffer-p (buffer | |
98 &optional avoid-current | |
99 extra-test-inclusive | |
100 extra-test-exclusive) | |
101 "Test if BUFFER is a `next-error' capable buffer. | |
102 | |
103 If AVOID-CURRENT is non-nil, treat the current buffer | |
104 as an absolute last resort only. | |
105 | |
106 The function EXTRA-TEST-INCLUSIVE, if non-nil, is called in each buffer | |
107 that normally would not qualify. If it returns t, the buffer | |
108 in question is treated as usable. | |
109 | |
110 The function EXTRA-TEST-EXCLUSIVE, if non-nil is called in each buffer | |
111 that would normally be considered usable. If it returns nil, | |
112 that buffer is rejected." | |
113 (and (buffer-name buffer) ;First make sure it's live. | |
114 (not (and avoid-current (eq buffer (current-buffer)))) | |
115 (with-current-buffer buffer | |
116 (if next-error-function ; This is the normal test. | |
117 ;; Optionally reject some buffers. | |
118 (if extra-test-exclusive | |
119 (funcall extra-test-exclusive) | |
120 t) | |
121 ;; Optionally accept some other buffers. | |
122 (and extra-test-inclusive | |
123 (funcall extra-test-inclusive)))))) | |
124 | |
125 (defun next-error-find-buffer (&optional avoid-current | |
126 extra-test-inclusive | |
127 extra-test-exclusive) | |
128 "Return a `next-error' capable buffer. | |
129 If AVOID-CURRENT is non-nil, treat the current buffer | |
130 as an absolute last resort only. | |
131 | |
132 The function EXTRA-TEST-INCLUSIVE, if non-nil, is called in each buffer | |
133 that normally would not qualify. If it returns t, the buffer | |
134 in question is treated as usable. | |
135 | |
136 The function EXTRA-TEST-EXCLUSIVE, if non-nil is called in each buffer | |
137 that would normally be considered usable. If it returns nil, | |
138 that buffer is rejected." | |
139 (or | |
140 ;; 1. If one window on the selected frame displays such buffer, return it. | |
141 (let ((window-buffers | |
142 (delete-dups | |
143 (delq nil (mapcar (lambda (w) | |
144 (if (next-error-buffer-p | |
145 (window-buffer w) | |
146 avoid-current | |
147 extra-test-inclusive extra-test-exclusive) | |
148 (window-buffer w))) | |
149 (window-list)))))) | |
150 (if (eq (length window-buffers) 1) | |
151 (car window-buffers))) | |
152 ;; 2. If next-error-last-buffer is an acceptable buffer, use that. | |
153 (if (and next-error-last-buffer | |
154 (next-error-buffer-p next-error-last-buffer avoid-current | |
155 extra-test-inclusive extra-test-exclusive)) | |
156 next-error-last-buffer) | |
157 ;; 3. If the current buffer is acceptable, choose it. | |
158 (if (next-error-buffer-p (current-buffer) avoid-current | |
159 extra-test-inclusive extra-test-exclusive) | |
160 (current-buffer)) | |
161 ;; 4. Look for any acceptable buffer. | |
162 (let ((buffers (buffer-list))) | |
163 (while (and buffers | |
164 (not (next-error-buffer-p | |
165 (car buffers) avoid-current | |
166 extra-test-inclusive extra-test-exclusive))) | |
167 (setq buffers (cdr buffers))) | |
168 (car buffers)) | |
169 ;; 5. Use the current buffer as a last resort if it qualifies, | |
170 ;; even despite AVOID-CURRENT. | |
171 (and avoid-current | |
172 (next-error-buffer-p (current-buffer) nil | |
173 extra-test-inclusive extra-test-exclusive) | |
174 (progn | |
175 (message "This is the only next-error capable buffer") | |
176 (current-buffer))) | |
177 ;; 6. Give up. | |
178 (error "No next-error capable buffer found"))) | |
179 | |
180 ;;;###autoload | |
3299 | 181 (defun next-error-framework-next-error (&optional arg reset) |
182 "Visit next `next-error-framework-next-error' message and corresponding source code. | |
3000 | 183 |
184 If all the error messages parsed so far have been processed already, | |
185 the message buffer is checked for new ones. | |
186 | |
187 A prefix ARG specifies how many error messages to move; | |
188 negative means move back to previous error messages. | |
189 Just \\[universal-argument] as a prefix means reparse the error message buffer | |
190 and start at the first error. | |
191 | |
192 The RESET argument specifies that we should restart from the beginning. | |
193 | |
3299 | 194 \\[next-error-framework-next-error] normally uses the most recently started |
3000 | 195 compilation, grep, or occur buffer. It can also operate on any |
196 buffer with output from the \\[compile], \\[grep] commands, or, | |
197 more generally, on any buffer in Compilation mode or with | |
198 Compilation Minor mode enabled, or any buffer in which | |
199 `next-error-function' is bound to an appropriate function. | |
200 To specify use of a particular buffer for error messages, type | |
3299 | 201 \\[next-error-framework-next-error] in that buffer when it is the only one displayed |
3000 | 202 in the current frame. |
203 | |
3299 | 204 Once \\[next-error-framework-next-error] has chosen the buffer for error messages, it |
3000 | 205 runs `next-error-hook' with `run-hooks', and stays with that buffer |
206 until you use it in some other buffer which uses Compilation mode | |
207 or Compilation Minor mode. | |
208 | |
209 See variables `compilation-parse-errors-function' and | |
210 \`compilation-error-regexp-alist' for customization ideas." | |
211 (interactive "P") | |
212 (if (consp arg) (setq reset t arg nil)) | |
213 (when (setq next-error-last-buffer (next-error-find-buffer)) | |
214 ;; we know here that next-error-function is a valid symbol we can funcall | |
215 (with-current-buffer next-error-last-buffer | |
216 (funcall next-error-function (prefix-numeric-value arg) reset) | |
217 (run-hooks 'next-error-hook)))) | |
218 | |
3299 | 219 (defalias 'goto-next-locus 'next-error-framework-next-error) |
220 (defalias 'next-match 'next-error-framework-next-error) | |
3000 | 221 |
3299 | 222 (defun next-error-framework-previous-error (&optional n) |
223 "Visit previous `next-error-framework-next-error' message and corresponding source code. | |
3000 | 224 |
225 Prefix arg N says how many error messages to move backwards (or | |
226 forwards, if negative). | |
227 | |
228 This operates on the output from the \\[compile] and \\[grep] commands." | |
229 (interactive "p") | |
3299 | 230 (next-error-framework-next-error (- (or n 1)))) |
3000 | 231 |
3299 | 232 (defun next-error-framework-first-error (&optional n) |
3000 | 233 "Restart at the first error. |
234 Visit corresponding source code. | |
235 With prefix arg N, visit the source code of the Nth error. | |
236 This operates on the output from the \\[compile] command, for instance." | |
237 (interactive "p") | |
3299 | 238 (next-error-framework-next-error n t)) |
3000 | 239 |
240 (defun next-error-no-select (&optional n) | |
241 "Move point to the next error in the `next-error' buffer and highlight match. | |
242 Prefix arg N says how many error messages to move forwards (or | |
243 backwards, if negative). | |
244 Finds and highlights the source line like \\[next-error], but does not | |
245 select the source buffer." | |
246 (interactive "p") | |
247 (let ((next-error-highlight next-error-highlight-no-select)) | |
3299 | 248 (next-error-framework-next-error n)) |
3000 | 249 (pop-to-buffer next-error-last-buffer)) |
250 | |
251 (defun previous-error-no-select (&optional n) | |
252 "Move point to the previous error in the `next-error' buffer and highlight match. | |
253 Prefix arg N says how many error messages to move backwards (or | |
254 forwards, if negative). | |
255 Finds and highlights the source line like \\[previous-error], but does not | |
256 select the source buffer." | |
257 (interactive "p") | |
258 (next-error-no-select (- (or n 1)))) | |
259 | |
260 ;;; Internal variable for `next-error-follow-mode-post-command-hook'. | |
261 (defvar next-error-follow-last-line nil) | |
262 | |
263 (define-minor-mode next-error-follow-minor-mode | |
264 "Minor mode for compilation, occur and diff modes. | |
265 When turned on, cursor motion in the compilation, grep, occur or diff | |
266 buffer causes automatic display of the corresponding source code | |
267 location." | |
268 :group 'next-error :init-value nil :lighter " Fol" | |
269 (if (not next-error-follow-minor-mode) | |
270 (remove-hook 'post-command-hook 'next-error-follow-mode-post-command-hook t) | |
271 (add-hook 'post-command-hook 'next-error-follow-mode-post-command-hook nil t) | |
272 (make-local-variable 'next-error-follow-last-line))) | |
273 | |
274 ;;; Used as a `post-command-hook' by `next-error-follow-mode' | |
275 ;;; for the *Compilation* *grep* and *Occur* buffers. | |
3017 | 276 (defvar compilation-current-error) |
277 (defvar compilation-context-lines) | |
3000 | 278 (defun next-error-follow-mode-post-command-hook () |
279 (unless (equal next-error-follow-last-line (line-number-at-pos)) | |
280 (setq next-error-follow-last-line (line-number-at-pos)) | |
281 (condition-case nil | |
282 (let ((compilation-context-lines nil)) | |
283 (setq compilation-current-error (point)) | |
284 (next-error-no-select 0)) | |
285 (error t)))) | |
286 | |
287 (provide 'next-error) |