Я не могу за свою жизнь повторно привязать Ctrl-o к iTerm2/Bash.

Вот мои stty -a флаги для cchars:

cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;

Вот мой .inputrc:

set bind-tty-special-chars off
Control-o: "> output"

Хотя Rebind Cu работает, поэтому несоответствие сводит меня с ума. Был бы признателен, если бы кто-то мог объяснить, почему мне.

1 ответ1

0

кратко: функция применяется только для редактирования символов; discard не является редактирующим персонажем.

дольше: используйте источник. В lib/readline/bind.c есть таблица с этой записью:

  { "bind-tty-special-chars",   &_rl_bind_stty_chars,           0 },

который присваивает имя опции адресу переменной. Переменная проверяется в нескольких местах в libreadline, в конечном счете, переходя к этой функции:

    /* Rebind all of the tty special chars that readline worries about back 
       to self-insert.  Call this before saving the current terminal special 
       chars with save_tty_chars().  This only works on POSIX termios or termio 
       systems. */
    void
    rl_tty_unset_default_bindings (kmap)
         Keymap kmap;
    {
      /* Don't bother before we've saved the tty special chars at least once. */
      if (RL_ISSTATE(RL_STATE_TTYCSAVED) == 0)
        return;

      RESET_SPECIAL (_rl_tty_chars.t_erase);
      RESET_SPECIAL (_rl_tty_chars.t_kill);

    #  if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
      RESET_SPECIAL (_rl_tty_chars.t_lnext);
    #  endif /* VLNEXT && TERMIOS_TTY_DRIVER */

    #  if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
      RESET_SPECIAL (_rl_tty_chars.t_werase);
    #  endif /* VWERASE && TERMIOS_TTY_DRIVER */
    }

Вы можете увидеть имена stty , используемые в структурах: erase kill и lnext Там нет discard. bash не устанавливает его (или сбрасывает).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .