Mercurial > hg > xemacs-beta
annotate lisp/list-mode.el @ 1204:e22b0213b713
[xemacs-hg @ 2003-01-12 11:07:58 by michaels]
modules/ChangeLog:
2002-12-16 Ben Wing <ben@xemacs.org>
* postgresql/postgresql.c:
remove ifdef USE_KKCC.
src/ChangeLog:
2003-01-08 Mike Sperber <mike@xemacs.org>
* console.h (CDFW_CONSOLE): Don't lead to a crash if we're dealing
with a dead window/frame/device/console.
2002-12-20 Mike Sperber <mike@xemacs.org>
* ui-gtk.c: Fix typo from Ben's patch: emacs_ffi_data is a
typedef, not a struct. emacs_gtk_object_data is a typedef, not a
struct.
* gtk-glue.c (gdk_event_to_emacs_event): Fix typos from Ben's
patch: le -> emacs_event + rearrange the code.
* event-gtk.c (gtk_event_to_emacs_event): Fix typos from Ben's
patch: ..._UNDERLYING_GDK_EVENT -> ..._GDK_EVENT, ev -> key_event.
* device-gtk.c: Fix typo from Ben's patch: x_keysym_map_hash_table
-> x_keysym_map_hashtable.
2002-12-19 Mike Sperber <mike@xemacs.org>
* menubar-x.c (set_frame_menubar): Initialize protect_me field of
popup_data.
2002-12-16 Ben Wing <ben@xemacs.org>
Major cleanup of KKCC, etc.
KKCC, pdump-related:
-- descriptions are written for all objects. this required some
changes in the format of some objects, e.g. extents, popup-data,
coding system, lstream, lcrecord-list.
-- KKCC now handles weakness in markers, hash tables, elsewhere
correctly (formerly, you'd eventually get a stack overflow due
to endlessly expanding markers).
-- textual changes: lrecord_description -> memory_description,
struct_description -> sized_memory_description.
-- extensive comment describing descriptions and pdump.
-- redo XD_UNION so it works inline and change its format to provide
sufficient info for pdump. implement XD_UNION in pdump. also add
XD_UNION_DYNAMIC_SIZE, which works like XD_UNION except for when
auto-computing structure sizes.
-- add support for XD_INDIRECT in description offsets (used by
extents).
-- add support for "description maps", allowing for indirect
descriptions that are retrieved from an object at run-time. this
generalizes XD_CODING_SYSTEM_END, XD_SPECIFIER_END, etc., which
have now been eliminated.
-- add a fifth field "flags" to memory_description, to support flags
that can be specified for this particular line. Currently defined
flags are XD_FLAG_NO_KKCC (KKCC should ignore this entry; useful
for the weakness above in markers, etc.), XD_FLAG_NO_PDUMP (pdump
should ignore this entry), XD_FLAG_UNION_DEFAULT_ENTRY (in
union maps, this specifies a "default" entry for all remaining
values), and XD_FLAG_FREE_LISP_OBJECT (for use with lcrecord-lists).
-- clean up the kkcc-itis in events, so that the differences
between event data as separate objects and as a union are now
minimized to a small number of places. with the new XD_UNION, we
no longer need event data as separate objects, so this code is no
longer ifdef USE_KKCC, but instead ifdef EVENT_DATA_AS_OBJECTS,
not used by default. make sure that we explicitly free the
separate event data objects when no longer in use, to maintain the
invariant the event processing causes no consing.
-- also remove other USE_KKCC ifdefs when not necessary.
-- allow for KKCC compilation under MS Windows.
-- fix README.kkcc.
-- dump_add_root_object -> dump_add_root_lisp_object.
-- implement dump_add_root_block and use this to handle
dump_add_opaque.
-- factor out some code duplicated in kkcc and pdump.
Other allocation/object-related:
-- change various *slots.h so MARKED_SLOT() call no longer
includes semicolon.
-- free_marker() takes a Lisp_Object not a direct pointer.
-- make bit vectors lcrecords, like vectors, and eliminate code
that essentially duplicated the lcrecord handling.
-- additional asserts in FREE_FIXED_TYPE, formerly duplicated in
the various callers of this.
-- all lcrecord allocation functions now zero out the returned
lcrecords. unnecessary calls to zero_lcrecord removed. add long
comment describing these functions.
-- extract out process and coding system slots, like for buffers,
frames, etc.
-- lcrecords now set the type of items sitting on the free list to
lcrecord_type_free.
-- changes to the way that gap arrays are allocated, for kkcc's
benefit -- now, one single memory block with a stretchy array on
the end, instead of a separate block holding the array.
Error-checking-related:
-- now can compile with C++ under MS Windows. clean up compile errors
discovered that way. (a few were real problems)
-- add C++ error-checking code to verify problems with mismatched
GCPRO/UNGCPRO. (there were a few in the kkcc code.) add long
comment about how to catch insufficient GCPRO (yes, it's possible
using C++).
-- add debug_p4(), a simple object printer, when debug_print()
doesn't work.
-- add dp() and db() as short synonyms of debug_print(),
debug_backtrace().
-- `print' tries EXTREMELY hard to avoid core dumping when printing
when crashing or from debug_print(), and tries as hard as it
reasonably can in other situations.
-- Correct the message output upon crashing to be more up-to-date.
Event-related:
-- document event-matches-key-specifier-p better.
-- generalize the dispatch queues formerly duplicated in the
various event implementations. add event methods to drain pending
events. generalize and clean up QUIT handling, removing
event-specific quit processing. allow arbitrary keystrokes, not
just ASCII, to be the QUIT char. among other things, this should
fix some longstanding bugs in X quit handling. long comment
describing the various event queues.
-- implement delaying of XFlush() if there are pending expose events.
SOMEONE PLEASE TRY THIS OUT.
-- Fix `xemacs -batch -l dunnet' under Cygwin. Try to fix under
MS Windows but not quite there yet.
Other:
-- class -> class_ and no more C++ games with this item.
new -> new_ in the lwlib code, so far not elsewhere.
-- use `struct htentry' not `struct hentry' in elhash.c to avoid
debugger confusion with hash.c.
-- new macros ALIST_LOOP_3, ALIST_LOOP_4.
* README.kkcc:
* alloc.c:
* alloc.c (deadbeef_memory):
* alloc.c (allocate_lisp_storage):
* alloc.c (copy_lisp_object):
* alloc.c (ALLOCATE_FIXED_TYPE_1):
* alloc.c (FREE_FIXED_TYPE):
* alloc.c (make_vector_internal):
* alloc.c (make_bit_vector_internal):
* alloc.c (make_key_data):
* alloc.c (make_button_data):
* alloc.c (make_motion_data):
* alloc.c (make_process_data):
* alloc.c (make_timeout_data):
* alloc.c (make_magic_data):
* alloc.c (make_magic_eval_data):
* alloc.c (make_eval_data):
* alloc.c (make_misc_user_data):
* alloc.c (struct string_chars_block):
* alloc.c (mark_lcrecord_list):
* alloc.c (make_lcrecord_list):
* alloc.c (alloc_managed_lcrecord):
* alloc.c (free_managed_lcrecord):
* alloc.c (alloc_automanaged_lcrecord):
* alloc.c (staticpro_1):
* alloc.c (staticpro):
* alloc.c (lispdesc_indirect_count_1):
* alloc.c (lispdesc_indirect_description_1):
* alloc.c (lispdesc_one_description_line_size):
* alloc.c (lispdesc_structure_size):
* alloc.c (mark_object_maybe_checking_free):
* alloc.c (mark_with_description):
* alloc.c (mark_struct_contents):
* alloc.c (mark_object):
* alloc.c (tick_lcrecord_stats):
* alloc.c (free_cons):
* alloc.c (free_key_data):
* alloc.c (free_button_data):
* alloc.c (free_motion_data):
* alloc.c (free_process_data):
* alloc.c (free_timeout_data):
* alloc.c (free_magic_data):
* alloc.c (free_magic_eval_data):
* alloc.c (free_eval_data):
* alloc.c (free_misc_user_data):
* alloc.c (free_marker):
* alloc.c (compact_string_chars):
* alloc.c (gc_sweep):
* alloc.c (garbage_collect_1):
* alloc.c (Fgarbage_collect):
* alloc.c (common_init_alloc_early):
* alloc.c (init_alloc_early):
* alloc.c (init_alloc_once_early):
* buffer.c:
* buffer.c (mark_buffer):
* buffer.c (MARKED_SLOT):
* buffer.c (cleanup_buffer_undo_lists):
* buffer.c (Fget_file_buffer):
* buffer.h (MARKED_SLOT):
* bufslots.h:
* bytecode.c:
* callint.c:
* casetab.c:
* chartab.c:
* chartab.c (symbol_to_char_table_type):
* cmdloop.c:
* cmdloop.c (Fcommand_loop_1):
* config.h.in (new):
* conslots.h:
* console-gtk-impl.h (struct gtk_frame):
* console-impl.h:
* console-impl.h (struct console):
* console-impl.h (MARKED_SLOT):
* console-impl.h (CONSOLE_QUIT_EVENT):
* console-msw-impl.h (XM_BUMPQUEUE):
* console-msw.c (write_string_to_mswindows_debugging_output):
* console-msw.h:
* console-stream-impl.h:
* console-stream-impl.h (struct stream_console):
* console-stream.c:
* console-stream.c (stream_init_console):
* console-stream.h:
* console-tty.c:
* console-tty.h:
* console-x.h:
* console.c:
* console.c (mark_console):
* console.c (MARKED_SLOT):
* console.c (allocate_console):
* console.c (get_console_variant):
* console.c (create_console):
* console.c (delete_console_internal):
* console.c (Fset_input_mode):
* console.c (Fcurrent_input_mode):
* console.c (common_init_complex_vars_of_console):
* console.h:
* console.h (console_variant):
* console.h (device_metrics):
* data.c:
* data.c (Faref):
* data.c (Faset):
* data.c (decode_weak_list_type):
* database.c:
* debug.c (xemacs_debug_loop):
* debug.c (FROB):
* debug.c (Fadd_debug_class_to_check):
* debug.c (Fdelete_debug_class_to_check):
* debug.c (Fset_debug_classes_to_check):
* debug.c (Fset_debug_class_types_to_check):
* debug.c (Fdebug_types_being_checked):
* debug.h (DASSERT):
* device-gtk.c:
* device-impl.h (struct device):
* device-impl.h (MARKED_SLOT):
* device-msw.c:
* device-x.c:
* device-x.c (x_init_device_class):
* device-x.c (x_comp_visual_info):
* device-x.c (x_try_best_visual_class):
* device-x.c (x_init_device):
* device-x.c (construct_name_list):
* device-x.c (x_get_resource_prefix):
* device-x.c (Fx_get_resource):
* device-x.c (Fx_display_visual_class):
* device.c:
* device.c (MARKED_SLOT):
* device.c (allocate_device):
* device.c (Fmake_device):
* device.c (delete_device_internal):
* device.c (Fset_device_class):
* device.h:
* devslots.h:
* devslots.h (MARKED_SLOT):
* dialog-msw.c:
* dired-msw.c (mswindows_ls_sort_fcn):
* dired-msw.c (mswindows_get_files):
* dired-msw.c (mswindows_format_file):
* doprnt.c (parse_doprnt_spec):
* dumper.c:
* dumper.c (struct):
* dumper.c (dump_add_root_block):
* dumper.c (dump_add_root_struct_ptr):
* dumper.c (dump_add_root_lisp_object):
* dumper.c (pdump_struct_list_elt):
* dumper.c (pdump_get_entry_list):
* dumper.c (pdump_backtrace):
* dumper.c (pdump_bump_depth):
* dumper.c (pdump_register_sub):
* dumper.c (pdump_register_object):
* dumper.c (pdump_register_struct_contents):
* dumper.c (pdump_register_struct):
* dumper.c (pdump_store_new_pointer_offsets):
* dumper.c (pdump_dump_data):
* dumper.c (pdump_reloc_one):
* dumper.c (pdump_allocate_offset):
* dumper.c (pdump_scan_by_alignment):
* dumper.c (pdump_dump_root_blocks):
* dumper.c (pdump_dump_rtables):
* dumper.c (pdump_dump_root_lisp_objects):
* dumper.c (pdump):
* dumper.c (pdump_load_finish):
* dumper.c (pdump_file_get):
* dumper.c (pdump_resource_get):
* dumper.c (pdump_load):
* editfns.c (save_excursion_restore):
* editfns.c (user_login_name):
* editfns.c (save_restriction_restore):
* elhash.c:
* elhash.c (htentry):
* elhash.c (struct Lisp_Hash_Table):
* elhash.c (HTENTRY_CLEAR_P):
* elhash.c (LINEAR_PROBING_LOOP):
* elhash.c (check_hash_table_invariants):
* elhash.c (mark_hash_table):
* elhash.c (hash_table_equal):
* elhash.c (print_hash_table_data):
* elhash.c (free_hentries):
* elhash.c (make_general_lisp_hash_table):
* elhash.c (decode_hash_table_weakness):
* elhash.c (decode_hash_table_test):
* elhash.c (Fcopy_hash_table):
* elhash.c (resize_hash_table):
* elhash.c (pdump_reorganize_hash_table):
* elhash.c (find_htentry):
* elhash.c (Fgethash):
* elhash.c (Fputhash):
* elhash.c (remhash_1):
* elhash.c (Fremhash):
* elhash.c (Fclrhash):
* elhash.c (copy_compress_hentries):
* elhash.c (elisp_maphash_unsafe):
* elhash.c (finish_marking_weak_hash_tables):
* elhash.c (prune_weak_hash_tables):
* elhash.h:
* emacs.c:
* emacs.c (main_1):
* emacs.c (main):
* emacs.c (shut_down_emacs):
* emodules.h (dump_add_root_lisp_object):
* eval.c:
* eval.c (unwind_to_catch):
* eval.c (maybe_signal_error_1):
* eval.c (maybe_signal_continuable_error_1):
* eval.c (maybe_signal_error):
* eval.c (maybe_signal_continuable_error):
* eval.c (maybe_signal_error_2):
* eval.c (maybe_signal_continuable_error_2):
* eval.c (maybe_signal_ferror):
* eval.c (maybe_signal_continuable_ferror):
* eval.c (maybe_signal_ferror_with_frob):
* eval.c (maybe_signal_continuable_ferror_with_frob):
* eval.c (maybe_syntax_error):
* eval.c (maybe_sferror):
* eval.c (maybe_invalid_argument):
* eval.c (maybe_invalid_constant):
* eval.c (maybe_invalid_operation):
* eval.c (maybe_invalid_change):
* eval.c (maybe_invalid_state):
* eval.c (Feval):
* eval.c (call_trapping_problems):
* eval.c (call_with_suspended_errors):
* eval.c (warn_when_safe_lispobj):
* eval.c (warn_when_safe):
* eval.c (vars_of_eval):
* event-Xt.c:
* event-Xt.c (maybe_define_x_key_as_self_inserting_character):
* event-Xt.c (x_to_emacs_keysym):
* event-Xt.c (x_event_to_emacs_event):
* event-Xt.c (emacs_Xt_enqueue_focus_event):
* event-Xt.c (emacs_Xt_format_magic_event):
* event-Xt.c (emacs_Xt_compare_magic_event):
* event-Xt.c (emacs_Xt_hash_magic_event):
* event-Xt.c (emacs_Xt_handle_magic_event):
* event-Xt.c (Xt_timeout_to_emacs_event):
* event-Xt.c (Xt_process_to_emacs_event):
* event-Xt.c (signal_special_Xt_user_event):
* event-Xt.c (emacs_Xt_next_event):
* event-Xt.c (emacs_Xt_event_handler):
* event-Xt.c (emacs_Xt_drain_queue):
* event-Xt.c (emacs_Xt_event_pending_p):
* event-Xt.c (check_if_pending_expose_event):
* event-Xt.c (reinit_vars_of_event_Xt):
* event-Xt.c (vars_of_event_Xt):
* event-gtk.c:
* event-gtk.c (IS_MODIFIER_KEY):
* event-gtk.c (emacs_gtk_format_magic_event):
* event-gtk.c (emacs_gtk_compare_magic_event):
* event-gtk.c (emacs_gtk_hash_magic_event):
* event-gtk.c (emacs_gtk_handle_magic_event):
* event-gtk.c (gtk_to_emacs_keysym):
* event-gtk.c (gtk_timeout_to_emacs_event):
* event-gtk.c (gtk_process_to_emacs_event):
* event-gtk.c (dragndrop_data_received):
* event-gtk.c (signal_special_gtk_user_event):
* event-gtk.c (emacs_gtk_next_event):
* event-gtk.c (gtk_event_to_emacs_event):
* event-gtk.c (generic_event_handler):
* event-gtk.c (emacs_shell_event_handler):
* event-gtk.c (emacs_gtk_drain_queue):
* event-gtk.c (emacs_gtk_event_pending_p):
* event-gtk.c (reinit_vars_of_event_gtk):
* event-gtk.c (vars_of_event_gtk):
* event-msw.c:
* event-msw.c (struct winsock_stream):
* event-msw.c (winsock_reader):
* event-msw.c (winsock_writer):
* event-msw.c (mswindows_enqueue_dispatch_event):
* event-msw.c (mswindows_enqueue_misc_user_event):
* event-msw.c (mswindows_enqueue_magic_event):
* event-msw.c (mswindows_enqueue_process_event):
* event-msw.c (mswindows_enqueue_mouse_button_event):
* event-msw.c (mswindows_enqueue_keypress_event):
* event-msw.c (mswindows_dequeue_dispatch_event):
* event-msw.c (emacs_mswindows_drain_queue):
* event-msw.c (mswindows_need_event_in_modal_loop):
* event-msw.c (mswindows_need_event):
* event-msw.c (mswindows_wm_timer_callback):
* event-msw.c (dde_eval_string):
* event-msw.c (Fdde_alloc_advise_item):
* event-msw.c (mswindows_dde_callback):
* event-msw.c (mswindows_wnd_proc):
* event-msw.c (remove_timeout_mapper):
* event-msw.c (emacs_mswindows_remove_timeout):
* event-msw.c (emacs_mswindows_event_pending_p):
* event-msw.c (emacs_mswindows_format_magic_event):
* event-msw.c (emacs_mswindows_compare_magic_event):
* event-msw.c (emacs_mswindows_hash_magic_event):
* event-msw.c (emacs_mswindows_handle_magic_event):
* event-msw.c (emacs_mswindows_select_console):
* event-msw.c (emacs_mswindows_unselect_console):
* event-msw.c (reinit_vars_of_event_mswindows):
* event-msw.c (vars_of_event_mswindows):
* event-stream.c:
* event-stream.c (mark_command_builder):
* event-stream.c (reset_command_builder_event_chain):
* event-stream.c (allocate_command_builder):
* event-stream.c (copy_command_builder):
* event-stream.c (command_builder_append_event):
* event-stream.c (event_stream_event_pending_p):
* event-stream.c (event_stream_force_event_pending):
* event-stream.c (maybe_read_quit_event):
* event-stream.c (event_stream_drain_queue):
* event-stream.c (remove_quit_p_event):
* event-stream.c (event_stream_quit_p):
* event-stream.c (echo_key_event):
* event-stream.c (maybe_kbd_translate):
* event-stream.c (execute_help_form):
* event-stream.c (event_stream_generate_wakeup):
* event-stream.c (enqueue_dispatch_event):
* event-stream.c (enqueue_magic_eval_event):
* event-stream.c (Fenqueue_eval_event):
* event-stream.c (enqueue_misc_user_event):
* event-stream.c (enqueue_misc_user_event_pos):
* event-stream.c (next_event_internal):
* event-stream.c (Fnext_event):
* event-stream.c (Faccept_process_output):
* event-stream.c (execute_internal_event):
* event-stream.c (munge_keymap_translate):
* event-stream.c (command_builder_find_leaf_no_mule_processing):
* event-stream.c (command_builder_find_leaf):
* event-stream.c (lookup_command_event):
* event-stream.c (is_scrollbar_event):
* event-stream.c (execute_command_event):
* event-stream.c (Fdispatch_event):
* event-stream.c (Fread_key_sequence):
* event-stream.c (dribble_out_event):
* event-stream.c (vars_of_event_stream):
* event-tty.c (tty_timeout_to_emacs_event):
* event-tty.c (emacs_tty_next_event):
* event-tty.c (emacs_tty_drain_queue):
* event-tty.c (reinit_vars_of_event_tty):
* event-unixoid.c:
* event-unixoid.c (find_tty_or_stream_console_from_fd):
* event-unixoid.c (read_event_from_tty_or_stream_desc):
* event-unixoid.c (drain_tty_devices):
* event-unixoid.c (poll_fds_for_input):
* events.c:
* events.c (deinitialize_event):
* events.c (zero_event):
* events.c (mark_event):
* events.c (print_event_1):
* events.c (print_event):
* events.c (event_equal):
* events.c (event_hash):
* events.c (Fmake_event):
* events.c (Fdeallocate_event):
* events.c (Fcopy_event):
* events.c (map_event_chain_remove):
* events.c (character_to_event):
* events.c (event_to_character):
* events.c (Fevent_to_character):
* events.c (format_event_object):
* events.c (upshift_event):
* events.c (downshift_event):
* events.c (event_upshifted_p):
* events.c (Fevent_live_p):
* events.c (Fevent_type):
* events.c (Fevent_timestamp):
* events.c (CHECK_EVENT_TYPE):
* events.c (CHECK_EVENT_TYPE2):
* events.c (CHECK_EVENT_TYPE3):
* events.c (Fevent_key):
* events.c (Fevent_button):
* events.c (Fevent_modifier_bits):
* events.c (event_x_y_pixel_internal):
* events.c (event_pixel_translation):
* events.c (Fevent_process):
* events.c (Fevent_function):
* events.c (Fevent_object):
* events.c (Fevent_properties):
* events.c (syms_of_events):
* events.c (vars_of_events):
* events.h:
* events.h (struct event_stream):
* events.h (struct Lisp_Key_Data):
* events.h (KEY_DATA_KEYSYM):
* events.h (EVENT_KEY_KEYSYM):
* events.h (struct Lisp_Button_Data):
* events.h (EVENT_BUTTON_BUTTON):
* events.h (struct Lisp_Motion_Data):
* events.h (EVENT_MOTION_X):
* events.h (struct Lisp_Process_Data):
* events.h (EVENT_PROCESS_PROCESS):
* events.h (struct Lisp_Timeout_Data):
* events.h (EVENT_TIMEOUT_INTERVAL_ID):
* events.h (struct Lisp_Eval_Data):
* events.h (EVENT_EVAL_FUNCTION):
* events.h (struct Lisp_Misc_User_Data):
* events.h (EVENT_MISC_USER_FUNCTION):
* events.h (struct Lisp_Magic_Eval_Data):
* events.h (EVENT_MAGIC_EVAL_INTERNAL_FUNCTION):
* events.h (struct Lisp_Magic_Data):
* events.h (EVENT_MAGIC_UNDERLYING):
* events.h (EVENT_MAGIC_GDK_EVENT):
* events.h (struct Lisp_Event):
* events.h (XEVENT_CHANNEL):
* events.h (SET_EVENT_TIMESTAMP_ZERO):
* events.h (SET_EVENT_CHANNEL):
* events.h (SET_EVENT_NEXT):
* events.h (XSET_EVENT_TYPE):
* events.h (struct command_builder):
* extents.c:
* extents.c (gap_array_adjust_markers):
* extents.c (gap_array_recompute_derived_values):
* extents.c (gap_array_move_gap):
* extents.c (gap_array_make_gap):
* extents.c (gap_array_insert_els):
* extents.c (gap_array_delete_els):
* extents.c (gap_array_make_marker):
* extents.c (gap_array_delete_marker):
* extents.c (gap_array_move_marker):
* extents.c (make_gap_array):
* extents.c (free_gap_array):
* extents.c (extent_list_num_els):
* extents.c (extent_list_insert):
* extents.c (mark_extent_auxiliary):
* extents.c (allocate_extent_auxiliary):
* extents.c (decode_extent_at_flag):
* extents.c (verify_extent_mapper):
* extents.c (symbol_to_glyph_layout):
* extents.c (syms_of_extents):
* faces.c:
* file-coding.c:
* file-coding.c (struct_detector_category_description =):
* file-coding.c (detector_category_dynarr_description_1):
* file-coding.c (struct_detector_description =):
* file-coding.c (detector_dynarr_description_1):
* file-coding.c (MARKED_SLOT):
* file-coding.c (mark_coding_system):
* file-coding.c (coding_system_extra_description_map):
* file-coding.c (coding_system_description):
* file-coding.c (allocate_coding_system):
* file-coding.c (symbol_to_eol_type):
* file-coding.c (Fcoding_system_aliasee):
* file-coding.c (set_coding_stream_coding_system):
* file-coding.c (struct convert_eol_coding_system):
* file-coding.c (struct undecided_coding_system):
* file-coding.c (undecided_mark_coding_stream):
* file-coding.c (coding_category_symbol_to_id):
* file-coding.c (struct gzip_coding_system):
* file-coding.c (coding_system_type_create):
* file-coding.h:
* file-coding.h (struct Lisp_Coding_System):
* file-coding.h (CODING_SYSTEM_SLOT_DECLARATION):
* file-coding.h (coding_system_variant):
* file-coding.h (struct coding_system_methods):
* file-coding.h (DEFINE_CODING_SYSTEM_TYPE_WITH_DATA):
* file-coding.h (INITIALIZE_CODING_SYSTEM_TYPE_WITH_DATA):
* file-coding.h (struct coding_stream):
* fileio.c (Fsubstitute_in_file_name):
* floatfns.c:
* fns.c:
* fns.c (base64_encode_1):
* frame-gtk.c:
* frame-gtk.c (Fgtk_start_drag_internal):
* frame-impl.h (struct frame):
* frame-impl.h (MARKED_SLOT):
* frame-msw.c:
* frame-x.c:
* frame-x.c (Fcde_start_drag_internal):
* frame-x.c (Foffix_start_drag_internal):
* frame.c:
* frame.c (MARKED_SLOT):
* frame.c (allocate_frame_core):
* frame.c (delete_frame_internal):
* frame.c (Fmouse_position_as_motion_event):
* frameslots.h:
* frameslots.h (MARKED_SLOT_ARRAY):
* free-hook.c:
* glyphs-msw.c (mswindows_widget_instantiate):
* glyphs-x.c:
* glyphs-x.c (convert_EImage_to_XImage):
* glyphs.c:
* glyphs.c (process_image_string_instantiator):
* glyphs.c (mark_image_instance):
* glyphs.c (allocate_image_instance):
* glyphs.c (unmap_subwindow):
* glyphs.c (map_subwindow):
* glyphs.c (syms_of_glyphs):
* glyphs.c (specifier_type_create_image):
* glyphs.h:
* glyphs.h (struct text_image_instance):
* glyphs.h (struct Lisp_Image_Instance):
* gmalloc.c:
* gmalloc.c ("C"):
* gpmevent.c (Freceive_gpm_event):
* gpmevent.c (gpm_next_event_cb):
* gpmevent.c (vars_of_gpmevent):
* gtk-glue.c (gdk_event_to_emacs_event):
* gtk-xemacs.c (gtk_xemacs_class_init):
* gui-msw.c:
* gui-msw.c (mswindows_handle_gui_wm_command):
* gui-msw.c (mswindows_translate_menu_or_dialog_item):
* gui-x.c:
* gui-x.c (mark_popup_data):
* gui-x.c (snarf_widget_value_mapper):
* gui-x.c (gcpro_popup_callbacks):
* gui-x.c (ungcpro_popup_callbacks):
* gui-x.c (free_popup_widget_value_tree):
* gui-x.c (popup_selection_callback):
* gui-x.h:
* gui-x.h (struct popup_data):
* gui.c:
* gui.c (allocate_gui_item):
* gutter.c (decode_gutter_position):
* hash.c (NULL_ENTRY):
* indent.c (vmotion_1):
* indent.c (vmotion_pixels):
* input-method-motif.c (res):
* input-method-xlib.c (IMInstantiateCallback):
* input-method-xlib.c (XIM_init_device):
* input-method-xlib.c (res):
* intl-encap-win32.c:
* intl-encap-win32.c (qxeSHGetDataFromIDList):
* intl-win32.c:
* intl-win32.c (mswindows_multibyte_cp_type):
* intl-win32.c (struct mswindows_multibyte_coding_system):
* keymap.c:
* keymap.c (make_key_description):
* keymap.c (keymap_store):
* keymap.c (get_keyelt):
* keymap.c (keymap_lookup_1):
* keymap.c (define_key_parser):
* keymap.c (key_desc_list_to_event):
* keymap.c (event_matches_key_specifier_p):
* keymap.c (meta_prefix_char_p):
* keymap.c (ensure_meta_prefix_char_keymapp):
* keymap.c (Fdefine_key):
* keymap.c (struct raw_lookup_key_mapper_closure):
* keymap.c (raw_lookup_key):
* keymap.c (raw_lookup_key_mapper):
* keymap.c (lookup_keys):
* keymap.c (lookup_events):
* keymap.c (Flookup_key):
* keymap.c (struct map_keymap_unsorted_closure):
* keymap.c (map_keymap_unsorted_mapper):
* keymap.c (map_keymap_sorted):
* keymap.c (map_keymap_mapper):
* keymap.c (map_keymap):
* keymap.c (accessible_keymaps_mapper_1):
* keymap.c (Faccessible_keymaps):
* keymap.c (Fsingle_key_description):
* keymap.c (raw_keys_to_keys):
* keymap.c (format_raw_keys):
* keymap.c (where_is_recursive_mapper):
* keymap.c (where_is_internal):
* keymap.c (describe_map_mapper_shadow_search):
* keymap.c (keymap_lookup_inherited_mapper):
* keymap.c (describe_map_mapper):
* keymap.h (event_matches_key_specifier_p):
* lisp.h:
* lisp.h (this):
* lisp.h (RETURN_NOT_REACHED):
* lisp.h (struct Lisp_Vector):
* lisp.h (struct Lisp_Bit_Vector):
* lisp.h (UNGCPRO_1):
* lisp.h (NUNGCPRO):
* lisp.h (NNUNGCPRO):
* lisp.h (DECLARE_INLINE_HEADER):
* lrecord.h:
* lrecord.h (struct lrecord_header):
* lrecord.h (struct lcrecord_header):
* lrecord.h (lrecord_type):
* lrecord.h (struct lrecord_implementation):
* lrecord.h (RECORD_DUMPABLE):
* lrecord.h (memory_description_type):
* lrecord.h (data_description_entry_flags):
* lrecord.h (struct memory_description):
* lrecord.h (struct sized_memory_description):
* lrecord.h (XD_INDIRECT):
* lrecord.h (XD_IS_INDIRECT):
* lrecord.h (XD_DYNARR_DESC):
* lrecord.h (DEFINE_BASIC_LRECORD_IMPLEMENTATION):
* lrecord.h (MAKE_LRECORD_IMPLEMENTATION):
* lrecord.h (MAKE_EXTERNAL_LRECORD_IMPLEMENTATION):
* lrecord.h (alloc_lcrecord_type):
* lstream.c:
* lstream.c (Lstream_new):
* lstream.c (lisp_buffer_marker):
* lstream.h:
* lstream.h (lstream_implementation):
* lstream.h (DEFINE_LSTREAM_IMPLEMENTATION):
* lstream.h (DEFINE_LSTREAM_IMPLEMENTATION_WITH_DATA):
* marker.c:
* marker.c (copy_marker_1):
* mem-limits.h:
* menubar-gtk.c:
* menubar-gtk.c (gtk_popup_menu):
* menubar-msw.c:
* menubar-msw.c (mswindows_popup_menu):
* menubar-x.c (make_dummy_xbutton_event):
* menubar-x.c (command_builder_operate_menu_accelerator):
* menubar-x.c (menu_accelerator_safe_compare):
* menubar-x.c (menu_accelerator_safe_mod_compare):
* mule-charset.c:
* mule-charset.c (make_charset):
* mule-charset.c (Fcharset_property):
* mule-coding.c:
* mule-coding.c (ccs_description_1):
* mule-coding.c (ccs_description =):
* mule-coding.c (ccsd_description_1):
* mule-coding.c (ccsd_description =):
* nt.c (getpwnam):
* nt.c (init_mswindows_environment):
* nt.c (get_cached_volume_information):
* nt.c (mswindows_is_executable):
* nt.c (read_unc_volume):
* nt.c (mswindows_access):
* nt.c (mswindows_link):
* nt.c (mswindows_fstat):
* nt.c (mswindows_stat):
* nt.c (mswindows_executable_type):
* nt.c (Fmswindows_short_file_name):
* nt.c (Fmswindows_long_file_name):
* objects-impl.h (struct Lisp_Color_Instance):
* objects-impl.h (struct Lisp_Font_Instance):
* objects-tty.c:
* objects-x.c (allocate_nearest_color):
* objects.c:
* objects.c (Fmake_color_instance):
* objects.c (Fmake_font_instance):
* objects.c (font_instantiate):
* opaque.c:
* opaque.c (make_opaque):
* opaque.c (make_opaque_ptr):
* opaque.c (reinit_opaque_early):
* opaque.c (init_opaque_once_early):
* print.c:
* print.c (printing_badness):
* print.c (printing_major_badness):
* print.c (print_internal):
* print.c (debug_p4):
* print.c (dp):
* print.c (debug_backtrace):
* process-nt.c (nt_create_process):
* process-nt.c (get_internet_address):
* process-unix.c:
* process-unix.c (struct unix_process_data):
* process-unix.c (get_internet_address):
* process-unix.c (unix_alloc_process_data):
* process-unix.c (unix_create_process):
* process-unix.c (try_to_initialize_subtty):
* process-unix.c (unix_kill_child_process):
* process-unix.c (process_type_create_unix):
* process.c:
* process.c (mark_process):
* process.c (MARKED_SLOT):
* process.c (make_process_internal):
* process.c (Fprocess_tty_name):
* process.c (decode_signal):
* process.h:
* procimpl.h:
* procimpl.h (struct process_methods):
* procimpl.h (struct Lisp_Process):
* rangetab.c:
* realpath.c (readlink_and_correct_case):
* redisplay-x.c (x_window_output_end):
* redisplay-x.c (x_redraw_exposed_area):
* redisplay-x.c (x_clear_frame):
* redisplay.c:
* redisplay.h:
* redisplay.h (struct rune_dglyph):
* redisplay.h (struct rune):
* scrollbar.c:
* scrollbar.c (create_scrollbar_instance):
* specifier.c:
* specifier.c (specifier_empty_extra_description_1):
* specifier.c (make_specifier_internal):
* specifier.c (decode_locale_type):
* specifier.c (decode_how_to_add_specification):
* specifier.h:
* specifier.h (struct specifier_methods):
* specifier.h (DEFINE_SPECIFIER_TYPE_WITH_DATA):
* specifier.h (INITIALIZE_SPECIFIER_TYPE_WITH_DATA):
* symbols.c:
* symbols.c (Fsetplist):
* symbols.c (default_value):
* symbols.c (decode_magic_handler_type):
* symbols.c (handler_type_from_function_symbol):
* symbols.c (Fdefvaralias):
* symbols.c (init_symbols_once_early):
* symbols.c (reinit_symbols_early):
* symsinit.h:
* sysdep.c (sys_subshell):
* sysdep.c (tty_init_sys_modes_on_device):
* syswindows.h:
* text.c (dfc_convert_to_external_format):
* text.c (dfc_convert_to_internal_format):
* text.c (reinit_eistring_early):
* text.c (init_eistring_once_early):
* text.c (reinit_vars_of_text):
* text.h:
* text.h (INC_IBYTEPTR_FMT):
* text.h (DEC_IBYTEPTR_FMT):
* toolbar.c:
* toolbar.c (decode_toolbar_position):
* tooltalk.c:
* ui-gtk.c:
* unexnt.c:
* unexnt.c (_start):
* unexnt.c (unexec):
* unexnt.c (get_section_info):
* unicode.c:
* unicode.c (vars_of_unicode):
* window.c:
* window.c (allocate_window):
* window.c (new_window_mirror):
* window.c (update_mirror_internal):
* winslots.h:
author | michaels |
---|---|
date | Sun, 12 Jan 2003 11:08:22 +0000 |
parents | abe6d1db359e |
children | 9a1950c1e051 |
rev | line source |
---|---|
428 | 1 ;;; list-mode.el --- Major mode for buffers containing lists of items |
2 | |
3 ;; Copyright (C) 1992-4, 1997 Free Software Foundation, Inc. | |
442 | 4 ;; Copyright (C) 1996, 2000 Ben Wing. |
428 | 5 |
6 ;; Maintainer: XEmacs Development Team | |
7 ;; Keywords: extensions, dumped | |
8 | |
9 ;; This file is part of XEmacs. | |
10 | |
11 ;; XEmacs is free software; you can redistribute it and/or modify it | |
12 ;; under the terms of the GNU General Public License as published by | |
13 ;; the Free Software Foundation; either version 2, or (at your option) | |
14 ;; any later version. | |
15 | |
16 ;; XEmacs is distributed in the hope that it will be useful, but | |
17 ;; WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
19 ;; General Public License for more details. | |
20 | |
21 ;; You should have received a copy of the GNU General Public License | |
22 ;; along with XEmacs; see the file COPYING. If not, write to the | |
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
24 ;; Boston, MA 02111-1307, USA. | |
25 | |
26 ;;; Synched up with: Not synched | |
27 | |
28 ;;; Commentary: | |
29 | |
30 ;; This file is dumped with XEmacs. | |
31 | |
32 ;; Cleanup, merging with FSF by Ben Wing, January 1996 | |
33 | |
34 ;;; Code: | |
35 | |
36 (defvar list-mode-extent nil) | |
37 (make-variable-buffer-local 'list-mode-extent) | |
38 | |
39 (defvar list-mode-map nil | |
40 "Local map for buffers containing lists of items.") | |
41 (or list-mode-map | |
42 (let ((map (setq list-mode-map (make-sparse-keymap 'list-mode-map)))) | |
43 (suppress-keymap map) | |
44 (define-key map 'button2up 'list-mode-item-mouse-selected) | |
45 (define-key map 'button2 'undefined) | |
46 (define-key map "\C-m" 'list-mode-item-keyboard-selected) | |
47 ;; | |
48 ;; The following calls to `substitute-key-definition' losed because | |
49 ;; they were based on an incorrect assumption that `forward-char' and | |
50 ;; `backward-char' are bound to keys in the global map. This might not | |
51 ;; be the case if a user binds motion keys to different functions, | |
52 ;; and was not actually the case since 20.5 beta 28 or around. | |
53 ;; | |
54 ;; (substitute-key-definition 'forward-char 'next-list-mode-item map | |
55 ;; global-map) | |
56 ;; (substitute-key-definition 'backward-char 'previous-list-mode-item map | |
57 ;; global-map) | |
58 ;; | |
59 ;; We bind standard keys to motion commands instead. | |
60 ;; | |
61 (dolist (key '(kp-right right (control ?f))) | |
62 (define-key map key 'next-list-mode-item)) | |
63 (dolist (key '(kp-left left (control ?b))) | |
64 (define-key map key 'previous-list-mode-item)))) | |
65 | |
442 | 66 ;; #### We make list-mode-hook, as well as completion-setup-hook and |
67 ;; minibuffer-setup-hook, permanent-local so that it's possible to create | |
68 ;; buffers in these modes and then set up some buffer-specific | |
69 ;; customizations without resorting to awful kludges. (The problem here | |
70 ;; is that when you switch a buffer into a mode, reset-buffer is usually | |
71 ;; called, which destroys all buffer-local settings that you carefully | |
72 ;; tried to set up when you created the buffer. Therefore, the only way | |
73 ;; to set these variables is to use the setup hooks -- but if they are | |
74 ;; not declared permanent local, then any local hook functions that you | |
75 ;; put on them (which is exactly what you want to do) also get removed, | |
76 ;; so you would have to resort to putting a global hook function on the | |
77 ;; setup hook, and then making sure it gets removed later. I actually | |
78 ;; added some support for doing this with one-shot hooks, but this is | |
79 ;; clearly not the correct way to do things, and it fails in some cases, | |
80 ;; particularly when the buffer gets put into the mode more than once, | |
81 ;; which typically happens with completion buffers, for example.) In | |
82 ;; fact, all setup hooks should be made permanent local, but I didn't | |
83 ;; feel like making a global change like this quite yet. The proper way | |
84 ;; to do it would be to declare new def-style forms, such as defhook and | |
85 ;; define-local-setup-hook, which are used to initialize hooks in place | |
86 ;; of the current generic defvars. --ben | |
87 | |
88 (put 'list-mode-hook 'permanent-local t) | |
89 (defvar list-mode-hook nil | |
90 "Normal hook run when entering List mode.") | |
91 | |
428 | 92 (defun list-mode () |
93 "Major mode for buffer containing lists of items." | |
94 (interactive) | |
95 (kill-all-local-variables) | |
96 (use-local-map list-mode-map) | |
97 (setq mode-name "List") | |
98 (setq major-mode 'list-mode) | |
442 | 99 (add-local-hook 'post-command-hook 'set-list-mode-extent) |
100 (add-local-hook 'pre-command-hook 'list-mode-extent-pre-hook) | |
101 (set (make-local-variable 'next-line-add-newlines) nil) | |
428 | 102 (setq list-mode-extent nil) |
103 ;; It is visually disconcerting to have the text cursor disappear within list | |
104 ;; buffers, especially when moving from window to window, so leave it | |
105 ;; visible. -- Bob Weiner, 06/20/1999 | |
106 ; (set-specifier text-cursor-visible-p nil (current-buffer)) | |
107 (setq buffer-read-only t) | |
108 (goto-char (point-min)) | |
109 (run-hooks 'list-mode-hook)) | |
110 | |
111 ;; List mode is suitable only for specially formatted data. | |
112 (put 'list-mode 'mode-class 'special) | |
113 | |
114 (defvar list-mode-extent-old-point nil | |
115 "The value of point when pre-command-hook is called. | |
116 Used to determine the direction of motion.") | |
117 (make-variable-buffer-local 'list-mode-extent-old-point) | |
118 | |
119 (defun list-mode-extent-pre-hook () | |
120 (setq list-mode-extent-old-point (point)) | |
121 ;(setq atomic-extent-goto-char-p nil) | |
122 ) | |
123 | |
124 (defun set-list-mode-extent () | |
125 "Move to the closest list item and set up the extent for it. | |
126 This is called from `post-command-hook'." | |
127 (cond ((get-char-property (point) 'list-mode-item)) | |
128 ((and (> (point) (point-min)) | |
129 (get-char-property (1- (point)) 'list-mode-item)) | |
130 (goto-char (1- (point)))) | |
131 (t | |
132 (let ((pos (point)) | |
133 dirflag) | |
134 ;this fucks things up more than it helps. | |
135 ;atomic-extent-goto-char-p as currently defined is all broken, | |
136 ;since it will be triggered if the command *ever* runs goto-char! | |
137 ;(if atomic-extent-goto-char-p | |
138 ; (setq dirflag 1) | |
139 (if (and list-mode-extent-old-point | |
140 (> pos list-mode-extent-old-point)) | |
141 (setq dirflag 1) | |
142 (setq dirflag -1)) | |
143 (next-list-mode-item dirflag) | |
144 (or (get-char-property (point) 'list-mode-item) | |
145 (next-list-mode-item (- dirflag)))))) | |
146 (or (and list-mode-extent | |
147 (eq (current-buffer) (extent-object list-mode-extent))) | |
148 (progn | |
149 (setq list-mode-extent (make-extent nil nil (current-buffer))) | |
150 (set-extent-face list-mode-extent 'list-mode-item-selected))) | |
151 (let ((ex (extent-at (point) nil 'list-mode-item nil 'at))) | |
152 (if ex | |
153 (progn | |
154 (set-extent-endpoints list-mode-extent | |
155 (extent-start-position ex) | |
156 (extent-end-position ex)) | |
157 (auto-show-make-region-visible (extent-start-position ex) | |
158 (extent-end-position ex))) | |
159 (detach-extent list-mode-extent)))) | |
160 | |
161 (defun previous-list-mode-item (n) | |
162 "Move to the previous item in list-mode." | |
163 (interactive "p") | |
164 (next-list-mode-item (- n))) | |
165 | |
166 (defun next-list-mode-item (n) | |
167 "Move to the next item in list-mode. | |
168 With prefix argument N, move N items (negative N means move backward)." | |
169 (interactive "p") | |
170 (while (and (> n 0) (not (eobp))) | |
171 (let ((extent (extent-at (point) (current-buffer) 'list-mode-item)) | |
172 (end (point-max))) | |
173 ;; If in a completion, move to the end of it. | |
174 (if extent (goto-char (extent-end-position extent))) | |
175 ;; Move to start of next one. | |
176 (or (extent-at (point) (current-buffer) 'list-mode-item) | |
177 (goto-char (next-single-property-change (point) 'list-mode-item | |
178 nil end)))) | |
179 (setq n (1- n))) | |
180 (while (and (< n 0) (not (bobp))) | |
181 (let ((extent (extent-at (point) (current-buffer) 'list-mode-item)) | |
182 (end (point-min))) | |
183 ;; If in a completion, move to the start of it. | |
184 (if extent (goto-char (extent-start-position extent))) | |
185 ;; Move to the start of that one. | |
186 (if (setq extent (extent-at (point) (current-buffer) 'list-mode-item | |
187 nil 'before)) | |
188 (goto-char (extent-start-position extent)) | |
189 (goto-char (previous-single-property-change | |
190 (point) 'list-mode-item nil end)) | |
191 (if (setq extent (extent-at (point) (current-buffer) 'list-mode-item | |
192 nil 'before)) | |
193 (goto-char (extent-start-position extent))))) | |
194 (setq n (1+ n)))) | |
195 | |
196 (defun list-mode-item-selected-1 (extent event) | |
197 (let ((func (extent-property extent 'list-mode-item-activate-callback)) | |
198 (user-data (extent-property extent 'list-mode-item-user-data))) | |
199 (if func | |
200 (funcall func event extent user-data)))) | |
201 | |
202 ;; we could make these two be just one function, but we want to be | |
203 ;; able to refer to them in DOC strings. | |
204 | |
205 (defun list-mode-item-keyboard-selected () | |
206 (interactive) | |
207 (list-mode-item-selected-1 (extent-at (point) (current-buffer) | |
208 'list-mode-item nil 'at) | |
209 nil)) | |
210 | |
211 (defun list-mode-item-mouse-selected (event) | |
212 (interactive "e") | |
213 ;; Sometimes event-closest-point returns nil. | |
214 ;; So beep instead of bombing. | |
215 (let ((point (event-closest-point event))) | |
216 (if point | |
217 (list-mode-item-selected-1 (extent-at point | |
218 (event-buffer event) | |
219 'list-mode-item nil 'at) | |
220 event) | |
221 (ding)))) | |
222 | |
223 (defun add-list-mode-item (start end &optional buffer activate-callback | |
224 user-data) | |
225 "Add a new list item in list-mode, from START to END in BUFFER. | |
226 BUFFER defaults to the current buffer. | |
227 This works by creating an extent for the span of text in question. | |
228 If ACTIVATE-CALLBACK is non-nil, it should be a function of three | |
229 arguments (EVENT EXTENT USER-DATA) that will be called when button2 | |
230 is pressed on the extent. USER-DATA comes from the optional | |
231 USER-DATA argument." | |
232 (let ((extent (make-extent start end buffer))) | |
233 (set-extent-property extent 'list-mode-item t) | |
234 (set-extent-property extent 'start-open t) | |
235 (if activate-callback | |
236 (progn | |
237 (set-extent-property extent 'mouse-face 'highlight) | |
238 (set-extent-property extent 'list-mode-item-activate-callback | |
239 activate-callback) | |
240 (set-extent-property extent 'list-mode-item-user-data user-data))) | |
241 extent)) | |
242 | |
243 | |
244 ;; Define the major mode for lists of completions. | |
245 | |
246 | |
247 (defvar completion-highlight-first-word-only nil | |
248 "*Completion will only highlight the first blank delimited word if t. | |
249 If the variable in not t or nil, the string is taken as a regexp to match for end | |
250 of highlight") | |
251 | |
442 | 252 ;; see comment at list-mode-hook. |
253 (put 'completion-setup-hook 'permanent-local t) | |
428 | 254 (defvar completion-setup-hook nil |
442 | 255 "Normal hook run at the end of setting up the text of a completion buffer. |
256 When run, the completion buffer is the current buffer.") | |
428 | 257 |
258 ; Unnecessary FSFmacs crock. We frob the extents directly in | |
259 ; display-completion-list, so no "heuristics" like this are necessary. | |
260 ;(defvar completion-fixup-function nil | |
261 ; "A function to customize how completions are identified in completion lists. | |
262 ;`completion-setup-function' calls this function with no arguments | |
263 ;each time it has found what it thinks is one completion. | |
264 ;Point is at the end of the completion in the completion list buffer. | |
265 ;If this function moves point, it can alter the end of that completion.") | |
266 | |
267 (defvar completion-default-help-string | |
268 '(concat | |
269 (if (device-on-window-system-p) | |
270 (substitute-command-keys | |
271 "Click \\<list-mode-map>\\[list-mode-item-mouse-selected] on a completion to select it.\n") "") | |
272 (substitute-command-keys | |
273 "Type \\<minibuffer-local-completion-map>\\[advertised-switch-to-completions] or \\[switch-to-completions] to move to this buffer, for keyboard selection.\n\n")) | |
274 "Form the evaluate to get a help string for completion lists. | |
275 This string is inserted at the beginning of the buffer. | |
276 See `display-completion-list'.") | |
277 | |
278 (defun display-completion-list (completions &rest cl-keys) | |
279 "Display the list of completions, COMPLETIONS, using `standard-output'. | |
280 Each element may be just a symbol or string or may be a list of two | |
281 strings to be printed as if concatenated. | |
282 Frob a mousable extent onto each completion. This extent has properties | |
283 'mouse-face (so it highlights when the mouse passes over it) and | |
284 'list-mode-item (so it can be located). | |
285 | |
286 Keywords: | |
287 :activate-callback (default is `default-choose-completion') | |
288 See `add-list-mode-item'. | |
289 :user-data | |
290 Value passed to activation callback. | |
291 :window-width | |
292 If non-nil, width to use in displaying the list, instead of the | |
293 actual window's width. | |
442 | 294 :window-height |
295 If non-nil, use no more than this many lines, and extend line width as | |
296 necessary. | |
428 | 297 :help-string (default is the value of `completion-default-help-string') |
298 Form to evaluate to get a string to insert at the beginning of | |
299 the completion list buffer. This is evaluated when that buffer | |
300 is the current buffer and after it has been put into | |
301 completion-list-mode. | |
302 :reference-buffer (default is the current buffer) | |
303 This specifies the value of `completion-reference-buffer' in | |
304 the completion buffer. This specifies the buffer (normally a | |
305 minibuffer) that `default-choose-completion' will insert the | |
306 completion into. | |
307 | |
308 At the end, run the normal hook `completion-setup-hook'. | |
309 It can find the completion buffer in `standard-output'. | |
310 If `completion-highlight-first-word-only' is non-nil, then only the start | |
311 of the string is highlighted." | |
312 ;; #### I18N3 should set standard-output to be (temporarily) | |
313 ;; output-translating. | |
314 (cl-parsing-keywords | |
315 ((:activate-callback 'default-choose-completion) | |
316 :user-data | |
317 :reference-buffer | |
318 (:help-string completion-default-help-string) | |
319 (:completion-string "Possible completions are:") | |
442 | 320 :window-width |
321 :window-height) | |
428 | 322 () |
323 (let ((old-buffer (current-buffer)) | |
324 (bufferp (bufferp standard-output))) | |
325 (if bufferp | |
326 (set-buffer standard-output)) | |
327 (if (null completions) | |
328 (princ (gettext | |
329 "There are no possible completions of what you have typed.")) | |
330 (let ((win-width | |
331 (or cl-window-width | |
332 (if bufferp | |
333 ;; This needs fixing for the case of windows | |
334 ;; that aren't the same width's the frame. | |
335 ;; Sadly, the window it will appear in is not known | |
336 ;; until after the text has been made. | |
337 | |
338 ;; We have to use last-nonminibuf-frame here | |
339 ;; and not selected-frame because if a | |
340 ;; minibuffer-only frame is being used it will | |
341 ;; be the selected-frame at the point this is | |
342 ;; run. We keep the selected-frame call around | |
343 ;; just in case. | |
344 (frame-width (or (last-nonminibuf-frame) | |
345 (selected-frame))) | |
346 80)))) | |
347 (let ((count 0) | |
442 | 348 (max-width 0) |
349 old-max-width) | |
428 | 350 ;; Find longest completion |
351 (let ((tail completions)) | |
352 (while tail | |
353 (let* ((elt (car tail)) | |
354 (len (cond ((stringp elt) | |
355 (length elt)) | |
356 ((and (consp elt) | |
357 (stringp (car elt)) | |
358 (stringp (car (cdr elt)))) | |
359 (+ (length (car elt)) | |
360 (length (car (cdr elt))))) | |
361 (t | |
362 (signal 'wrong-type-argument | |
363 (list 'stringp elt)))))) | |
364 (if (> len max-width) | |
365 (setq max-width len)) | |
366 (setq count (1+ count) | |
367 tail (cdr tail))))) | |
368 | |
369 (setq max-width (+ 2 max-width)) ; at least two chars between cols | |
442 | 370 (setq old-max-width max-width) |
428 | 371 (let ((rows (let ((cols (min (/ win-width max-width) count))) |
372 (if (<= cols 1) | |
373 count | |
374 (progn | |
375 ;; re-space the columns | |
376 (setq max-width (/ win-width cols)) | |
377 (if (/= (% count cols) 0) ; want ceiling... | |
378 (1+ (/ count cols)) | |
379 (/ count cols))))))) | |
442 | 380 (when |
381 (and cl-window-height | |
382 (> rows cl-window-height)) | |
383 (setq max-width old-max-width) | |
384 (setq rows cl-window-height)) | |
385 (when (and (stringp cl-completion-string) | |
386 (> (length cl-completion-string) 0)) | |
387 (princ (gettext cl-completion-string)) | |
388 (terpri)) | |
428 | 389 (let ((tail completions) |
390 (r 0) | |
391 (regexp-string | |
392 (if (eq t | |
393 completion-highlight-first-word-only) | |
394 "[ \t]" | |
395 completion-highlight-first-word-only))) | |
396 (while (< r rows) | |
442 | 397 (and (> r 0) (terpri)) |
428 | 398 (let ((indent 0) |
399 (column 0) | |
400 (tail2 tail)) | |
401 (while tail2 | |
402 (let ((elt (car tail2))) | |
403 (if (/= indent 0) | |
404 (if bufferp | |
405 (indent-to indent 2) | |
406 (while (progn (write-char ?\ ) | |
407 (setq column (1+ column)) | |
408 (< column indent))))) | |
409 (setq indent (+ indent max-width)) | |
410 (let ((start (point)) | |
411 end) | |
412 ;; Frob some mousable extents in there too! | |
413 (if (consp elt) | |
414 (progn | |
415 (princ (car elt)) | |
416 (princ (car (cdr elt))) | |
417 (or bufferp | |
418 (setq column | |
419 (+ column | |
420 (length (car elt)) | |
421 (length (car (cdr elt))))))) | |
422 (progn | |
423 (princ elt) | |
424 (or bufferp | |
425 (setq column (+ column (length | |
426 elt)))))) | |
427 (add-list-mode-item | |
428 start | |
429 (progn | |
430 (setq end (point)) | |
431 (or | |
432 (and completion-highlight-first-word-only | |
433 (goto-char start) | |
434 (re-search-forward regexp-string end t) | |
435 (match-beginning 0)) | |
436 end)) | |
437 nil cl-activate-callback cl-user-data) | |
438 (goto-char end))) | |
439 (setq tail2 (nthcdr rows tail2))) | |
440 (setq tail (cdr tail) | |
441 r (1+ r))))))))) | |
442 (if bufferp | |
443 (set-buffer old-buffer))) | |
444 (save-excursion | |
445 (let ((mainbuf (or cl-reference-buffer (current-buffer)))) | |
446 (set-buffer standard-output) | |
447 (completion-list-mode) | |
448 (make-local-variable 'completion-reference-buffer) | |
449 (setq completion-reference-buffer mainbuf) | |
450 ;;; The value 0 is right in most cases, but not for file name completion. | |
451 ;;; so this has to be turned off. | |
452 ;;; (setq completion-base-size 0) | |
453 (goto-char (point-min)) | |
454 (let ((buffer-read-only nil)) | |
455 (insert (eval cl-help-string))) | |
456 ;; unnecessary FSFmacs crock | |
457 ;;(forward-line 1) | |
458 ;;(while (re-search-forward "[^ \t\n]+\\( [^ \t\n]+\\)*" nil t) | |
459 ;; (let ((beg (match-beginning 0)) | |
460 ;; (end (point))) | |
461 ;; (if completion-fixup-function | |
462 ;; (funcall completion-fixup-function)) | |
463 ;; (put-text-property beg (point) 'mouse-face 'highlight) | |
464 ;; (put-text-property beg (point) 'list-mode-item t) | |
465 ;; (goto-char end))))) | |
466 )) | |
442 | 467 (save-excursion |
468 (set-buffer standard-output) | |
469 (run-hooks 'completion-setup-hook)))) | |
428 | 470 |
471 (defvar completion-display-completion-list-function 'display-completion-list | |
472 "Function to set up the list of completions in the completion buffer. | |
473 The function is called with one argument, the sorted list of completions. | |
474 Particular minibuffer interface functions (e.g. `read-file-name') may | |
475 want to change this. To do that, set a local value for this variable | |
476 in the minibuffer; that ensures that other minibuffer invocations will | |
477 not be affected.") | |
478 | |
479 (defun minibuffer-completion-help () | |
480 "Display a list of possible completions of the current minibuffer contents. | |
481 The list of completions is determined by calling `all-completions', | |
482 passing it the current minibuffer contents, the value of | |
483 `minibuffer-completion-table', and the value of | |
484 `minibuffer-completion-predicate'. The list is displayed by calling | |
485 the value of `completion-display-completion-list-function' on the sorted | |
486 list of completions, with the standard output set to the completion | |
487 buffer." | |
488 (interactive) | |
489 (message "Making completion list...") | |
490 (let ((completions (all-completions (buffer-string) | |
491 minibuffer-completion-table | |
492 minibuffer-completion-predicate))) | |
493 (message nil) | |
494 (if (null completions) | |
495 (progn | |
496 (ding nil 'no-completion) | |
497 (temp-minibuffer-message " [No completions]")) | |
498 (with-output-to-temp-buffer "*Completions*" | |
499 (funcall completion-display-completion-list-function | |
500 (sort completions #'string-lessp)))))) | |
501 | |
502 (define-derived-mode completion-list-mode list-mode | |
503 "Completion List" | |
504 "Major mode for buffers showing lists of possible completions. | |
505 \\{completion-list-mode-map}" | |
506 (make-local-variable 'completion-base-size) | |
507 (setq completion-base-size nil)) | |
508 | |
509 (let ((map completion-list-mode-map)) | |
510 (define-key map 'button2up 'mouse-choose-completion) | |
511 (define-key map 'button2 'undefined) | |
512 (define-key map "\C-m" 'choose-completion) | |
513 (define-key map "\e\e\e" 'delete-completion-window) | |
514 (define-key map "\C-g" 'minibuffer-keyboard-quit) | |
515 (define-key map "q" 'completion-list-mode-quit) | |
516 (define-key map " " 'completion-switch-to-minibuffer) | |
517 ;; [Tab] used to switch to the minibuffer but since [space] does that and | |
518 ;; since most applications in the world use [Tab] to select the next item | |
519 ;; in a list, do that in the *Completions* buffer too. -- Bob Weiner, | |
520 ;; BeOpen.com, 06/23/1999. | |
521 (define-key map "\t" 'next-list-mode-item)) | |
522 | |
523 (defvar completion-reference-buffer nil | |
524 "Record the buffer that was current when the completion list was requested. | |
525 This is a local variable in the completion list buffer. | |
526 Initial value is nil to avoid some compiler warnings.") | |
527 | |
528 (defvar completion-base-size nil | |
529 "Number of chars at beginning of minibuffer not involved in completion. | |
530 This is a local variable in the completion list buffer | |
531 but it talks about the buffer in `completion-reference-buffer'. | |
532 If this is nil, it means to compare text to determine which part | |
533 of the tail end of the buffer's text is involved in completion.") | |
534 | |
535 ;; These names are referenced in the doc string for `completion-list-mode'. | |
536 (defalias 'choose-completion 'list-mode-item-keyboard-selected) | |
537 (defalias 'mouse-choose-completion 'list-mode-item-mouse-selected) | |
538 | |
539 (defun delete-completion-window () | |
540 "Delete the completion list window. | |
541 Go to the window from which completion was requested." | |
542 (interactive) | |
543 (let ((buf completion-reference-buffer)) | |
544 (delete-window (selected-window)) | |
545 (if (get-buffer-window buf) | |
546 (select-window (get-buffer-window buf))))) | |
547 | |
548 (defun completion-switch-to-minibuffer () | |
549 "Move from a completions buffer to the active minibuffer window." | |
550 (interactive) | |
551 (select-window (minibuffer-window))) | |
552 | |
553 (defun completion-list-mode-quit () | |
554 "Abort any recursive edit and bury the completions buffer." | |
555 (interactive) | |
556 (condition-case () | |
557 (abort-recursive-edit) | |
558 (error nil)) | |
559 ;; If there was no recursive edit to abort, simply bury the completions | |
560 ;; list buffer. | |
561 (if (eq major-mode 'completion-list-mode) (bury-buffer))) | |
562 | |
563 (defun completion-do-in-minibuffer () | |
564 (interactive "_") | |
565 (save-excursion | |
566 (set-buffer (window-buffer (minibuffer-window))) | |
567 (call-interactively (key-binding (this-command-keys))))) | |
568 | |
569 (defun default-choose-completion (event extent buffer) | |
570 "Click on an alternative in the `*Completions*' buffer to choose it." | |
571 (and (button-event-p event) | |
572 ;; Give temporary modes such as isearch a chance to turn off. | |
573 (run-hooks 'mouse-leave-buffer-hook)) | |
574 (or buffer (setq buffer (symbol-value-in-buffer | |
575 'completion-reference-buffer | |
576 (or (and (button-event-p event) | |
577 (event-buffer event)) | |
578 (current-buffer))))) | |
579 (save-selected-window | |
580 (and (button-event-p event) | |
581 (select-window (event-window event))) | |
582 (if (and (one-window-p t 'selected-frame) | |
583 (window-dedicated-p (selected-window))) | |
584 ;; This is a special buffer's frame | |
585 (iconify-frame (selected-frame)) | |
586 (or (window-dedicated-p (selected-window)) | |
587 (bury-buffer)))) | |
588 (choose-completion-string (extent-string extent) | |
589 buffer | |
590 completion-base-size)) | |
591 | |
592 ;; Delete the longest partial match for STRING | |
593 ;; that can be found before POINT. | |
594 (defun choose-completion-delete-max-match (string) | |
595 (let ((len (min (length string) | |
596 (- (point) (point-min))))) | |
597 (goto-char (- (point) (length string))) | |
598 (if completion-ignore-case | |
599 (setq string (downcase string))) | |
600 (while (and (> len 0) | |
601 (let ((tail (buffer-substring (point) | |
602 (+ (point) len)))) | |
603 (if completion-ignore-case | |
604 (setq tail (downcase tail))) | |
605 (not (string= tail (substring string 0 len))))) | |
606 (setq len (1- len)) | |
607 (forward-char 1)) | |
608 (delete-char len))) | |
609 | |
610 ;; Switch to BUFFER and insert the completion choice CHOICE. | |
611 ;; BASE-SIZE, if non-nil, says how many characters of BUFFER's text | |
612 ;; to keep. If it is nil, use choose-completion-delete-max-match instead. | |
613 (defun choose-completion-string (choice &optional buffer base-size) | |
614 (let ((buffer (or buffer completion-reference-buffer))) | |
615 ;; If BUFFER is a minibuffer, barf unless it's the currently | |
616 ;; active minibuffer. | |
617 (if (and (string-match "\\` \\*Minibuf-[0-9]+\\*\\'" (buffer-name buffer)) | |
618 (or (not (active-minibuffer-window)) | |
619 (not (equal buffer | |
620 (window-buffer (active-minibuffer-window)))))) | |
621 (error "Minibuffer is not active for completion") | |
622 ;; Insert the completion into the buffer where completion was requested. | |
623 (set-buffer buffer) | |
624 (if base-size | |
625 (delete-region (+ base-size (point-min)) (point)) | |
626 (choose-completion-delete-max-match choice)) | |
627 (insert choice) | |
628 (remove-text-properties (- (point) (length choice)) (point) | |
629 '(highlight nil)) | |
630 ;; Update point in the window that BUFFER is showing in. | |
631 (let ((window (get-buffer-window buffer t))) | |
632 (set-window-point window (point))) | |
633 ;; If completing for the minibuffer, exit it with this choice. | |
634 (and (equal buffer (window-buffer (minibuffer-window))) | |
635 minibuffer-completion-table | |
636 (exit-minibuffer))))) | |
637 | |
638 (define-key minibuffer-local-completion-map [prior] | |
639 'switch-to-completions) | |
640 (define-key minibuffer-local-must-match-map [prior] | |
641 'switch-to-completions) | |
642 (define-key minibuffer-local-completion-map "\M-v" | |
643 'advertised-switch-to-completions) | |
644 (define-key minibuffer-local-must-match-map "\M-v" | |
645 'advertised-switch-to-completions) | |
646 | |
647 (defalias 'advertised-switch-to-completions 'switch-to-completions) | |
648 (defun switch-to-completions () | |
649 "Select the completion list window." | |
650 (interactive) | |
651 ;; Make sure we have a completions window. | |
652 (or (get-buffer-window "*Completions*") | |
653 (minibuffer-completion-help)) | |
654 (if (not (get-buffer-window "*Completions*")) | |
655 nil | |
656 (select-window (get-buffer-window "*Completions*")) | |
657 (goto-char (next-single-property-change (point-min) 'list-mode-item nil | |
658 (point-max))))) | |
659 | |
660 ;;; list-mode.el ends here |