readline - yank reinicia a marca de definição

5

Eu quero implementar essa ligação

"\C-xk": kill-region

# turn previous word into HTML/XML
# opening and closing tag pair
"\C-xh": "\e \eb\C-xk<\C-y>\e </\C-y>\C-x\C-x"

mas volta para a posição onde o texto foi puxado pela segunda vez após </ em vez de para a posição entre as etiquetas, e. <tag>|</|tag> .

Eu tentei as duas funções na linha de comando com vários textos e parece que set-mark valor é redefinido por yank .

É um bug ou por design? Por enquanto acabei de adicionar \C-b\C-b no final da sequência.

    
por 1.61803 30.11.2015 / 14:56

1 resposta

3

Isso não é um bug, mas um comportamento explicitamente programado.

Se você olhar para kill.c - & gt ; rl_yank (): 512

/* Yank back the last killed text.  This ignores arguments. */
int
rl_yank (count, ignore)
     int count, ignore;
{
  if (rl_kill_ring == 0)
    {
      _rl_abort_internal ();
      return 1;
    }

  _rl_set_mark_at_pos (rl_point);
  rl_insert_text (rl_kill_ring[rl_kill_index]);
  return 0;
}

Você pode ver que ele redefine explicitamente a marca para o ponto atual, antes de inserir o texto do anel kill.

O mesmo se aplica aos outros métodos yank *.

Isto não está realmente bem documentado, mas eu suponho que isto é para que você possa retornar ao ponto original, após inserir um texto de um comprimento desconhecido.

    
por 12.11.2017 / 14:44