Bash

readline - yank 重置設置標記

  • November 12, 2017

我想實現這個綁定

"\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"

但它會返回到文本第二次被拉出的</位置,而不是標籤之間的位置,例如<tag>|</|tag>.

我在命令行使用各種文本嘗試了這兩個函式,似乎set-mark值被重置為yank.

這是一個錯誤還是設計使然?現在我只是\C-b\C-b在序列的末尾添加。

這不是錯誤,而是明確程式的行為。

如果您查看kill.c -> 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;
}

您可以看到,在插入來自 kill ring 的文本之前,它顯式地將標記重置為目前點。

這同樣適用於其他 yank* 方法。

這並沒有真正記錄好,但我認為這是為了讓您在插入可能未知長度的文本後可以返回原始點。

引用自:https://unix.stackexchange.com/questions/246412