GUI 터미널에서 탭 너비 설정

GUI 터미널에서 탭 너비 설정

나는 찾았다

setterm -regtabs 4

xterm 또는 urxvt에서는 작동하지 않습니다.

하지만 이것은

xterm_set_tabs () { 
  TERM=linux;
  export $TERM;
  setterm -regtabs 4
}

문제를 피할 것입니다.

그러나 나는 이것이 차선책이라고 생각합니다. 왜냐하면 (1) 달리 설명할 수 없는 gfx 버그에 부딪혔기 때문입니다(적어도 올바른 탭 내용을 얻으면 가능성이 배제됩니다). 학교 Solaris에 SSH로 접속하여 실행했는데 emacs -nw"linux"를 알 수 없다는 메시지가 떴습니다! 그래서 다시 "xterm"으로 바꿔야 합니다. 물론 항상 같은 터미널을 사용하기 때문에 이것은 어리석은 일입니다.

또한 탭에 전혀 의존하지 않는 것이 좋은 경험 법칙입니다!

답변1

setterm유틸리티는 Linux 콘솔과 함께 사용하도록 설계되었습니다. ~에 따르면console_codes 매뉴얼 페이지:

Linux 콘솔은 VT102 및 ECMA-48/ISO 6429/ANSI X3.64 터미널 컨트롤의 대부분 하위 집합뿐만 아니라 색상 팔레트, 문자 집합 매핑 등을 변경하기 위한 특정 개인 모드 시퀀스도 구현합니다.

~부터프로그램이 하드코딩되어 있습니다.,

/* -regtabs. */
if (ctl->opt_regtabs && vc_only(ctl, "--regtabs")) {
    int i;

    fputs("\033[3g\r", stdout);
    for (i = ctl->opt_rt_len + 1; i <= TABS_MAX; i += ctl->opt_rt_len)
        printf("\033[%dC\033H", ctl->opt_rt_len);
    putchar('\r');
}

xterm이 구현하기 때문에 xterm과 함께 작동합니다.VT100 컨트롤(및 기타).

에 관해서는대규모 하위 집합, 이는 논란의 여지가 있습니다. 프로젝트를 빠르게 계산해 보면 console_codes79개의 제어 시퀀스가 ​​보입니다. 이는 xterm FAQ에 문서화된 xterm 유사보다 훨씬 낮습니다.개수 제어를 사용하여 버전 비교. 79는 그 자체로는 그렇게 크지 않습니다. VT102 자체(xterm과 유사)에는 104가 있습니다. ISO-6429(일명ECMA-48)는 20개의 패턴과 162개의 시퀀스를 기록했습니다. 합계가 182이든 162이든 50%는 그렇지 않습니다.대규모 하위 집합.

Linux 콘솔 유틸리티를 사용하는 것 외에도 더 이식 가능한 옵션이 있습니다: tabs유틸리티(POSIX및 솔라리스). 그것은ncurses 유틸리티(아마도 Linux 시스템에 설치되어 있을 것입니다).

질문에 제공된 예의 경우 다음과 같이 할 수 있습니다.

tabs -4

하드 코딩 대신 터미널 데이터베이스를 사용합니다. 탭과 이를 설정하는 제어 시퀀스는 ECMA-48 및 다른 곳에 문서화되어 있습니다.용어 정보(5)맨 페이지.

그리고tabsxterm과 함께 사용됩니다.

답변2

많은 터미널은 탭 정지를 설정하는 이스케이프 시퀀스를 지원합니다. 이 기능에는 terminfo(5)에 tbc(모든 탭 지우기) 및 hts(가로 탭 집합) 항목도 있습니다.

$ tput tbc; echo aaaaaaaaaaaaaaaaaaaaa$(tput hts); echo 'a\tb'
aaaaaaaaaaaaaaaaaaaaa
a                    b

위에서는 aaaaaaaa 끝에 탭 정지를 설정하고 다음 줄에서 결과를 확인합니다.

따라서 4개 열마다 탭 정지를 설정하려면 다음이 필요합니다.

tbc=$(tput tbc) hts=$(tput hts) cuf4=$(tput cuf 4)
printf '%s\r' "$tbc"
i=4
while [ "$i" -lt "$COLUMNS" ]; do
  printf %s "$cuf4$hts"
  i=$(($i + 4))
done
printf '\r'

또는 불규칙한 간격으로 탭 정지를 설정할 수 있습니다. 위에서는 커서를 앞으로 이동하기 위해 "tput cuf"를 사용했지만 첫 번째 예에서는 "aaaa"를 사용했습니다. 넌 할 수있어:

printf '\r%s' "${tbc}aaaa${hts}aaaaa${hts}aaaaaaaa${hts}"

4열에 탭 정지를 설정한 다음, 그 다음, 5열 앞에 탭을 설정하세요.

답변3

다음을 사용하여 환경 변수를 전체 세션으로 내보내지 않고 일시적으로 설정할 수 있습니다 env.

env TERM=linux setterm -regtabs 4

답변4

좋아, 읽어봤지만 man xterm탭 너비에 대한 언급은 없습니다. 재설정이 가장 쉬울 것이라고 생각하기 시작했습니다 TERM. 존재하다 .bashrc:

function xterm_set_tabs () {
  TERM=linux
  export $TERM
  setterm -regtabs 4
  TERM=xterm
  export $TERM
}

if [ `echo $TERM` == "xterm" ]; then
  xterm_set_tabs
fi

편집하다emacs -nw: 이것은 설명된 문제에 대해 작동하지만 실행할 때 커서 이동이 엉망이 되는 부작용이 있습니다 . 상황의 심각성으로 인해 이는 문제에 대한 적절한 해결책이 아닙니다. (사이트 정책에 대해 잘 모르겠습니다. 답변을 삭제해야 할까요, 아니면 다른 사람들이 실수로부터 배울 수 있도록 보관해야 할까요? 당연히 그대로 두어야 한다고 생각합니다. 어쨌든, 처음으로 돌아가서.)

관련 정보