나는 찾았다
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_codes
79개의 제어 시퀀스가 보입니다. 이는 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)맨 페이지.
그리고tabs
xterm과 함께 사용됩니다.
답변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
: 이것은 설명된 문제에 대해 작동하지만 실행할 때 커서 이동이 엉망이 되는 부작용이 있습니다 . 상황의 심각성으로 인해 이는 문제에 대한 적절한 해결책이 아닙니다. (사이트 정책에 대해 잘 모르겠습니다. 답변을 삭제해야 할까요, 아니면 다른 사람들이 실수로부터 배울 수 있도록 보관해야 할까요? 당연히 그대로 두어야 한다고 생각합니다. 어쨌든, 처음으로 돌아가서.)