Opened 18 years ago
Last modified 18 years ago
#495 assigned defect
Табулатори в изхода
| Reported by: | Александър Шопов | Owned by: | anonymous |
|---|---|---|---|
| Priority: | normal | Component: | -- Общи -- |
| Severity: | normal | Keywords: | |
| Cc: | yavor@… |
Description
В някои файлове се извежда табулатор за форматиране - \t.
Напълно е възможно популярен терминален емулатор (xterm) да бъде в режим, в който таулаторите са с различен размер от стандартния, а е и възможно отделните табулатори да са разлечин размер - например 1-ят да е 3, а следващите по 5 шпации.
По-добре е да се ползват по 8 шпации за форматиране.
Change History (7)
comment:1 by , 18 years ago
| Cc: | added |
|---|
comment:2 by , 18 years ago
Да, проблемът не е вероятен, но е възможен.
Ситуацията идва от факта, че терминалните емулатори емулират устройства, на които може да се задава размер и позиция на табулатора. (Това ми е останало като спомен от някогашната работа с VAX)
Трудно ми беше да намеря пример за това.
По принцип стандартът POSIX дефинира програма точно за това - tabs (man tabs - при мен страницата е в пакета man-pages). Възможно е във FreeBSD да има реализация на програмата. (http://people.freebsd.org/~schweikh/posix-utilities.html)
Конкретна програма, която променя размера на табулатора има тук: http://invisible-island.net/vttest/vttest.html
Компилирай я и пусни под xterm. В тест 2 се извеждат табулации - размерът им е различен от 8 шпации.
comment:3 by , 18 years ago
Да, пробвах програмата и там \t е 6 шпации, но в тази програма експлицитно се предефинира това. С емулаторите, които тествах (далеч не са всички) това не се случва, както и няма някакви потребителски опции за настройка.
В main.c:
cup(1,7); tbc(1); tbc(2); /* no-op */
cup(1,1); for (col = 1; col <= min_cols-2; col += 6) printf("\t*");
cup(2,2); for (col = 2; col <= min_cols-2; col += 6) printf(" *");
По-надолу има един тест, където "връщат" "vanilla tabs":
/* Set vanilla tabs for next test */
cup(1,1); tbc(3); for (col = 1; col <= max_cols; col += 8) { cuf(8); hts(); }
Ако може някой да демонстрира терминал (не тестова програма писана с академична цел), където примерно елементарен код като:
#include <stdio.h>
int
main (void)
{
printf ("Опаaa!\tОпалянка!\n\tЙощ едно „опа“.\n");
return 0;
}
се форматира различно от
Опаaa! Опалянка!
Йощ едно опа.
(т.е. две шпации между колоните и подравняване налице), то този проблем е просто хипотетичен проблем.
Използването на 8 шпации вместо \t е неподходящо в някои случаи -- например ако горният низ е композитен или (части) се изгражда(т) динамично. Да не говорим, че е досадно за самия преводач.
Все пак, ще се поровя малко и ще поразпитам по този въпрос.
comment:4 by , 18 years ago
Това намерих като спецификация: http://www.opengroup.org/onlinepubs/009695399/utilities/tabs.html. Доколкото разбирам, това не е задължително, което отчасти обяснява защо нямам такава програма на моите системи. Продължавам да търся терминален емулатор, където да е възможно да се прояви/конфигурира различно поведение.
comment:5 by , 18 years ago
Потвърждение за FreeBSD и xterm - http://lists.freebsd.org/pipermail/freebsd-current/2008-April/084668.html
comment:6 by , 18 years ago
Да не говорим, че е досадно за самия преводач.
Всъщност как се появиха при теб табулациите?
В po-mode - при мен GNU Emacs генерира по 8 шпации дори в случаите, когато натискам табулатора. Единствено когато копирам низа от оригинала с ctrl-j, ги получавам в изхода, или работя директно с файла с E.
comment:7 by , 18 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
Ще оправя преводите постепенно.
(В PO mode `\t' се въвежда с C-q TAB.)
![(please configure the [header_logo] section in trac.ini)](/project/gtp/chrome/site/your_project_logo.png)
Можеш ли да дадеш рецепта, с която да се възпроизведе проблема? Ако е възможно и вероятно xterm да се настрои по такъв начин, то доста програми биха се държали неприятно дори и при LC_ALL=C. Например nano:
void print_opt_full(const char *shortflag #ifdef HAVE_GETOPT_LONG , const char *longflag #endif , const char *desc) { printf(" %s\t", shortflag); if (strlenpt(shortflag) < 8) printf("\t"); #ifdef HAVE_GETOPT_LONG printf("%s\t", longflag); if (strlenpt(longflag) < 8) printf("\t\t"); else if (strlenpt(longflag) < 16) printf("\t"); #endif if (desc != NULL) printf("%s", _(desc)); printf("\n"); }Повечето (всички?) програми на GNOME ползват GOption, и доколкото успях да тествам с различни терминали при различнен брой колони няма никакви проблеми. (Не съм пробвал да "дефинирам" стойност за "horizontal tab", понеже не знам как изобщо става това.)