⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kill.c

📁 在非GUI环境下
💻 C
📖 第 1 页 / 共 2 页
字号:
/* kill.c -- kill ring management. *//* Copyright (C) 1994 Free Software Foundation, Inc.   This file is part of the GNU Readline Library, a library for   reading lines of text with interactive input and history editing.   The GNU Readline Library is free software; you can redistribute it   and/or modify it under the terms of the GNU General Public License   as published by the Free Software Foundation; either version 2, or   (at your option) any later version.   The GNU Readline Library is distributed in the hope that it will be   useful, but WITHOUT ANY WARRANTY; without even the implied warranty   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   The GNU General Public License is often shipped with GNU software, and   is generally kept in a file called COPYING or LICENSE.  If you do not   have a copy of the license, write to the Free Software Foundation,   59 Temple Place, Suite 330, Boston, MA 02111 USA. */#define READLINE_LIBRARY#if defined (HAVE_CONFIG_H)#  include <config.h>#endif#include <sys/types.h>#if defined (HAVE_UNISTD_H)#  include <unistd.h>           /* for _POSIX_VERSION */#endif /* HAVE_UNISTD_H */#if defined (HAVE_STDLIB_H)#  include <stdlib.h>#else#  include "ansi_stdlib.h"#endif /* HAVE_STDLIB_H */#include <stdio.h>/* System-specific feature definitions and include files. */#include "rldefs.h"/* Some standard library routines. */#include "readline.h"#include "history.h"#include "rlprivate.h"#include "xmalloc.h"/* **************************************************************** *//*								    *//*			Killing Mechanism			    *//*								    *//* **************************************************************** *//* What we assume for a max number of kills. */#define DEFAULT_MAX_KILLS 10/* The real variable to look at to find out when to flush kills. */static int rl_max_kills =  DEFAULT_MAX_KILLS;/* Where to store killed text. */static char **rl_kill_ring = (char **)NULL;/* Where we are in the kill ring. */static int rl_kill_index;/* How many slots we have in the kill ring. */static int rl_kill_ring_length;static int _rl_copy_to_kill_ring PARAMS((char *, int));static int region_kill_internal PARAMS((int));static int _rl_copy_word_as_kill PARAMS((int, int));static int rl_yank_nth_arg_internal PARAMS((int, int, int));/* How to say that you only want to save a certain amount   of kill material. */intrl_set_retained_kills (num)     int num;{  return 0;}/* Add TEXT to the kill ring, allocating a new kill ring slot as necessary.   This uses TEXT directly, so the caller must not free it.  If APPEND is   non-zero, and the last command was a kill, the text is appended to the   current kill ring slot, otherwise prepended. */static int_rl_copy_to_kill_ring (text, append)     char *text;     int append;{  char *old, *new;  int slot;  /* First, find the slot to work with. */  if (_rl_last_command_was_kill == 0)    {      /* Get a new slot.  */      if (rl_kill_ring == 0)	{	  /* If we don't have any defined, then make one. */	  rl_kill_ring = (char **)	    xmalloc (((rl_kill_ring_length = 1) + 1) * sizeof (char *));	  rl_kill_ring[slot = 0] = (char *)NULL;	}      else	{	  /* We have to add a new slot on the end, unless we have	     exceeded the max limit for remembering kills. */	  slot = rl_kill_ring_length;	  if (slot == rl_max_kills)	    {	      register int i;	      free (rl_kill_ring[0]);	      for (i = 0; i < slot; i++)		rl_kill_ring[i] = rl_kill_ring[i + 1];	    }	  else	    {	      slot = rl_kill_ring_length += 1;	      rl_kill_ring = (char **)xrealloc (rl_kill_ring, slot * sizeof (char *));	    }	  rl_kill_ring[--slot] = (char *)NULL;	}    }  else    slot = rl_kill_ring_length - 1;  /* If the last command was a kill, prepend or append. */  if (_rl_last_command_was_kill && rl_editing_mode != vi_mode)    {      old = rl_kill_ring[slot];      new = (char *)xmalloc (1 + strlen (old) + strlen (text));      if (append)	{	  strcpy (new, old);	  strcat (new, text);	}      else	{	  strcpy (new, text);	  strcat (new, old);	}      free (old);      free (text);      rl_kill_ring[slot] = new;    }  else    rl_kill_ring[slot] = text;  rl_kill_index = slot;  return 0;}/* The way to kill something.  This appends or prepends to the last   kill, if the last command was a kill command.  if FROM is less   than TO, then the text is appended, otherwise prepended.  If the   last command was not a kill command, then a new slot is made for   this kill. */intrl_kill_text (from, to)     int from, to;{  char *text;  /* Is there anything to kill? */  if (from == to)    {      _rl_last_command_was_kill++;      return 0;    }  text = rl_copy_text (from, to);  /* Delete the copied text from the line. */  rl_delete_text (from, to);  _rl_copy_to_kill_ring (text, from < to);  _rl_last_command_was_kill++;  return 0;}/* Now REMEMBER!  In order to do prepending or appending correctly, kill   commands always make rl_point's original position be the FROM argument,   and rl_point's extent be the TO argument. *//* **************************************************************** *//*								    *//*			Killing Commands			    *//*								    *//* **************************************************************** *//* Delete the word at point, saving the text in the kill ring. */intrl_kill_word (count, key)     int count, key;{  int orig_point;  if (count < 0)    return (rl_backward_kill_word (-count, key));  else    {      orig_point = rl_point;      rl_forward_word (count, key);      if (rl_point != orig_point)	rl_kill_text (orig_point, rl_point);      rl_point = orig_point;      if (rl_editing_mode == emacs_mode)	rl_mark = rl_point;    }  return 0;}/* Rubout the word before point, placing it on the kill ring. */intrl_backward_kill_word (count, ignore)     int count, ignore;{  int orig_point;  if (count < 0)    return (rl_kill_word (-count, ignore));  else    {      orig_point = rl_point;      rl_backward_word (count, ignore);      if (rl_point != orig_point)	rl_kill_text (orig_point, rl_point);      if (rl_editing_mode == emacs_mode)	rl_mark = rl_point;    }  return 0;}/* Kill from here to the end of the line.  If DIRECTION is negative, kill   back to the line start instead. */intrl_kill_line (direction, ignore)     int direction, ignore;{  int orig_point;  if (direction < 0)    return (rl_backward_kill_line (1, ignore));  else    {      orig_point = rl_point;      rl_end_of_line (1, ignore);      if (orig_point != rl_point)	rl_kill_text (orig_point, rl_point);      rl_point = orig_point;      if (rl_editing_mode == emacs_mode)	rl_mark = rl_point;    }  return 0;}/* Kill backwards to the start of the line.  If DIRECTION is negative, kill   forwards to the line end instead. */intrl_backward_kill_line (direction, ignore)     int direction, ignore;{  int orig_point;  if (direction < 0)    return (rl_kill_line (1, ignore));  else    {      if (!rl_point)	rl_ding ();      else	{	  orig_point = rl_point;	  rl_beg_of_line (1, ignore);	  if (rl_point != orig_point)	    rl_kill_text (orig_point, rl_point);	  if (rl_editing_mode == emacs_mode)	    rl_mark = rl_point;	}    }  return 0;}/* Kill the whole line, no matter where point is. */intrl_kill_full_line (count, ignore)     int count, ignore;{  rl_begin_undo_group ();  rl_point = 0;  rl_kill_text (rl_point, rl_end);  rl_mark = 0;  rl_end_undo_group ();  return 0;}/* The next two functions mimic unix line editing behaviour, except they   save the deleted text on the kill ring.  This is safer than not saving   it, and since we have a ring, nobody should get screwed. *//* This does what C-w does in Unix.  We can't prevent people from   using behaviour that they expect. */intrl_unix_word_rubout (count, key)     int count, key;{  int orig_point;  if (rl_point == 0)    rl_ding ();  else    {      orig_point = rl_point;      if (count <= 0)	count = 1;      while (count--)	{	  while (rl_point && whitespace (rl_line_buffer[rl_point - 1]))	    rl_point--;	  while (rl_point && (whitespace (rl_line_buffer[rl_point - 1]) == 0))	    rl_point--;	}      rl_kill_text (orig_point, rl_point);      if (rl_editing_mode == emacs_mode)	rl_mark = rl_point;    }  return 0;}/* This deletes one filename component in a Unix pathname.  That is, it   deletes backward to directory separator (`/') or whitespace.  */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -