ratpoison-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RP] [PATCH v2] Introduce multiple completion styles.


From: Jérémie Courrèges-Anglas
Subject: Re: [RP] [PATCH v2] Introduce multiple completion styles.
Date: Tue, 16 Aug 2016 19:39:15 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (berkeley-unix)

Mathieu OTHACEHE <address@hidden> writes:

> The default, legacy style is named BASIC. A new completion style named
> SUBSTRING is added.
>
> Use SUBSTRING for window name completion in select command. Use BASIC
> everywhere else.
> ---
>
> Hi,

Hi,

> Here is the v2 of the patch, I removed a debug
> message I forget.

Your patch hasn't been forgotten, I just need to schedule some time.

Cheers,

> Mathieu
>
> Changelog:
>
> v2: Remove a forgotten debug message.
>
>  TODO              |  3 ---
>  src/actions.c     |  8 ++++----
>  src/completions.c | 31 +++++++++++++++++++++++++++----
>  src/completions.h |  2 +-
>  src/data.h        | 16 ++++++++++++++++
>  src/editor.c      |  5 +++--
>  src/editor.h      |  2 +-
>  src/input.c       |  6 +++---
>  src/input.h       |  2 +-
>  9 files changed, 56 insertions(+), 19 deletions(-)
>
> diff --git a/TODO b/TODO
> index 36c33a3..a84ba56 100644
> --- a/TODO
> +++ b/TODO
> @@ -25,9 +25,6 @@ stuff ???
>  * Pasting into input buffer
>  Fix it.
>  
> -* window name substring matching.
> -Do it.
> -
>  * allow letters and numbers to be used for frames (in fselect)
>  
>  * dump all all def* settings
> diff --git a/src/actions.c b/src/actions.c
> index c0fc569..c53acc0 100644
> --- a/src/actions.c
> +++ b/src/actions.c
> @@ -1378,8 +1378,8 @@ cmd_select (int interactive, struct cmdarg **args)
>    /* FIXME: This is manually done because of the kinds of things
>       select accepts. */
>    if (args[0] == NULL)
> -    str = get_input (MESSAGE_PROMPT_SWITCH_TO_WINDOW, hist_SELECT,
> -                  window_completions);
> +    str = get_more_input (MESSAGE_PROMPT_SWITCH_TO_WINDOW, "", hist_SELECT,
> +                          SUBSTRING, window_completions);
>    else
>      str = xstrdup (ARG_STRING(0));
>  
> @@ -2641,7 +2641,7 @@ cmd_colon (int interactive UNUSED, struct cmdarg **args)
>      input = get_input (MESSAGE_PROMPT_COMMAND, hist_COMMAND, 
> colon_completions);
>    else
>      input = get_more_input (MESSAGE_PROMPT_COMMAND, ARG_STRING(0), 
> hist_COMMAND,
> -                         colon_completions);
> +                         BASIC, colon_completions);
>  
>    /* User aborted. */
>    if (input == NULL)
> @@ -5930,7 +5930,7 @@ cmd_prompt (int interactive UNUSED, struct cmdarg 
> **args)
>            query = sbuf_new (prefix - arg_str);
>            sbuf_nconcat (query, arg_str, prefix - arg_str);
>            output = get_more_input (sbuf_get (query), prefix, hist_PROMPT,
> -                                   trivial_completions);
> +                                   BASIC, trivial_completions);
>            sbuf_free (query);
>          }
>        else
> diff --git a/src/completions.c b/src/completions.c
> index 483a4d3..7320ae5 100644
> --- a/src/completions.c
> +++ b/src/completions.c
> @@ -18,13 +18,14 @@
>   * Boston, MA 02111-1307 USA
>   */
>  
> +#define _GNU_SOURCE
>  #include <string.h>
>  
>  #include "ratpoison.h"
>  #include "completions.h"
>  
>  rp_completions *
> -completions_new (completion_fn list_fn)
> +completions_new (completion_fn list_fn, enum completion_styles style)
>  {
>    rp_completions *c;
>  
> @@ -35,6 +36,7 @@ completions_new (completion_fn list_fn)
>    c->last_match = NULL;
>    c->partial = NULL;
>    c->virgin = 1;
> +  c->style = style;
>  
>    return c;
>  }
> @@ -96,6 +98,27 @@ completions_update (rp_completions *c, char *partial)
>    free (new_list);
>  }
>  
> +
> +/* Return true if completion is an alternative for partial string,
> +   given the style used. */
> +static int
> +completions_match(rp_completions *c, char *completion, char *partial)
> +{
> +  int match = 0;
> +
> +  switch (c->style)
> +    {
> +    case BASIC:
> +      match = str_comp (completion, partial, strlen(partial));
> +      break;
> +    case SUBSTRING:
> +      match = (strcasestr (completion, partial) != NULL);
> +      break;
> +    }
> +
> +  return match;
> +}
> +
>  static char *
>  completions_prev_match (rp_completions *c)
>  {
> @@ -107,7 +130,7 @@ completions_prev_match (rp_completions *c)
>         cur != c->last_match;
>         cur = list_prev_entry (cur, &c->completion_list, node))
>      {
> -      if (str_comp (sbuf_get (cur), c->partial, strlen (c->partial)))
> +      if (completions_match (c, sbuf_get (cur), c->partial))
>          {
>            /* We found a match so update our last_match pointer and
>               return the string. */
> @@ -130,7 +153,7 @@ completions_next_match (rp_completions *c)
>         cur != c->last_match;
>         cur = list_next_entry (cur, &c->completion_list, node))
>      {
> -      if (str_comp (sbuf_get (cur), c->partial, strlen (c->partial)))
> +      if (completions_match (c, sbuf_get (cur), c->partial))
>          {
>            /* We found a match so update our last_match pointer and
>               return the string. */
> @@ -163,7 +186,7 @@ completions_complete (rp_completions *c, char *partial, 
> int direction)
>          c->last_match = list_prev_entry (c->last_match, &c->completion_list, 
> node);
>  
>        /* Now check if last_match is a match for partial. */
> -      if (str_comp (sbuf_get (c->last_match), c->partial, strlen 
> (c->partial)))
> +      if (completions_match (c, sbuf_get (c->last_match), c->partial))
>          return sbuf_get (c->last_match);
>      }
>  
> diff --git a/src/completions.h b/src/completions.h
> index d3c44af..01586ee 100644
> --- a/src/completions.h
> +++ b/src/completions.h
> @@ -22,7 +22,7 @@
>  #define _RATPOISON_COMPLETIONS_H 1
>  
>  char *completions_complete (rp_completions *c, char *partial, int direction);
> -rp_completions *completions_new (completion_fn list_fn);
> +rp_completions *completions_new (completion_fn list_fn, enum 
> completion_styles style);
>  void completions_free (rp_completions *c);
>  
>  #endif /* ! _RATPOISON_COMPLETIONS_H */
> diff --git a/src/data.h b/src/data.h
> index f4bd185..85a0324 100644
> --- a/src/data.h
> +++ b/src/data.h
> @@ -332,6 +332,19 @@ struct modifier_info
>  
>  typedef struct list_head *(*completion_fn)(char *string);
>  
> +/*
> +  BASIC: The completion shall begin with the same characters as the partial
> +  string. Case is ignored.
> +
> +  SUBSTRING: The partial string shall be a subpart of the completion. Case
> +  is ignored.
> +*/
> +enum completion_styles
> +{
> +  BASIC,
> +  SUBSTRING
> +};
> +
>  struct rp_completions
>  {
>    /* A pointer to the partial string that is being completed. We need
> @@ -352,6 +365,9 @@ struct rp_completions
>    /* virgin = 1 means no completions have been attempted on the input
>       string. */
>    unsigned short int virgin;
> +
> +  /* The completion style used to perform string comparisons */
> +  enum completion_styles style;
>  };
>  
>  struct rp_input_line
> diff --git a/src/editor.c b/src/editor.c
> index 1360241..96cdc6e 100644
> --- a/src/editor.c
> +++ b/src/editor.c
> @@ -100,14 +100,15 @@ static edit_binding edit_bindings[] =
>       { {0,              0},     0} };
>  
>  rp_input_line *
> -input_line_new (char *prompt, char *preinput, int history_id, completion_fn 
> fn)
> +input_line_new (char *prompt, char *preinput, int history_id,
> +                enum completion_styles style, completion_fn fn)
>  {
>    rp_input_line *line;
>    size_t length;
>  
>    line = xmalloc (sizeof (rp_input_line));
>    line->prompt = prompt;
> -  line->compl = completions_new (fn);
> +  line->compl = completions_new (fn, style);
>    line->history_id = history_id;
>  
>    /* Allocate some memory to start with (100 extra bytes) */
> diff --git a/src/editor.h b/src/editor.h
> index 131a5ad..445cd82 100644
> --- a/src/editor.h
> +++ b/src/editor.h
> @@ -39,7 +39,7 @@ typedef enum edit_status
>  #define RP_IS_UTF8_CONT(c) (defaults.utf8_locale && ((c) & 0xC0) == 0x80)
>  
>  /* Input line functions */
> -rp_input_line *input_line_new (char *prompt, char *preinput, int history_id, 
> completion_fn fn);
> +rp_input_line *input_line_new (char *prompt, char *preinput, int history_id, 
> enum completion_styles style, completion_fn fn);
>  void input_line_free (rp_input_line *line);
>  
>  edit_status execute_edit_action (rp_input_line *line, KeySym ch, unsigned 
> int modifier, char *keysym_buf);
> diff --git a/src/input.c b/src/input.c
> index 9bc0347..51443e8 100644
> --- a/src/input.c
> +++ b/src/input.c
> @@ -561,12 +561,12 @@ ring_bell (void)
>  char *
>  get_input (char *prompt, int history_id, completion_fn fn)
>  {
> -  return get_more_input (prompt, "", history_id, fn);
> +  return get_more_input (prompt, "", history_id, BASIC, fn);
>  }
>  
>  char *
>  get_more_input (char *prompt, char *preinput, int history_id,
> -                completion_fn compl_fn)
> +                enum completion_styles style, completion_fn compl_fn)
>  {
>    /* Emacs 21 uses a 513 byte string to store the keysym name. */
>    char keysym_buf[513];
> @@ -582,7 +582,7 @@ get_more_input (char *prompt, char *preinput, int 
> history_id,
>    history_reset();
>  
>    /* Create our line structure */
> -  line = input_line_new (prompt, preinput, history_id, compl_fn);
> +  line = input_line_new (prompt, preinput, history_id, style, compl_fn);
>  
>    /* We don't want to draw overtop of the program bar. */
>    hide_bar (s);
> diff --git a/src/input.h b/src/input.h
> index 7abb652..9515605 100644
> --- a/src/input.h
> +++ b/src/input.h
> @@ -25,7 +25,7 @@
>  char *keysym_to_string (KeySym keysym, unsigned int modifier);
>  int cook_keycode (XKeyEvent *ev, KeySym *keysym, unsigned int *mod, char 
> *keysym_name, int len, int ignore_bad_mods);
>  char *get_input (char *prompt, int history_id, completion_fn fn);
> -char *get_more_input (char *prompt, char *preinput, int history_id, 
> completion_fn fn);
> +char *get_more_input (char *prompt, char *preinput, int history_id, enum 
> completion_styles style, completion_fn fn);
>  void read_any_key (void);
>  int read_single_key (KeySym *keysym, unsigned int *modifiers, char 
> *keysym_name, int len);
>  int read_key (KeySym *keysym, unsigned int *modifiers, char *keysym_name, 
> int len);

-- 
jca | PGP: 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]