Escape-последовательности в выводе сценария, названного из ncurses приложения

Это могло бы получить Вас там...

  1. Включите пользовательское заполнение клавишей Tab в своем .bashrc

    shopt -s progcomp
  2. Создайте compgen, функционируют и добавляют его к .bashrc после Ваших функций примечаний.

    _notes() {
    local cur
        cur=${COMP_WORDS[COMP_CWORD]}
        COMPREPLY=( $(compgen -f $HOME/n/$cur | cut -d"/" -f5 ) )
        }
       complete -o filenames -F _notes n

Это работает на меня - на базовом уровне. Я все еще не решил его для вложенных каталогов...

Ссылки:

  1. большая часть из него отсюда: http://sixohthree.com/867/bash-completion

  2. Завершение встроенные детали здесь: http://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html

14
26.10.2015, 16:59
4 ответа

tmux и экранные программы непосредственно не проходят через escape-последовательности. Они представляют один вид терминала к приложению (экранируйте терминальный тип), и самостоятельно ncurses приложение к другому терминалу. В действительности это - что-то как терминальный переводчик. Так да это использует (или отбрасывания) последовательности для "экранного" типа терминала и поднимает буфер, который Вы видите. Затем это берет те буферные события изменения и использует любой вид терминала, который Вы в настоящее время используете для отображения текущего буфера. Таким образом, исходное приложение и терминал просмотра отделяются.

0
27.01.2020, 19:52

Если бы вы поставили что-то вроде ...

export "PTTY=$(tty)"

... В вашем / etc / roft Тогда для каждого нового -L Огин Shell вы бы вызваны (который обычно происходит, когда вы открываете новое окно терминала) , что переменная среды будет доступна для всех его дочерних процессов, которые должны включать TMUX и все его дети.

Это должно позволить вам сделать ...

printf '\033]9;foobar\007' >"$PTTY"

... и тем самым пропустить прямо через любые pty слоев, которые могут существовать между вашей текущей оболочкой и эмулятором терминала, который вы используете.

0
27.01.2020, 19:52

Если проблема в том, что выход из вашего бэш-скрипта теряется, то вы можете выиграть битву с переадресацией:

echo "\ePtmux;\e\e]9;foobar\007\e\". > /dev/tty

Однако, я подозреваю, что реальная проблема заключается в том, что вы должны использовать echo -e для того, чтобы bash обрабатывал экранирующие последовательности в вашей строке.

0
27.01.2020, 19:52

Причина, по которой сценарий события не может отправить сообщение "Growler", заключается в том, что mcabber закрывает стандартный ввод, вывод и потоки ошибок при запуске команды события. Вы можете увидеть это в hooks.c :

  if ((pid=fork()) == -1) {
    scr_LogPrint(LPRINT_LOGNORM, "Fork error, cannot launch external command.");
    g_free(datafname);
    return;   
  }    
  if (pid == 0) { // child
    // Close standard file descriptors
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    if (execl(extcmd, extcmd, arg_type, arg_info, bjid, arg_data,
              (char *)NULL) == -1) {
      // scr_LogPrint(LPRINT_LOGNORM, "Cannot execute external command.");
      exit(1);
    }
  }
  g_free(datafname);

Это заставляет сценарий событий запускаться без вмешательства в потоки, используемые mcabber .

Нет специального режима ncurses для перехвата сообщения (в конце концов, tmux уже запущен как приложение terminfo). Вероятно, вы можете обойти проблему, перенаправив свой echo (предпочтительно printf ) на / dev / tty , например,

#!/bin/sh
printf '\033Ptmux;\033\033]9;foobar\007\033\\' >/dev/tty
1
27.01.2020, 19:52

Теги

Похожие вопросы