annotate lisp/replace.el @ 2720:6fa9919a9a0b

[xemacs-hg @ 2005-04-08 23:10:01 by crestani] ChangeLog addition: 2005-04-01  Marcus Crestani  <crestani@xemacs.org>         The new allocator.         New configure flag: `MC_ALLOC':         * configure.ac (XE_COMPLEX_ARG_ENABLE): Add `--enable-mc-alloc' as         a new configure flag.         * configure.in (AC_INIT_PARSE_ARGS): Add `--mc-alloc' as a new         configure flag.         * configure.usage: Add description for `mc-alloc'.         DUMP_IN_EXEC:         * Makefile.in.in: Condition the installation of a separate dump         file on !DUMP_ON_EXEC.         * configure.ac (XE_COMPLEX_ARG_ENABLE): Add         `--enable-dump-in-exec' as a new configure flag.         * configure.ac: DUMP_IN_EXEC is define as default for PDUMP but         not default for MC_ALLOC.         * configure.in (AC_INIT_PARSE_ARGS): Add `--dump-in-exec' as a         new configure flag.         * configure.in: DUMP_IN_EXEC is define as default for PDUMP but         not default for MC_ALLOC.         * configure.usage: Add description for `dump-in-exec'. lib-src/ChangeLog addition: 2005-04-01  Marcus Crestani  <crestani@xemacs.org>         The new allocator.         DUMP_IN_EXEC:                  * Makefile.in.in: Only compile insert-data-in-exec if         DUMP_IN_EXEC is defined. lisp/ChangeLog addition: 2005-04-01  Marcus Crestani  <crestani@xemacs.org>         The new allocator.         MEMORY_USAGE_STATS         * diagnose.el: Add new lisp function to pretty print statistics         about the new allocator.         * diagnose.el (show-mc-alloc-memory-usage): New. modules/ChangeLog addition: 2005-04-01  Marcus Crestani  <crestani@xemacs.org>         The new allocator.         Remove Lcrecords:                  * postgresql/postgresql.c (allocate_pgconn): Allocate with new         allocator.         * postgresql/postgresql.c (allocate_pgresult): Allocate PGresult         with new allocator.           * postgresql/postgresql.h (struct Lisp_PGconn): Add         lrecord_header.         * postgresql/postgresql.h (struct Lisp_PGresult): Add         lrecord_header.         * ldap/eldap.c (allocate_ldap): Allocate with new allocator.         * ldap/eldap.h (struct Lisp_LDAP): Add lrecord_header. nt/ChangeLog addition: 2005-04-01  Marcus Crestani  <crestani@xemacs.org>         The new allocator.         New configure flag: `MC_ALLOC':         * config.inc.samp: Add new flag `MC_ALLOC'.         * xemacs.mak: Add flag and configuration output for `MC_ALLOC'.         New files:         * xemacs.dsp: Add source files mc-alloc.c and mc-alloc.h.         * xemacs.mak: Add new object file mc-alloc.obj to dependencies. src/ChangeLog addition: 2005-04-01  Marcus Crestani  <crestani@xemacs.org>         The new allocator.         New configure flag: `MC_ALLOC':         * config.h.in: Add new flag `MC_ALLOC'.         New files:         * Makefile.in.in: Add new object file mc-alloc.o.         * depend: Add new files to dependencies.         * mc-alloc.c: New.         * mc-alloc.h: New.         Running the new allocator from XEmacs:         * alloc.c (deadbeef_memory): Moved to mc-alloc.c.         * emacs.c (main_1): Initialize the new allocator and add         syms_of_mc_alloc.         * symsinit.h: Add syms_of_mc_alloc.         New lrecord allocation and free functions:         * alloc.c (alloc_lrecord): New. Allocates an lrecord, includes         type checking and initializing of the lrecord_header.         * alloc.c (noseeum_alloc_lrecord): Same as above, but increments         the NOSEEUM cons counter.         * alloc.c (free_lrecord): New. Calls the finalizer and frees the         lrecord.         * lrecord.h: Add lrecord allocation prototypes and comments.         Remove old lrecord FROB block allocation:                  * alloc.c (allocate_lisp_storage): Former function to expand         heap. Not needed anymore, remove.         * alloc.c: Completely remove `Fixed-size type macros'         * alloc.c (release_breathing_space): Remove.         * alloc.c (memory_full): Remove release_breathing_space.         * alloc.c (refill_memory_reserve): Remove.         * alloc.c (TYPE_ALLOC_SIZE): Remove.         * alloc.c (DECLARE_FIXED_TYPE_ALLOC): Remove.         * alloc.c (ALLOCATE_FIXED_TYPE_FROM_BLOCK): Remove.         * alloc.c (ALLOCATE_FIXED_TYPE_1): Remove.         * alloc.c (ALLOCATE_FIXED_TYPE): Remove.         * alloc.c (NOSEEUM_ALLOCATE_FIXED_TYPE): Remove.         * alloc.c (struct Lisp_Free): Remove.         * alloc.c (LRECORD_FREE_P): Remove.         * alloc.c (MARK_LRECORD_AS_FREE): Remove.         * alloc.c (MARK_LRECORD_AS_NOT_FREE): Remove.         * alloc.c (PUT_FIXED_TYPE_ON_FREE_LIST): Remove.         * alloc.c (FREE_FIXED_TYPE): Remove.         * alloc.c (FREE_FIXED_TYPE_WHEN_NOT_IN_GC): Remove.         Allocate old lrecords with new allocator:                  * alloc.c: DECLARE_FIXED_TYPE_ALLOC removed for all lrecords         defined in alloc.c.         * alloc.c (Fcons): Allocate with new allocator.         * alloc.c (noseeum_cons): Allocate with new allocator.         * alloc.c (make_float): Allocate with new allocator.         * alloc.c (make_bignum): Allocate with new allocator.         * alloc.c (make_bignum_bg): Allocate with new allocator.         * alloc.c (make_ratio): Allocate with new allocator.         * alloc.c (make_ratio_bg): Allocate with new allocator.         * alloc.c (make_ratio_rt): Allocate with new allocator.         * alloc.c (make_bigfloat): Allocate with new allocator.         * alloc.c (make_bigfloat_bf): Allocate with new allocator.         * alloc.c (make_compiled_function): Allocate with new allocator.         * alloc.c (Fmake_symbol): Allocate with new allocator.         * alloc.c (allocate_extent): Allocate with new allocator.         * alloc.c (allocate_event): Allocate with new allocator.         * alloc.c (make_key_data): Allocate with new allocator.         * alloc.c (make_button_data): Allocate with new allocator.         * alloc.c (make_motion_data): Allocate with new allocator.         * alloc.c (make_process_data): Allocate with new allocator.         * alloc.c (make_timeout_data): Allocate with new allocator.         * alloc.c (make_magic_data): Allocate with new allocator.         * alloc.c (make_magic_eval_data): Allocate with new allocator.         * alloc.c (make_eval_data): Allocate with new allocator.         * alloc.c (make_misc_user_data): Allocate with new allocator.         * alloc.c (Fmake_marker): Allocate with new allocator.         * alloc.c (noseeum_make_marker): Allocate with new allocator.         * alloc.c (make_uninit_string): Allocate with new allocator.         * alloc.c (resize_string): Allocate with new allocator.         * alloc.c (make_string_nocopy): Allocate with new allocator.         Garbage Collection:         * alloc.c (GC_CHECK_NOT_FREE): Remove obsolete assertions.         * alloc.c (SWEEP_FIXED_TYPE_BLOCK): Remove.         * alloc.c (SWEEP_FIXED_TYPE_BLOCK_1): Remove.         * alloc.c (sweep_conses): Remove.         * alloc.c (free_cons): Use new allocator to free.         * alloc.c (sweep_compiled_functions): Remove.         * alloc.c (sweep_floats): Remove.         * alloc.c (sweep_bignums): Remove.         * alloc.c (sweep_ratios): Remove.         * alloc.c (sweep_bigfloats): Remove.         * alloc.c (sweep_symbols): Remove.         * alloc.c (sweep_extents): Remove.         * alloc.c (sweep_events): Remove.         * alloc.c (sweep_key_data): Remove.         * alloc.c (free_key_data): Use new allocator to free.         * alloc.c (sweep_button_data): Remove.         * alloc.c (free_button_data): Use new allocator to free.         * alloc.c (sweep_motion_data): Remove.         * alloc.c (free_motion_data): Use new allocator to free.         * alloc.c (sweep_process_data): Remove.         * alloc.c (free_process_data): Use new allocator to free.         * alloc.c (sweep_timeout_data): Remove.         * alloc.c (free_timeout_data): Use new allocator to free.         * alloc.c (sweep_magic_data): Remove.         * alloc.c (free_magic_data): Use new allocator to free.         * alloc.c (sweep_magic_eval_data): Remove.         * alloc.c (free_magic_eval_data): Use new allocator to free.         * alloc.c (sweep_eval_data): Remove.         * alloc.c (free_eval_data): Use new allocator to free.         * alloc.c (sweep_misc_user_data): Remove.         * alloc.c (free_misc_user_data): Use new allocator to free.         * alloc.c (sweep_markers): Remove.         * alloc.c (free_marker): Use new allocator to free.         * alloc.c (garbage_collect_1): Remove release_breathing_space.         * alloc.c (gc_sweep): Remove all the old lcrecord and lrecord         related stuff. Sweeping now works like this: compact string         chars, finalize, sweep.         * alloc.c (common_init_alloc_early): Remove old lrecord         initializations, remove breathing_space.         * emacs.c (Fdump_emacs): Remove release_breathing_space.         * lisp.h: Remove prototype for release_breathing_space.         * lisp.h: Adjust the special cons mark makros.         Lrecord Finalizer:         * alloc.c: Add finalizer to lrecord definition.         * alloc.c (finalize_string): Add finalizer for string.         * bytecode.c: Add finalizer to lrecord definition.         * bytecode.c (finalize_compiled_function): Add finalizer for         compiled function.         * marker.c: Add finalizer to lrecord definition.         * marker.c (finalize_marker): Add finalizer for marker.         These changes build the interface to mc-alloc:         * lrecord.h (MC_ALLOC_CALL_FINALIZER): Tell mc-alloc how to         finalize lrecords.         * lrecord.h (MC_ALLOC_CALL_FINALIZER_FOR_DISKSAVE): Tell         mc-alloc how to finalize for disksave.         Unify lrecords and lcrecords:         * lisp.h (struct Lisp_String): Adjust string union hack to         new lrecord header.         * lrecord.h: Adjust comments.         * lrecord.h (struct lrecord_header): The new lrecord header         includes type, lisp-readonly, free, and uid.         * lrecord.h (set_lheader_implementation): Adjust to new         lrecord_header.         * lrecord.h (struct lrecord_implementation): The field basic_p         for indication of an old lrecord is not needed anymore, remove.         * lrecord.h (MAKE_LRECORD_IMPLEMENTATION): Remove basic_p.         * lrecord.h (MAKE_EXTERNAL_LRECORD_IMPLEMENTATION): Remove         basic_p.         * lrecord.h (copy_sized_lrecord): Remove distinction between         old lrecords and lcrecords.         * lrecord.h (copy_lrecord): Remove distinction between old         lrecords and lcrecords.         * lrecord.h (zero_sized_lrecord): Remove distinction between         old lrecords and lcrecords.         * lrecord.h (zero_lrecord): Remove distinction between old         lrecords and lcrecords.         Remove lcrecords and lcrecord lists:         * alloc.c (basic_alloc_lcrecord): Not needed anymore, remove.         * alloc.c (very_old_free_lcrecord): Not needed anymore, remove.         * alloc.c (copy_lisp_object): No more distinction between         lrecords and lcrecords.         * alloc.c (all_lcrecords): Not needed anymore, remove.         * alloc.c (make_vector_internal): Allocate as lrecord.         * alloc.c (make_bit_vector_internal): Allocate as lrecord.         * alloc.c: Completely remove `lcrecord lists'.         * alloc.c (free_description): Remove.         * alloc.c (lcrecord_list_description): Remove.         * alloc.c (mark_lcrecord_list): Remove.         * alloc.c (make_lcrecord_list): Remove.         * alloc.c (alloc_managed_lcrecord): Remove.         * alloc.c (free_managed_lcrecord): Remove.         * alloc.c (alloc_automanaged_lcrecord): Remove.         * alloc.c (free_lcrecord): Remove.         * alloc.c (lcrecord_stats): Remove.         * alloc.c (tick_lcrecord_stats): Remove.         * alloc.c (disksave_object_finalization_1): Add call to         mc_finalize_for_disksave. Remove the lcrecord way to visit all         objects.         * alloc.c (kkcc_marking): Remove XD_FLAG_FREE_LISP_OBJECT         * alloc.c (sweep_lcrecords_1): Remove.         * alloc.c (common_init_alloc_early): Remove everything related         to lcrecords, remove old lrecord initializations,         * alloc.c (init_lcrecord_lists): Not needed anymore, remove.         * alloc.c (reinit_alloc_early): Remove everything related to         lcrecords.         * alloc.c (init_alloc_once_early): Remove everything related to         lcrecords.         * buffer.c (allocate_buffer): Allocate as lrecord.         * buffer.c (nuke_all_buffer_slots): Use lrecord functions.         * buffer.c (common_init_complex_vars_of_buffer): Allocate as         lrecord.         * buffer.h (struct buffer): Add lrecord_header.         * casetab.c (allocate_case_table): Allocate as lrecord.         * casetab.h (struct Lisp_Case_Table): Add lrecord_header.         * charset.h (struct Lisp_Charset): Add lrecord_header.         * chartab.c (fill_char_table): Use lrecord functions.         * chartab.c (Fmake_char_table): Allocate as lrecord.         * chartab.c (make_char_table_entry): Allocate as lrecord.         * chartab.c (copy_char_table_entry): Allocate as lrecord.         * chartab.c (Fcopy_char_table): Allocate as lrecord.         * chartab.c (put_char_table): Use lrecord functions.         * chartab.h (struct Lisp_Char_Table_Entry): Add lrecord_header.         * chartab.h (struct Lisp_Char_Table): Add lrecord_header.         * console-impl.h (struct console): Add lrecord_header.         * console-msw-impl.h (struct Lisp_Devmode): Add lrecord_header.         * console-msw-impl.h (struct mswindows_dialog_id): Add         lrecord_header.         * console.c (allocate_console): Allocate as lrecord.         * console.c (nuke_all_console_slots): Use lrecord functions.         * console.c (common_init_complex_vars_of_console): Allocate as         lrecord.         * data.c (make_weak_list): Allocate as lrecord.         * data.c (make_weak_box): Allocate as lrecord.         * data.c (make_ephemeron): Allocate as lrecord.         * database.c (struct Lisp_Database): Add lrecord_header.         * database.c (allocate_database): Allocate as lrecord.         * device-impl.h (struct device): Add lrecord_header.         * device-msw.c (allocate_devmode): Allocate as lrecord.         * device.c (nuke_all_device_slots): Use lrecord functions.         * device.c (allocate_device): Allocate as lrecord.         * dialog-msw.c (handle_question_dialog_box): Allocate as lrecord.         * elhash.c (struct Lisp_Hash_Table): Add lrecord_header.         * elhash.c (make_general_lisp_hash_table): Allocate as lrecord.         * elhash.c (Fcopy_hash_table): Allocate as lrecord.         * event-stream.c: Lcrecord lists Vcommand_builder_free_list and         Vtimeout_free_list are no longer needed. Remove.         * event-stream.c (allocate_command_builder): Allocate as lrecord.         * event-stream.c (free_command_builder): Use lrecord functions.         * event-stream.c (event_stream_generate_wakeup): Allocate as         lrecord.         * event-stream.c (event_stream_resignal_wakeup): Use lrecord         functions.         * event-stream.c (event_stream_disable_wakeup): Use lrecord         functions.         * event-stream.c (reinit_vars_of_event_stream): Lcrecord lists         remove.         * events.h (struct Lisp_Timeout): Add lrecord_header.         * events.h (struct command_builder): Add lrecord_header.         * extents-impl.h (struct extent_auxiliary): Add lrecord_header.         * extents-impl.h (struct extent_info): Add lrecord_header.         * extents.c (allocate_extent_auxiliary): Allocate as lrecord.         * extents.c (allocate_extent_info): Allocate as lrecord.         * extents.c (copy_extent): Allocate as lrecord.         * faces.c (allocate_face): Allocate as lrecord.         * faces.h (struct Lisp_Face): Add lrecord_header.         * file-coding.c (allocate_coding_system): Allocate as lrecord.         * file-coding.c (Fcopy_coding_system): Allocate as lrecord.         * file-coding.h (struct Lisp_Coding_System): Add lrecord_header.         * fns.c (Ffillarray): Allocate as lrecord.         * frame-impl.h (struct frame): Add lrecord_header.         * frame.c (nuke_all_frame_slots): Use lrecord functions.         * frame.c (allocate_frame_core): Allocate as lrecord.         * glyphs.c (allocate_image_instance): Allocate as lrecord.         * glyphs.c (Fcolorize_image_instance): Allocate as lrecord.         * glyphs.c (allocate_glyph): Allocate as lrecord.         * glyphs.h (struct Lisp_Image_Instance): Add lrecord_header.         * glyphs.h (struct Lisp_Glyph): Add lrecord_header.         * gui.c (allocate_gui_item): Allocate as lrecord.         * gui.h (struct Lisp_Gui_Item): Add lrecord_header.         * keymap.c (struct Lisp_Keymap): Add lrecord_header.         * keymap.c (make_keymap): Allocate as lrecord.         * lisp.h (struct Lisp_Vector): Add lrecord_header.         * lisp.h (struct Lisp_Bit_Vector): Add lrecord_header.         * lisp.h (struct weak_box): Add lrecord_header.         * lisp.h (struct ephemeron): Add lrecord_header.         * lisp.h (struct weak_list): Add lrecord_header.         * lrecord.h (struct lcrecord_header): Not used, remove.         * lrecord.h (struct free_lcrecord_header): Not used, remove.         * lrecord.h (struct lcrecord_list): Not needed anymore, remove.         * lrecord.h (lcrecord_list): Not needed anymore, remove.         * lrecord.h: (enum data_description_entry_flags): Remove         XD_FLAG_FREE_LISP_OBJECT.         * lstream.c: Lrecord list Vlstream_free_list remove.         * lstream.c (Lstream_new): Allocate as lrecord.         * lstream.c (Lstream_delete): Use lrecod functions.         * lstream.c (reinit_vars_of_lstream): Vlstream_free_list         initialization remove.           * lstream.h (struct lstream): Add lrecord_header.         * emacs.c (main_1): Remove lstream initialization.         * mule-charset.c (make_charset): Allocate as lrecord.         * objects-impl.h (struct Lisp_Color_Instance): Add         lrecord_header.         * objects-impl.h (struct Lisp_Font_Instance): Add lrecord_header.         * objects.c (Fmake_color_instance): Allocate as lrecord.         * objects.c (Fmake_font_instance): Allocate as lrecord.         * objects.c (reinit_vars_of_objects): Allocate as lrecord.         * opaque.c: Lcreord list Vopaque_ptr_list remove.         * opaque.c (make_opaque): Allocate as lrecord.         * opaque.c (make_opaque_ptr): Allocate as lrecord.         * opaque.c (free_opaque_ptr): Use lrecord functions.         * opaque.c (reinit_opaque_early):         * opaque.c (init_opaque_once_early): Vopaque_ptr_list         initialization remove.         * opaque.h (Lisp_Opaque): Add lrecord_header.         * opaque.h (Lisp_Opaque_Ptr): Add lrecord_header.         * emacs.c (main_1): Remove opaque variable initialization.         * print.c (default_object_printer): Use new lrecord_header.         * print.c (print_internal): Use new lrecord_header.         * print.c (debug_p4): Use new lrecord_header.         * process.c (make_process_internal): Allocate as lrecord.         * procimpl.h (struct Lisp_Process): Add lrecord_header.         * rangetab.c (Fmake_range_table): Allocate as lrecord.         * rangetab.c (Fcopy_range_table): Allocate as lrecord.         * rangetab.h (struct Lisp_Range_Table): Add lrecord_header.         * scrollbar.c (create_scrollbar_instance): Allocate as lrecord.         * scrollbar.h (struct scrollbar_instance): Add lrecord_header.         * specifier.c (make_specifier_internal): Allocate as lrecord.         * specifier.h (struct Lisp_Specifier): Add lrecord_header.         * symbols.c:         * symbols.c (Fmake_variable_buffer_local): Allocate as lrecord.         * symbols.c (Fdontusethis_set_symbol_value_handler): Allocate         as lrecord.         * symbols.c (Fdefvaralias): Allocate as lrecord.         * symeval.h (struct symbol_value_magic): Add lrecord_header.         * toolbar.c (update_toolbar_button): Allocate as lrecord.         * toolbar.h (struct toolbar_button): Add lrecord_header.         * tooltalk.c (struct Lisp_Tooltalk_Message): Add lrecord_header.         * tooltalk.c (make_tooltalk_message): Allocate as lrecord.         * tooltalk.c (struct Lisp_Tooltalk_Pattern): Add lrecord_header.         * tooltalk.c (make_tooltalk_pattern): Allocate as lrecord.         * ui-gtk.c (allocate_ffi_data): Allocate as lrecord.         * ui-gtk.c (allocate_emacs_gtk_object_data): Allocate as lrecord.         * ui-gtk.c (allocate_emacs_gtk_boxed_data): Allocate as lrecord.         * ui-gtk.h (structs): Add lrecord_header.         * window-impl.h (struct window): Add lrecord_header.         * window-impl.h (struct window_mirror): Add lrecord_header.         * window.c (allocate_window): Allocate as lrecord.         * window.c (new_window_mirror): Allocate as lrecord.         * window.c (make_dummy_parent): Allocate as lrecord.         MEMORY_USAGE_STATS         * alloc.c (fixed_type_block_overhead): Not used anymore, remove.         * buffer.c (compute_buffer_usage): Get storage size from new         allocator.         * marker.c (compute_buffer_marker_usage): Get storage size from         new allocator.         * mule-charset.c (compute_charset_usage): Get storage size from         new allocator.         * scrollbar-gtk.c (gtk_compute_scrollbar_instance_usage): Get         storage size from new allocator.         * scrollbar-msw.c (mswindows_compute_scrollbar_instance_usage):         Get storage size from new allocator.         * scrollbar-x.c (x_compute_scrollbar_instance_usage): Get         storage size from new allocator.         * scrollbar.c (compute_scrollbar_instance_usage): Get storage         size from new allocator.         * unicode.c (compute_from_unicode_table_size_1): Get storage         size from new allocator.         * unicode.c (compute_to_unicode_table_size_1): Get storage size         from new allocator.         * window.c (compute_window_mirror_usage): Get storage size from         new allocator.         * window.c (compute_window_usage): Get storage size from new         allocator.         MC_ALLOC_TYPE_STATS:         * alloc.c (alloc_lrecord): Bump lrecord count.         * alloc.c (noseeum_alloc_lrecord): Bump lrecord count.         * alloc.c (struct lrecord_stats): Storage for counts.         * alloc.c (init_lrecord_stats): Zero statistics.         * alloc.c (inc_lrecord_stats): Increase the statistic.         * alloc.c (dec_lrecord_stats): Decrease the statistic.         * alloc.c (gc_plist_hack): Used to print the information.         * alloc.c (Fgarbage_collect): Return the collected information.         * mc-alloc.c (remove_cell): Decrease lrecord count.         * mc-alloc.h: Set flag MC_ALLOC_TYPE_STATS.         * emacs.c (main_1): Init lrecord statistics.         * lrecord.h: Add prototypes for *_lrecord_stats.         Strings:         * alloc.c (Fmake_string): Initialize ascii_begin to zero.         * alloc.c (gc_count_num_short_string_in_use): Remove.         * alloc.c (gc_count_string_total_size): Remove.         * alloc.c (gc_count_short_string_total_size): Remove.         * alloc.c (debug_string_purity): Remove.         * alloc.c (debug_string_purity_print): Remove.         * alloc.c (sweep_strings): Remove.                  Remove static C-readonly Lisp objects:         * alloc.c (c_readonly): Not needed anymore, remove.         * alloc.c (GC_CHECK_LHEADER_INVARIANTS): Remove some obsolete         lheader invariants assertions.         * buffer.c (DEFVAR_BUFFER_LOCAL_1): Allocate dynamically.         * console.c (DEFVAR_CONSOLE_LOCAL_1): Allocate dynamically.         * gpmevent.c: Indirection via MC_ALLOC_Freceive_gpm_event.         * gpmevent.c (Fgpm_enable): Allocate dynamically.         * gpmevent.c (syms_of_gpmevent): Allocate dynamically.         * lisp.h (C_READONLY): Not needed anymore, remove.         * lisp.h (DEFUN): Allocate dynamically.         * lrecord.h (C_READONLY_RECORD_HEADER_P): Not needed anymore,         remove.         * lrecord.h (SET_C_READONLY_RECORD_HEADER): Not needed anymore,         remove.         * symbols.c (guts_of_unbound_marker):         * symeval.h (defsubr): Allocate dynamically.         * symeval.h (DEFSUBR_MACRO): Allocate dynamically.         * symeval.h (DEFVAR_ SYMVAL_FWD): Allocate dynamically.         * tests.c (TESTS_DEFSUBR): Allocate dynamically.         Definition of mcpro:         * lisp.h: Add mcpro prototypes.         * alloc.c (common_init_alloc_early): Add initialization for         mcpros.         * alloc.c (mcpro_description_1): New.         * alloc.c (mcpro_description): New.         * alloc.c (mcpros_description_1): New.         * alloc.c (mcpros_description): New.         * alloc.c (mcpro_one_name_description_1): New.         * alloc.c (mcpro_one_name_description): New.         * alloc.c (mcpro_names_description_1): New.         * alloc.c (mcpro_names_description): New.         * alloc.c (mcpros): New.         * alloc.c (mcpro_names): New.         * alloc.c (mcpro_1): New.         * alloc.c (mc_pro): New.         * alloc.c (garbage_collect_1): Add mcpros to root set.         Usage of mcpro:         * alloc.c (make_string_nocopy): Add string to root set.         * symbols.c (init_symbols_once_early): Add Qunbound to root set.         Changes to the Portable Dumper:                  * alloc.c (FREE_OR_REALLOC_BEGIN): Since dumped objects can be         freed with the new allocator, remove assertion for !DUMPEDP.         * dumper.c: Adjust comments, increase PDUMP_HASHSIZE.         * dumper.c (pdump_make_hash): Shift address only 2 bytes, to         avoid collisions.         * dumper.c (pdump_objects_unmark): No more mark bits within         the object, remove.         * dumper.c (mc_addr_elt): New. Element data structure for mc         hash table.         * dumper.c (pdump_mc_hash): New hash table: `lookup table'.         * dumper.c (pdump_get_mc_addr): New. Lookup for hash table.         * dumper.c (pdump_get_indirect_mc_addr): New. Lookup for         convertibles.         * dumper.c (pdump_put_mc_addr): New. Putter for hash table.         * dumper.c (pdump_dump_mc_data): New. Writes the table for         relocation at load time to the dump file.         * dumper.c (pdump_scan_lisp_objects_by_alignment): New.         Visits all dumped Lisp objects.         * dumper.c (pdump_scan_non_lisp_objects_by_alignment): New.         Visits all other dumped objects.         * dumper.c (pdump_reloc_one_mc): New. Updates all pointers         of an object by using the hash table pdump_mc_hash.         * dumper.c (pdump_reloc_one): Replaced by pdump_reloc_one_mc.         * dumper.c (pdump): Change the structure of the dump file, add         the mc post dump relocation table to dump file.         * dumper.c (pdump_load_finish): Hand all dumped objects to the         new allocator and use the mc post dump relocation table for         relocating the dumped objects at dump file load time, free not         longer used data structures.         * dumper.c (pdump_load): Free the dump file.         * dumper.h: Remove pdump_objects_unmark.         * lrecord.h (DUMPEDP): Dumped objects can be freed, remove.              DUMP_IN_EXEC:         * Makefile.in.in: Linking for and with dump in executable only if         DUMP_IN_EXEC is defined.         * config.h.in: Add new flag `DUMP_IN_EXEC'         * emacs.c: Condition dump-data.h on DUMP_IN_EXEC.         * emacs.c (main_1): Flag `-si' only works if dump image is         written into executable.         Miscellanious         * lrecord.h (enum lrecord_type): Added numbers to all types,         very handy for debugging.         * xemacs.def.in.in: Add mc-alloc functions to make them visible         to the modules.
author crestani
date Fri, 08 Apr 2005 23:11:35 +0000
parents 16738b49b833
children 5df5ea55d3fc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 ;;; replace.el --- search and replace commands for XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
1476
d824841064f3 [xemacs-hg @ 2003-05-12 05:12:10 by youngs]
youngs
parents: 1333
diff changeset
3 ;; Copyright (C) 1985-7, 1992, 1994, 1997, 2003 Free Software Foundation, Inc.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 ;; Maintainer: XEmacs Development Team
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 ;; Keywords: dumped, matching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 ;; XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 ;; under the terms of the GNU General Public License as published by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ;; the Free Software Foundation; either version 2, or (at your option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ;; any later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 ;; XEmacs is distributed in the hope that it will be useful, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 ;; General Public License for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 ;; along with XEmacs; see the file COPYING. If not, write to the Free
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 ;; 02111-1307, USA.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 ;;; Synched up with: FSF 19.34 [Partially].
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 ;; This file is dumped with XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 ;; This package supplies the string and regular-expression replace functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 ;; documented in the XEmacs Reference Manual.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 ;; All the gettext calls are for XEmacs I18N3 message catalog support.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 ;; (This is hopelessly broken and we should remove it. -sb)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 (defvar case-replace t "\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 *Non-nil means `query-replace' should preserve case in replacements.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 What this means is that `query-replace' will change the case of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 replacement text so that it matches the text that was replaced.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 If this variable is nil, the replacement text will be inserted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 exactly as it was specified by the user, irrespective of the case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 of the text that was replaced.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 Note that this flag has no effect if `case-fold-search' is nil,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 or if the replacement text has any uppercase letters in it.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 (defvar query-replace-history nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 (defvar query-replace-interactive nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 "Non-nil means `query-replace' uses the last search string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 That becomes the \"string to replace\".")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 (defvar replace-search-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 (lambda (str limit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 (search-forward str limit t))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
59 "Function used by perform-replace to search forward for a string. It will be
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 called with two arguments: the string to search for and a limit bounding the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 search.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 (defvar replace-re-search-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 (lambda (regexp limit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 (re-search-forward regexp limit t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 "Function used by perform-replace to search forward for a regular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 expression. It will be called with two arguments: the regexp to search for and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 a limit bounding the search.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 (defun query-replace-read-args (string regexp-flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 (let (from to)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 (if query-replace-interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 (setq from (car (if regexp-flag regexp-search-ring search-ring)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 (setq from (read-from-minibuffer (format "%s: " (gettext string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 nil nil nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 'query-replace-history)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 (setq to (read-from-minibuffer (format "%s %s with: " (gettext string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 from)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 nil nil nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 'query-replace-history))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 (list from to current-prefix-arg)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 ;; As per suggestion from Per Abrahamsen, limit replacement to the region
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 ;; if the region is active.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 (defun query-replace (from-string to-string &optional delimited)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 "Replace some occurrences of FROM-STRING with TO-STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 As each match is found, the user must type a character saying
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 what to do with it. For directions, type \\[help-command] at that time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 If `query-replace-interactive' is non-nil, the last incremental search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 string is used as FROM-STRING--you don't have to specify it with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 minibuffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 Preserves case in each replacement if `case-replace' and `case-fold-search'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 are non-nil and FROM-STRING has no uppercase letters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 \(Preserving case means that if the string matched is all caps, or capitalized,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 then its replacement is upcased or capitalized.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 only matches surrounded by word boundaries.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 To customize possible responses, change the \"bindings\" in `query-replace-map'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 (interactive (query-replace-read-args "Query replace" nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 (perform-replace from-string to-string t nil delimited))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 (defun query-replace-regexp (regexp to-string &optional delimited)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 "Replace some things after point matching REGEXP with TO-STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 As each match is found, the user must type a character saying
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 what to do with it. For directions, type \\[help-command] at that time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 If `query-replace-interactive' is non-nil, the last incremental search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 regexp is used as REGEXP--you don't have to specify it with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 minibuffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 Preserves case in each replacement if `case-replace' and `case-fold-search'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 are non-nil and REGEXP has no uppercase letters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 only matches surrounded by word boundaries.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 In TO-STRING, `\\&' stands for whatever matched the whole of REGEXP,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 and `\\=\\N' (where N is a digit) stands for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 whatever what matched the Nth `\\(...\\)' in REGEXP."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 (interactive (query-replace-read-args "Query replace regexp" t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 (perform-replace regexp to-string t t delimited))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 ;;#### Not patently useful
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 (defun map-query-replace-regexp (regexp to-strings &optional arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 "Replace some matches for REGEXP with various strings, in rotation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 The second argument TO-STRINGS contains the replacement strings, separated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 by spaces. This command works like `query-replace-regexp' except
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 that each successive replacement uses the next successive replacement string,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 wrapping around from the last such string to the first.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 Non-interactively, TO-STRINGS may be a list of replacement strings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 If `query-replace-interactive' is non-nil, the last incremental search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 regexp is used as REGEXP--you don't have to specify it with the minibuffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 A prefix argument N says to use each replacement string N times
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 before rotating to the next."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 (interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 (let (from to)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 (setq from (if query-replace-interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 (car regexp-search-ring)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 (read-from-minibuffer "Map query replace (regexp): "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 nil nil nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 'query-replace-history)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 (setq to (read-from-minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 (format "Query replace %s with (space-separated strings): "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 from)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 nil nil nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 'query-replace-history))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 (list from to current-prefix-arg)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 (let (replacements)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 (if (listp to-strings)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 (setq replacements to-strings)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 (while (/= (length to-strings) 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 (if (string-match " " to-strings)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 (setq replacements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 (append replacements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 (list (substring to-strings 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 (string-match " " to-strings))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 to-strings (substring to-strings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 (1+ (string-match " " to-strings))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 (setq replacements (append replacements (list to-strings))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 to-strings ""))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 (perform-replace regexp replacements t t nil arg)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 (defun replace-string (from-string to-string &optional delimited)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 "Replace occurrences of FROM-STRING with TO-STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 Preserve case in each match if `case-replace' and `case-fold-search'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 are non-nil and FROM-STRING has no uppercase letters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 \(Preserving case means that if the string matched is all caps, or capitalized,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 then its replacement is upcased or capitalized.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 only matches surrounded by word boundaries.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 If `query-replace-interactive' is non-nil, the last incremental search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 string is used as FROM-STRING--you don't have to specify it with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 minibuffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 This function is usually the wrong thing to use in a Lisp program.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 What you probably want is a loop like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 (while (search-forward FROM-STRING nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 (replace-match TO-STRING nil t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 which will run faster and will not set the mark or print anything."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 (interactive (query-replace-read-args "Replace string" nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 (perform-replace from-string to-string nil nil delimited))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 (defun replace-regexp (regexp to-string &optional delimited)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 "Replace things after point matching REGEXP with TO-STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 Preserve case in each match if `case-replace' and `case-fold-search'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 are non-nil and REGEXP has no uppercase letters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 \(Preserving case means that if the string matched is all caps, or capitalized,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 then its replacement is upcased or capitalized.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 only matches surrounded by word boundaries.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 In TO-STRING, `\\&' stands for whatever matched the whole of REGEXP,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 and `\\=\\N' (where N is a digit) stands for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 whatever what matched the Nth `\\(...\\)' in REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 If `query-replace-interactive' is non-nil, the last incremental search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 regexp is used as REGEXP--you don't have to specify it with the minibuffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 This function is usually the wrong thing to use in a Lisp program.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 What you probably want is a loop like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 (while (re-search-forward REGEXP nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 (replace-match TO-STRING nil nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 which will run faster and will not set the mark or print anything."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 (interactive (query-replace-read-args "Replace regexp" t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 (perform-replace regexp to-string nil t delimited))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
215
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
216 ;; gse wonders: Is there a better place for this to go? Might other packages
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
217 ;; want to use it?
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 (defvar regexp-history nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 "History list for some commands that read regular expressions.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
221 (defun operate-on-non-matching-lines (regexp delete kill &optional beg end)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
222 "Internal function used by delete-non-matching-lines,
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
223 kill-non-matching-lines, and copy-matching-lines.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
224
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
225 REGEXP is a regular expression to *not* match when performing
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
226 operations.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
227
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
228 If DELETE is non-nil, the lines of text are deleted. It doesn't make
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
229 sense to set this to nil if KILL is nil -- nothing will happen.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
230
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
231 If KILL is non-nil, the lines of text are stored in the kill ring (as
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
232 one block of text).
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
233
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
234 BEG and END, if non-nil, specify the start and end locations to work
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
235 within. If these are nil, point and point-max are used.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
236
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
237 A match split across lines preserves all the lines it lies in.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
238 Applies to all lines after point.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
239
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
240 Returns the number of lines matched."
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
241 (with-search-caps-disable-folding regexp t
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
242 (save-excursion
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
243 ;; Move to a beginning point if specified.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
244 (when beg (goto-char beg))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
245 ;; Always start on the beginning of a line.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
246 (or (bolp) (forward-line 1))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
247
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
248 (let ((matched-text nil)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
249 (curmatch-start (point))
2610
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
250 (limit (copy-marker (point-max)))
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
251 (matched-text-buffer (generate-new-buffer " *matched-text*"))
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
252 lines-matched)
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
253 ;; Limit search if limits were specified.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
254 (when end (setq limit (copy-marker end)))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
255
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
256 ;; Search. Stop if we are at end of buffer or outside the
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
257 ;; limit.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
258 (while (not (or
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
259 (eobp)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
260 (and limit (>= (point) limit))))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
261 ;; curmatch-start is first char not preserved by previous match.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
262 (if (not (re-search-forward regexp limit 'move))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
263 (let ((curmatch-end limit))
2610
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
264 (append-to-buffer matched-text-buffer curmatch-start curmatch-end)
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
265 (if delete (delete-region curmatch-start curmatch-end)))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
266 (let ((curmatch-end (save-excursion (goto-char (match-beginning 0))
2610
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
267 (beginning-of-line)
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
268 (point))))
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
269 ;; Now curmatch-end is first char preserved by the new match.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
270 (if (< curmatch-start curmatch-end)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
271 (progn
2610
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
272 (append-to-buffer matched-text-buffer curmatch-start curmatch-end)
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
273 (if delete (delete-region curmatch-start curmatch-end))))))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
274 (setq curmatch-start (save-excursion (forward-line 1)
2610
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
275 (point)))
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
276 ;; If the match was empty, avoid matching again at same place.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
277 (and (not (eobp)) (= (match-beginning 0) (match-end 0))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
278 (forward-char 1)))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
279
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
280 ;; If any lines were matched and KILL is non-nil, insert the
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
281 ;; matched lines into the kill ring.
2610
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
282 (setq matched-text (buffer-string matched-text-buffer))
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
283 (if (and matched-text kill) (kill-new matched-text))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
284
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
285 ;; Return the number of matched lines.
2610
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
286 (setq lines-matched
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
287 (with-current-buffer matched-text-buffer
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
288 (count-lines (point-min) (point-max))))
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
289 (kill-buffer matched-text-buffer)
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
290 lines-matched))))
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
291
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 (define-function 'keep-lines 'delete-non-matching-lines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 (defun delete-non-matching-lines (regexp)
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
294 "Delete lines that do not match REGEXP, from point to the end of the
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
295 buffer (or within the region, if it is active)."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 (interactive (list (read-from-minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 "Keep lines (containing match for regexp): "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 nil nil nil 'regexp-history)))
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
299 (let ((beg nil)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
300 (end nil)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
301 (count nil))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
302 (when (region-active-p)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
303 (setq beg (region-beginning))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
304 (setq end (region-end)))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
305 (setq count (operate-on-non-matching-lines regexp t nil beg end))
1476
d824841064f3 [xemacs-hg @ 2003-05-12 05:12:10 by youngs]
youngs
parents: 1333
diff changeset
306 (when (interactive-p)
d824841064f3 [xemacs-hg @ 2003-05-12 05:12:10 by youngs]
youngs
parents: 1333
diff changeset
307 (message "%i lines deleted" count))))
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
308
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
309 (defun kill-non-matching-lines (regexp)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
310 "Delete the lines that do not match REGEXP, from point to the end of
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
311 the buffer (or within the region, if it is active). The deleted lines
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
312 are placed in the kill ring as one block of text."
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
313 (interactive (list (read-from-minibuffer
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
314 "Kill non-matching lines (regexp): "
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
315 nil nil nil 'regexp-history)))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
316 (let ((beg nil)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
317 (end nil)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
318 (count nil))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
319 (when (region-active-p)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
320 (setq beg (region-beginning))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
321 (setq end (region-end)))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
322 (setq count (operate-on-non-matching-lines regexp t t beg end))
1476
d824841064f3 [xemacs-hg @ 2003-05-12 05:12:10 by youngs]
youngs
parents: 1333
diff changeset
323 (when (interactive-p)
d824841064f3 [xemacs-hg @ 2003-05-12 05:12:10 by youngs]
youngs
parents: 1333
diff changeset
324 (message "%i lines killed" count))))
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
325
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
326 (defun copy-non-matching-lines (regexp)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
327 "Find all lines that do not match REGEXP from point to the end of the
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
328 buffer (or within the region, if it is active), and place them in the
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
329 kill ring as one block of text."
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
330 (interactive (list (read-from-minibuffer
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
331 "Copy non-matching lines (regexp): "
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
332 nil nil nil 'regexp-history)))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
333 (let ((beg nil)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
334 (end nil)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
335 (count nil))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
336 (when (region-active-p)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
337 (setq beg (region-beginning))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
338 (setq end (region-end)))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
339 (setq count (operate-on-non-matching-lines regexp nil t beg end))
1476
d824841064f3 [xemacs-hg @ 2003-05-12 05:12:10 by youngs]
youngs
parents: 1333
diff changeset
340 (when (interactive-p)
d824841064f3 [xemacs-hg @ 2003-05-12 05:12:10 by youngs]
youngs
parents: 1333
diff changeset
341 (message "%i lines copied" count))))
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
342
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
343 (defun operate-on-matching-lines (regexp delete kill &optional beg end)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
344 "Internal function used by delete-matching-lines, kill-matching-lines,
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
345 and copy-matching-lines.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
346
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
347 If DELETE is non-nil, the lines of text are deleted. It doesn't make
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
348 sense to set this to nil if KILL is nil -- nothing will happen.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
349
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
350 If KILL is non-nil, the lines of text are stored in the kill ring (as
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
351 one block of text).
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
352
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
353 BEG and END, if non-nil, specify the start and end locations to work
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
354 within. If these are nil, point and point-max are used.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
355
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
356 If a match is split across lines, all the lines it lies in are deleted.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
357 Applies to lines after point.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
358 Returns the number of lines matched."
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
359 (with-search-caps-disable-folding regexp t
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 (save-excursion
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
361 (let ((matched-text nil)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
362 (curmatch-start nil)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
363 (curmatch-end nil)
2610
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
364 (limit nil)
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
365 (matched-text-buffer (generate-new-buffer " *matched-text*"))
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
366 lines-matched)
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
367 ;; Limit search if limits were specified.
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
368 (when beg (goto-char beg))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
369 (when end (setq limit (copy-marker end)))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
370
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
371 (while (and (not (eobp))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
372 (re-search-forward regexp limit t))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
373 (setq curmatch-start (save-excursion (goto-char (match-beginning 0))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
374 (beginning-of-line)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
375 (point)))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
376 (setq curmatch-end (progn (forward-line 1) (point)))
2610
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
377 (append-to-buffer matched-text-buffer curmatch-start curmatch-end)
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
378 (if delete (delete-region curmatch-start curmatch-end)))
2610
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
379 (setq matched-text (buffer-string matched-text-buffer))
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
380 (if (and matched-text kill) (kill-new matched-text))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
381
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
382 ;; Return the number of matched lines.
2610
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
383 (setq lines-matched
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
384 (with-current-buffer matched-text-buffer
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
385 (count-lines (point-min) (point-max))))
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
386 (kill-buffer matched-text-buffer)
16738b49b833 [xemacs-hg @ 2005-02-23 22:09:13 by adrian]
adrian
parents: 1476
diff changeset
387 lines-matched))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 (define-function 'flush-lines 'delete-matching-lines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 (defun delete-matching-lines (regexp)
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
391 "Delete the lines that match REGEXP, from point to the end of the
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
392 buffer (or within the region, if it is active)."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 (interactive (list (read-from-minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 "Flush lines (containing match for regexp): "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 nil nil nil 'regexp-history)))
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
396 (let ((beg nil)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
397 (end nil)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
398 (count nil))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
399 (when (region-active-p)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
400 (setq beg (region-beginning))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
401 (setq end (region-end)))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
402 (setq count (operate-on-matching-lines regexp t nil beg end))
1476
d824841064f3 [xemacs-hg @ 2003-05-12 05:12:10 by youngs]
youngs
parents: 1333
diff changeset
403 (when (interactive-p)
d824841064f3 [xemacs-hg @ 2003-05-12 05:12:10 by youngs]
youngs
parents: 1333
diff changeset
404 (message "%i lines deleted" count))))
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
405
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
406 (defun kill-matching-lines (regexp)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
407 "Delete the lines that match REGEXP, from point to the end of the
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
408 buffer (or within the region, if it is active). The deleted lines are
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
409 placed in the kill ring as one block of text."
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
410 (interactive (list (read-from-minibuffer
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
411 "Kill lines (containing match for regexp): "
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
412 nil nil nil 'regexp-history)))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
413 (let ((beg nil)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
414 (end nil)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
415 (count nil))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
416 (when (region-active-p)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
417 (setq beg (region-beginning))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
418 (setq end (region-end)))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
419 (setq count (operate-on-matching-lines regexp t t beg end))
1476
d824841064f3 [xemacs-hg @ 2003-05-12 05:12:10 by youngs]
youngs
parents: 1333
diff changeset
420 (when (interactive-p)
d824841064f3 [xemacs-hg @ 2003-05-12 05:12:10 by youngs]
youngs
parents: 1333
diff changeset
421 (message "%i lines killed" count))))
1069
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
422
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
423 (defun copy-matching-lines (regexp)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
424 "Find all lines that match REGEXP from point to the end of the
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
425 buffer (or within the region, if it is active), and place them in the
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
426 kill ring as one block of text."
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
427 (interactive (list (read-from-minibuffer
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
428 "Copy lines (containing match for regexp): "
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
429 nil nil nil 'regexp-history)))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
430 (let ((beg nil)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
431 (end nil)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
432 (count nil))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
433 (when (region-active-p)
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
434 (setq beg (region-beginning))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
435 (setq end (region-end)))
13daf40fb997 [xemacs-hg @ 2002-10-24 14:59:22 by youngs]
youngs
parents: 456
diff changeset
436 (setq count (operate-on-matching-lines regexp nil t beg end))
1476
d824841064f3 [xemacs-hg @ 2003-05-12 05:12:10 by youngs]
youngs
parents: 1333
diff changeset
437 (when (interactive-p)
d824841064f3 [xemacs-hg @ 2003-05-12 05:12:10 by youngs]
youngs
parents: 1333
diff changeset
438 (message "%i lines copied" count))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 (define-function 'how-many 'count-matches)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 (defun count-matches (regexp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 "Print number of matches for REGEXP following point."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 (interactive (list (read-from-minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 "How many matches for (regexp): "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 nil nil nil 'regexp-history)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 (with-interactive-search-caps-disable-folding regexp t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 (let ((count 0) opoint)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 (while (and (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 (progn (setq opoint (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 (re-search-forward regexp nil t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 (if (= opoint (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 (forward-char 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 (setq count (1+ count))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 (message "%d occurrences" count)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 (defvar occur-mode-map ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 (if occur-mode-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 (setq occur-mode-map (make-sparse-keymap))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 (set-keymap-name occur-mode-map 'occur-mode-map) ; XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 (define-key occur-mode-map 'button2 'occur-mode-mouse-goto) ; XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 (define-key occur-mode-map "\C-c\C-c" 'occur-mode-goto-occurrence)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 (define-key occur-mode-map "\C-m" 'occur-mode-goto-occurrence))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 (defvar occur-buffer nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 (defvar occur-nlines nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 (defvar occur-pos-list nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 (defun occur-mode ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 "Major mode for output from \\[occur].
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 \\<occur-mode-map>Move point to one of the items in this buffer, then use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 \\[occur-mode-goto-occurrence] to go to the occurrence that the item refers to.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 Alternatively, click \\[occur-mode-mouse-goto] on an item to go to it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 \\{occur-mode-map}"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 (kill-all-local-variables)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 (use-local-map occur-mode-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 (setq major-mode 'occur-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 (setq mode-name (gettext "Occur")) ; XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 (make-local-variable 'occur-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 (make-local-variable 'occur-nlines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 (make-local-variable 'occur-pos-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 (require 'mode-motion) ; XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 (setq mode-motion-hook 'mode-motion-highlight-line) ; XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 (run-hooks 'occur-mode-hook))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 ;; FSF Version of next function:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 ; (let (buffer pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 ; (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 ; (set-buffer (window-buffer (posn-window (event-end event))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 ; (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 ; (goto-char (posn-point (event-end event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 ; (setq pos (occur-mode-find-occurrence))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 ; (setq buffer occur-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 ; (pop-to-buffer buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 ; (goto-char (marker-position pos))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 (defun occur-mode-mouse-goto (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 "Go to the occurrence highlighted by mouse.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
502 This function should be bound to a mouse key in the `*Occur*' buffer."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 (interactive "e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 (let ((window-save (selected-window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 (frame-save (selected-frame)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 ;; preserve the window/frame setup
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 (mouse-set-point event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 (occur-mode-goto-occurrence))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 (select-frame frame-save)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 (select-window window-save))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 ;; Called occur-mode-find-occurrence in FSF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 (defun occur-mode-goto-occurrence ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 "Go to the occurrence the current line describes."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 (if (or (null occur-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 (null (buffer-name occur-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 (setq occur-buffer nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 occur-pos-list nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 (error "Buffer in which occurrences were found is deleted")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 (let* ((line-count
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 (count-lines (point-min)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 (occur-number (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 (/ (1- line-count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 (cond ((< occur-nlines 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 (- 2 occur-nlines))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 ((> occur-nlines 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 (+ 2 (* 2 occur-nlines)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 (t 1)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 (pos (nth occur-number occur-pos-list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 ;; removed t arg from Bob Weiner, 10/6/95
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 (window (get-buffer-window occur-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 (occur-source-buffer occur-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 (if (< line-count 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 (error "No occurrence on this line"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 (or pos
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 (error "No occurrence on this line"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 ;; XEmacs: don't raise window unless it isn't visible
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 ;; allow for the possibility that the occur buffer is on another frame
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 (or (and window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 (window-live-p window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 (frame-visible-p (window-frame window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 (set-buffer occur-source-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 (and (pop-to-buffer occur-source-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 (setq window (get-buffer-window occur-source-buffer))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 (goto-char pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 (set-window-point window pos)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 (defvar list-matching-lines-default-context-lines 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 "*Default number of context lines to include around a `list-matching-lines'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 match. A negative number means to include that many lines before the match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 A positive number means to include that many lines both before and after.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 ;; XEmacs addition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 ;;; Damn you Jamie, this is utter trash.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 (defvar list-matching-lines-whole-buffer t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 "If t, occur operates on whole buffer, otherwise occur starts from point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 default is t.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 (define-function 'occur 'list-matching-lines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 (defun list-matching-lines (regexp &optional nlines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 "Show all lines in the current buffer containing a match for REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 If a match spreads across multiple lines, all those lines are shown.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573
448
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 444
diff changeset
574 If variable `list-matching-lines-whole-buffer' is non-nil, the entire
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 444
diff changeset
575 buffer is searched, otherwise search begins at point.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 Each line is displayed with NLINES lines before and after, or -NLINES
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 before if NLINES is negative.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 NLINES defaults to `list-matching-lines-default-context-lines'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 Interactively it is the prefix arg.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 The lines are shown in a buffer named `*Occur*'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 It serves as a menu to find any of the occurrences in this buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 \\[describe-mode] in that buffer will explain how."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 (interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 ;; XEmacs change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 (list (let* ((default (or (symbol-near-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 (and regexp-history
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 (car regexp-history))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 (minibuffer-history-minimum-string-length 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 (input
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 (if default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 ;; rewritten for I18N3 snarfing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 (read-from-minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 (format "List lines matching regexp (default `%s'): "
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 448
diff changeset
596 default) nil nil nil 'regexp-history nil
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 448
diff changeset
597 default)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 (read-from-minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 "List lines matching regexp: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 nil nil nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 'regexp-history))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 (if (and (equal input "") default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 (setq input default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 (setcar regexp-history default)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 ;; clear extra entries
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 (setcdr regexp-history (delete (car regexp-history)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 (cdr regexp-history)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 input)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 current-prefix-arg))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 (if (equal regexp "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 (error "Must pass non-empty regexp to `list-matching-lines'"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 (setq nlines (if nlines (prefix-numeric-value nlines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 list-matching-lines-default-context-lines))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 (let ((first t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 (dir default-directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 (buffer (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 (linenum 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 (prevpos (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 ;; The rest of this function is very different from FSF.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 ;; Presumably that's due to Jamie's misfeature
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 (final-context-start (make-marker)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 (if (not list-matching-lines-whole-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 (setq linenum (1+ (count-lines (point-min) (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 (setq prevpos (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 (with-output-to-temp-buffer "*Occur*"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 (set-buffer standard-output)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 (setq default-directory dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 ;; We will insert the number of lines, and "lines", later.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 ;; #### Needs fixing for I18N3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 (let ((print-escape-newlines t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 (insert (format " matching %s in buffer %s.\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 regexp (buffer-name buffer))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 (occur-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 (setq occur-buffer buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 (setq occur-nlines nlines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 (setq occur-pos-list ()))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 (if (eq buffer standard-output)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 (goto-char (point-max)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 (with-interactive-search-caps-disable-folding regexp t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 (if list-matching-lines-whole-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 (beginning-of-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 (message "Searching for %s ..." regexp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 ;; Find next match, but give up if prev match was at end of buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 (while (and (not (= prevpos (point-max)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 (re-search-forward regexp nil t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 (goto-char (match-beginning 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 (save-match-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 (setq linenum (+ linenum (count-lines prevpos (point)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 (setq prevpos (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 (goto-char (match-end 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 (let* ((start (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 (goto-char (match-beginning 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 (forward-line (if (< nlines 0) nlines (- nlines)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 (end (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 (goto-char (match-end 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 (if (> nlines 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 (forward-line (1+ nlines))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 (forward-line 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 (tag (format "%5d" linenum))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 (empty (make-string (length tag) ?\ ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 tem)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 (setq tem (make-marker))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 (set-marker tem (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 (set-buffer standard-output)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 (setq occur-pos-list (cons tem occur-pos-list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 (or first (zerop nlines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 (insert "--------\n"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 (setq first nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 (insert-buffer-substring buffer start end)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
679 (set-marker final-context-start
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 (- (point) (- end (match-end 0))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 (backward-char (- end start))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 (setq tem (if (< nlines 0) (- nlines) nlines))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 (while (> tem 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 (insert empty ?:)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 (forward-line 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 (setq tem (1- tem)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 (let ((this-linenum linenum))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 (while (< (point) final-context-start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 (if (null tag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 (setq tag (format "%5d" this-linenum)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 (insert tag ?:)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
692 ;; FSFmacs --
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 ;; we handle this using mode-motion-highlight-line, above.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 ;; (put-text-property (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 ;; (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 ;; (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 ;; (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 ;; (end-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 ;; (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 ;; 'mouse-face 'highlight)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 (forward-line 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 (setq tag nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 (setq this-linenum (1+ this-linenum)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 (while (<= (point) final-context-start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 (insert empty ?:)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 (forward-line 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 (setq this-linenum (1+ this-linenum))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 (while (< tem nlines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 (insert empty ?:)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 (forward-line 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 (setq tem (1+ tem)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 (goto-char (point-max)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 (forward-line 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 (set-buffer standard-output)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 ;; Put positions in increasing order to go with buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 (setq occur-pos-list (nreverse occur-pos-list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 (goto-char (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 (if (= (length occur-pos-list) 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 (insert "1 line")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 (insert (format "%d lines" (length occur-pos-list))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 (if (interactive-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 (message "%d matching lines." (length occur-pos-list))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 ;; It would be nice to use \\[...], but there is no reasonable way
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 ;; to make that display both SPC and Y.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 (defconst query-replace-help
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
727 "Type Space or `y' to replace one match, Delete or `n' to skip to next,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 RET or `q' to exit, Period to replace one match and exit,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 Comma to replace but not move point immediately,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 C-r to enter recursive edit (\\[exit-recursive-edit] to get out again),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 C-w to delete match and recursive edit,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 C-l to clear the frame, redisplay, and offer same replacement again,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 ! to replace all remaining matches with no more questions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 ^ to move point back to previous match."
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
735
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 "Help message while in query-replace")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 (defvar query-replace-map nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 "Keymap that defines the responses to questions in `query-replace'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 The \"bindings\" in this map are not commands; they are answers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 The valid answers include `act', `skip', `act-and-show',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 `exit', `act-and-exit', `edit', `delete-and-edit', `recenter',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 `automatic', `backup', `exit-prefix', and `help'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 ;; Why does it seem that ever file has a different method of doing this?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 (if query-replace-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 (let ((map (make-sparse-keymap)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 (set-keymap-name map 'query-replace-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 (define-key map " " 'act)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 (define-key map "\d" 'skip)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 (define-key map [delete] 'skip)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 (define-key map [backspace] 'skip)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 (define-key map "y" 'act)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 (define-key map "n" 'skip)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 (define-key map "Y" 'act)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 (define-key map "N" 'skip)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 (define-key map "," 'act-and-show)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 (define-key map [escape] 'exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 (define-key map "q" 'exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 (define-key map [return] 'exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 (define-key map "." 'act-and-exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 (define-key map "\C-r" 'edit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 (define-key map "\C-w" 'delete-and-edit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 (define-key map "\C-l" 'recenter)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 (define-key map "!" 'automatic)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 (define-key map "^" 'backup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 (define-key map [(control h)] 'help) ;; XEmacs change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 (define-key map [f1] 'help)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 (define-key map [help] 'help)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 (define-key map "?" 'help)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 (define-key map "\C-g" 'quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 (define-key map "\C-]" 'quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 ;FSFmacs (define-key map "\e" 'exit-prefix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 (define-key map [escape] 'exit-prefix)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
776
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 (setq query-replace-map map)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 ;; isearch-mode is dumped, so don't autoload.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 ;(autoload 'isearch-highlight "isearch")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 ;; XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 (defun perform-replace-next-event (event)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
784 (if search-highlight
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 (let ((aborted t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 (if (match-beginning 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 (isearch-highlight (match-beginning 0) (match-end 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 (next-command-event event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 (setq aborted nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 (isearch-dehighlight aborted)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 (next-command-event event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 (defun perform-replace (from-string replacements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 query-flag regexp-flag delimited-flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 &optional repeat-count map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 "Subroutine of `query-replace'. Its complexity handles interactive queries.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 Don't use this in your own program unless you want to query and set the mark
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 just as `query-replace' does. Instead, write a simple loop like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 (while (re-search-forward \"foo[ \t]+bar\" nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 (replace-match \"foobar\" nil nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 which will run faster and probably do exactly what you want.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
804 When searching for a match, this function uses
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
805 `replace-search-function' and `replace-re-search-function'."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 (or map (setq map query-replace-map))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 (let* ((event (make-event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 (nocasify (not (and case-fold-search case-replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 (string-equal from-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 (downcase from-string)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 (literal (not regexp-flag))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
812 (search-function (if regexp-flag
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
813 replace-re-search-function
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 replace-search-function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 (search-string from-string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 (real-match-data nil) ; the match data for the current match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 (next-replacement nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 (replacement-index 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 (keep-going t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 (stack nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 (next-rotate-count 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 (replace-count 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 (lastrepl nil) ;Position after last match considered.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 ;; If non-nil, it is marker saying where in the buffer to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 ;; stop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 (limit nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 (match-again t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 ;; XEmacs addition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 (qr-case-fold-search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 (if (and case-fold-search search-caps-disable-folding)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 (no-upper-case-p search-string regexp-flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 case-fold-search))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 (message
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 (if query-flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 (substitute-command-keys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 "Query replacing %s with %s: (\\<query-replace-map>\\[help] for help) "))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 ;; If the region is active, operate on region.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 (when (region-active-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 ;; Original Per Abrahamsen's code simply narrowed the region,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 ;; thus providing a visual indication of the search boundary.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 ;; Stallman, on the other hand, handles it like this.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 (setq limit (copy-marker (region-end)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 (goto-char (region-beginning))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 (zmacs-deactivate-region))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 (if (stringp replacements)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 (setq next-replacement replacements)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 (or repeat-count (setq repeat-count 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 (if delimited-flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 (setq search-function replace-re-search-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 search-string (concat "\\b"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 (if regexp-flag from-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 (regexp-quote from-string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 "\\b")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 (push-mark)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 (undo-boundary)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 ;; Loop finding occurrences that perhaps should be replaced.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 (while (and keep-going
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 (or (null limit) (< (point) limit))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 (let ((case-fold-search qr-case-fold-search))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 (funcall search-function search-string limit))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 ;; If the search string matches immediately after
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 ;; the previous match, but it did not match there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 ;; before the replacement was done, ignore the match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 (if (or (eq lastrepl (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 (and regexp-flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 (eq lastrepl (match-beginning 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 (not match-again)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 (if (or (eobp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 (and limit (>= (point) limit)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 nil
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
873 ;; Don't replace the null string
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 ;; right after end of previous replacement.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 (forward-char 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 (let ((case-fold-search qr-case-fold-search))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 (funcall search-function search-string limit)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 ;; Save the data associated with the real match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 (setq real-match-data (match-data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 ;; Before we make the replacement, decide whether the search string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 ;; can match again just after this match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 (if regexp-flag
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
886 (progn
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 (setq match-again (looking-at search-string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 ;; XEmacs addition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 (store-match-data real-match-data)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 ;; If time for a change, advance to next replacement string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 (if (and (listp replacements)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 (= next-rotate-count replace-count))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 (setq next-rotate-count
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 (+ next-rotate-count repeat-count))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 (setq next-replacement (nth replacement-index replacements))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 (setq replacement-index (% (1+ replacement-index) (length replacements)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 (if (not query-flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 (store-match-data real-match-data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 (replace-match next-replacement nocasify literal)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 (setq replace-count (1+ replace-count)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 (undo-boundary)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 (let ((help-form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 '(concat (format "Query replacing %s%s with %s.\n\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 (if regexp-flag (gettext "regexp ") "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 from-string next-replacement)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 (substitute-command-keys query-replace-help)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 done replaced def)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 ;; Loop reading commands until one of them sets done,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 ;; which means it has finished handling this occurrence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 (while (not done)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 ;; Don't fill up the message log
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 ;; with a bunch of identical messages.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 ;; XEmacs change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 (display-message 'prompt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 (format message from-string next-replacement))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 (perform-replace-next-event event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 (setq def (lookup-key map (vector event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 ;; Restore the match data while we process the command.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 (store-match-data real-match-data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 (cond ((eq def 'help)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 (with-output-to-temp-buffer (gettext "*Help*")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 (princ (concat
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 (format "Query replacing %s%s with %s.\n\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 (if regexp-flag "regexp " "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 from-string next-replacement)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 (substitute-command-keys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 query-replace-help)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 (set-buffer standard-output)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 (help-mode))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 ((eq def 'exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 (setq keep-going nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 (setq done t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 ((eq def 'backup)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 (if stack
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 (let ((elt (car stack)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 (goto-char (car elt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 (setq replaced (eq t (cdr elt)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 (or replaced
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 (store-match-data (cdr elt)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 (setq stack (cdr stack)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 (message "No previous match")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 (ding 'no-terminate)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946 (sit-for 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 ((eq def 'act)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 (or replaced
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 (replace-match next-replacement nocasify literal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 (setq done t replaced t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 ((eq def 'act-and-exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 (or replaced
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 (replace-match next-replacement nocasify literal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 (setq keep-going nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 (setq done t replaced t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 ((eq def 'act-and-show)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 (if (not replaced)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 (replace-match next-replacement nocasify literal)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 (store-match-data nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 (setq replaced t))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 ((eq def 'automatic)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 (or replaced
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 (replace-match next-replacement nocasify literal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 (setq done t query-flag nil replaced t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 ((eq def 'skip)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 (setq done t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 ((eq def 'recenter)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 (recenter nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 ((eq def 'edit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 (store-match-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 (prog1 (match-data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 (save-excursion (recursive-edit))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 ;; Before we make the replacement,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 ;; decide whether the search string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 ;; can match again just after this match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 (if regexp-flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 (setq match-again (looking-at search-string))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 ((eq def 'delete-and-edit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 (delete-region (match-beginning 0) (match-end 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 (store-match-data (prog1 (match-data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 (save-excursion (recursive-edit))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 (setq replaced t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 ;; Note: we do not need to treat `exit-prefix'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 ;; specially here, since we reread
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 ;; any unrecognized character.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 (setq this-command 'mode-exited)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 (setq keep-going nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 (setq unread-command-events
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 (cons event unread-command-events))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 (setq done t))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 ;; Record previous position for ^ when we move on.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 ;; Change markers to numbers in the match data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 ;; since lots of markers slow down editing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 (setq stack
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 (cons (cons (point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 (or replaced
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 (match-data t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 stack))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 (if replaced (setq replace-count (1+ replace-count)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 (setq lastrepl (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 ;; Useless in XEmacs. We handle (de)highlighting through
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 ;; perform-replace-next-event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 ;(replace-dehighlight)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 (or unread-command-events
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 (message "Replaced %d occurrence%s"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 replace-count
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 (if (= replace-count 1) "" "s")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 (and keep-going stack)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 ;; FSFmacs code: someone should port it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 ;(defvar query-replace-highlight nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 ; "*Non-nil means to highlight words during query replacement.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 ;(defvar replace-overlay nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 ;(defun replace-dehighlight ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 ; (and replace-overlay
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 ; (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 ; (delete-overlay replace-overlay)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 ; (setq replace-overlay nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 ;(defun replace-highlight (start end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 ; (and query-replace-highlight
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 ; (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 ; (or replace-overlay
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 ; (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 ; (setq replace-overlay (make-overlay start end))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 ; (overlay-put replace-overlay 'face
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 ; (if (internal-find-face 'query-replace)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 ; 'query-replace 'region))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 ; (move-overlay replace-overlay start end (current-buffer)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 ;;; replace.el ends here