편집 라인

편집 라인

이것별표 위키CLI 프롬프트의 색상을 변경하는 데 사용할 수 있음을 나타냅니다 %Cn[;n]. 즉:

export ASTERISK_PROMPT="%C31[%H]: "

하지만 위의 내보내기를 사용하면 내 호스트 이름이 [1;31m[voip]: [1;0m어디에 있는지 손상된 프롬프트가 표시됩니다.voip

내 터미널은 색상을 지원합니다. 사실 저는 zsh과 에서 색상을 사용했습니다 bash. 그리고 echo $TERM나에게 다음을 주었다:

xterm-256color

내 터미널의 스크린샷은 다음과 같습니다.

여기에 이미지 설명을 입력하세요.

보시다시피 별표 메시지/로그도 색상으로 표시됩니다. 별표 메일링 리스트에 문의했는데 구문이 export ASTERISK_PROMPT="%C31[%H]: "정확합니다. 어떤 사람들은 색상 힌트가 효과가 있다고 보고하고 다른 사람들은 제가 보고한 것과 동일한 문제를 겪고 있습니다.

이로 인해 문제가 별표에 있는 것이 아니라 운영 체제 환경, 터미널, 터미널 에뮬레이터 등의 복잡한 상호 작용에 있는 것으로 의심됩니다.

나는 몇 가지 다른 터미널 에뮬레이터를 사용해 보았습니다 : terminator, xterm, gnome-terminal, eterm. konsole문제는 동일합니다.

저는 별표 서버와 연결된 데스크톱 모두에서 Debian 10을 사용하고 있습니다.

Asterisk에서 컬러 CLI 프롬프트를 얻는 방법은 무엇입니까?

답변1

아니요로컬 수정이를 위해.

편집 라인

NetBSD editline은 수년간 컬러 힌트를 지원하지 않았습니다. 그 작용 메커니즘은주장한 바에 의하면지원되는 색상 팁은 작동하지 않으며 2015년(아마도 그 이전)부터 버그가 있는 것으로 알려져 있습니다. 당신이 보고 있는 것은 바로 잘못된 메커니즘의 결과입니다.

가지다Nick Zavaritsky의 편집 라인 지점왼쪽/오른쪽 힌트의 문자와 편집 버퍼의 문자에 대한 그래픽 렌더링 정보를 저장하므로 색상 힌트뿐만 아니라 편집 중인 줄의 (구문) 색상도 올바르게 지원합니다.

바닐라 editline은 틀림없이 열등한 경로를 취합니다. 2017년에는 프롬프트 문자열의 리터럴이 실제로 올바른 순서로 내보내지고 시작 시 선 너비 계산이 중단되지 않도록 "리터럴" 메커니즘이 향상되었습니다. (Zavaritsky 풍미와 같은 임의의 색상을 지원하지 않기 때문에 틀림없이 열등합니다. 원본을 유지합니다.이 문자를 사용하여 텍스트 시퀀스를 표시하세요.원래 디자인의 메커니즘이지만 보존할 의도가 있었던 형편없는 디자인인 것 같습니다. 색상 순서에 대한 자체 termcap 조회를 수행하는 클라이언트 응용 프로그램에 너무 많이 의존합니다. 앞으로 살펴보겠지만 Asterisk의 경우 이러한 종속성은 잘못되었습니다. )

별표

Asterisk는 일명 NetBSD 편집 라인을 사용합니다.도서관 편집자데비안 명명법에서 데비안이 호출하는 다른 라이브러리와 혼동하지 마십시오.편집 라인.

프롬프트에서 색상 순서를 수동으로 작성하는데, 이는 매우 좋지 않으며 256색 또는 24비트 색상을 지원하는 것은 물론이고 16가지 색상을 지원하는 1990년대 초반의 터미널 에뮬레이터와 실제로 호환되지 않습니다. . 아니요termcap/terminfo를 사용하여 해당 번호를 찾아 색상을 지정 setaf하세요 .setab고정된 색상에 대한 이스케이프 시퀀스입니다., 그리고 틀렸습니다.밝고 대담한 조합,VT100에 색상이 있다고 잘못 생각함(VT100은 흑백입니다.)8개 이상의 색상을 처리하지 않습니다., 결국 SGR 0(SGR 22 대신)을 모든 곳에서 방출하게 됩니다.

Asterisk는 (아이러니하게도) Zavaritsky 스타일 편집 라인을 사용하지 않습니다.동일한 문제가 발생했습니다. AIXterm 16 색상은 지원되지 않습니다.그리고 Asterisk가 잘못 구성된 이스케이프 시퀀스를 잘못 구문 분석하는 방식에 관해서는 최소한 버그 호환이 가능합니다. ☺

이전 바닐라 스타일 편집 라인을 사용하면 실제로 예상되는 결과가 표시됩니다. 이스케이프 시퀀스는 이스케이프되지 않은 형식으로 인쇄됩니다. 2017년 이후 바닐라 편집 줄은 실제 이스케이프 시퀀스로 내보내야 합니다. 2018년에는 데비안에도 등장했습니다.. 그래서 데비안2019년에 Asterisk 바이너리를 재구축했습니다..

서비스 수리

에프제공하다그것을 고치십시오. 패키지 관리자의 libedit가 3.1-20181209보다 높고 Asterisk가 1:16.1.1보다 높은지 확인하세요. 적어도 질문은 크게 다를 것입니다. 문제의 효과는 더 이상 표시되지 않지만 굵은 글꼴이 사용되거나 밝은 색상이 밝지 않거나 "Solarized" 색상 테마가 완전히 작동하지 않는 등의 문제가 나타날 수 있습니다.

이러한 버전에서 여전히 문제가 발견되면 Asterisk 및 NetBSD editline 담당자에게 불만을 제기하십시오. 그들은 실제로 여기서 균열을 해결하고 있을 뿐입니다.

답변2

필수 라이브러리

Asterisk는 libedit를 알림으로 사용합니다. 이 라이브러리의 이전 버전은 색상 지정을 지원하지 않으며 3.1-20181209보다 높은 버전이 필요합니다. Debian에서는 다음과 같이 패키지를 업데이트할 수 있습니다.

# Download the package from Debian 11
wget http://ftp.br.debian.org/debian/pool/main/libe/libedit/libedit2_3.1-20191231-1_amd64.deb
wget http://ftp.br.debian.org/debian/pool/main/libe/libedit/libedit-dev_3.1-20191231-1_amd64.deb

# Update libedit
dpkg -i libedit-dev_3.1-20191231-1_amd64.deb libedit2_3.1-20191231-1_amd64.deb

# Check the installed version
apt list --installed | grep edit

# As a side note here is the Asterisk install process:
cd /sources/dir
./configure
make clean 
make install -j8
make config
make samples

별 프롬프트 색상 블록:

Asterisk의 프롬프트 색상 구현에는 실제로 버그가 있습니다. 다음 패치(v16.2.1용)에서는 빨간색 ASTERISK_PCOLOR과 같은 색상 번호로 설정할 수 있는 env 변수의 사용을 소개합니다.export ASTERISK_PCOLOR="031"누구든지 이 패치 업스트림을 홍보할 수 있습니다., 패치 적용 후 꼭 make clean사용하시기 바랍니다 make install. (보너스로 이 패치는 굵은 글씨와 배경색도 지원합니다. 예 export ASTERISK_PCOLOR="1;31;41":)

--- main/asterisk.c
+++ main/asterisk.c
@@ -2548,7 +2548,7 @@
        return CLI_SUCCESS;
 }
 
-#define ASTERISK_PROMPT "*CLI> "
+#define ASTERISK_PROMPT "*CLI>"
 
 /*!
  * \brief Shutdown Asterisk CLI commands.
@@ -2725,6 +2725,7 @@
 {
        char tmp[100];
        char *pfmt;
+       char *pcolor;
        int color_used = 0;
        static int cli_prompt_changes = 0;
        struct passwd *pw;
@@ -2738,6 +2739,12 @@
                ast_str_reset(prompt);
        }
 
+       if (!(pcolor = getenv("ASTERISK_PCOLOR" ))) {
+               pcolor = "0";
+       }
+
+       ast_str_append(&prompt, 0, "\1\033[%sm\1", pcolor);
+
        if ((pfmt = getenv("ASTERISK_PROMPT"))) {
                char *t = pfmt;
                struct timeval ts = ast_tvnow();
@@ -2839,11 +2846,13 @@
                        ast_term_color_code(&prompt, 0, 0);
                }
        } else {
-               ast_str_set(&prompt, 0, "%s%s",
+               ast_str_append(&prompt, 0, "%s%s",
                        remotehostname ? remotehostname : "",
                        ASTERISK_PROMPT);
        }
 
+       ast_str_append(&prompt, 0, "\1\033[0m\1 ");
+
        return ast_str_buffer(prompt);
 }
 
@@ -3034,7 +3043,7 @@
                history_end(el_hist);
 
        el = el_init("asterisk", stdin, stdout, stderr);
-       el_set(el, EL_PROMPT, cli_prompt);
+       el_set(el, EL_PROMPT_ESC, cli_prompt, '\1');
 
        el_set(el, EL_EDITMODE, 1);
        el_set(el, EL_EDITOR, editor);

관련 정보