Каковы недостатки упругих вкладок? [закрыто]

83

Посмотрите здесь: типичная священная война на вкладках против пробелов .

Теперь посмотрите здесь: упругие вкладки . Все проблемы решены, и добавлено множество очень полезных новых способов поведения.

упругие вкладки

Упоминаются ли даже упругие табуляторы в обсуждении табуляции и пробелов? Почему нет? Есть ли недостатки идеи упругой табуляции настолько серьезной, что никто никогда не реализовывал их в популярном редакторе?

РЕДАКТИРОВАТЬ : Я прошу прощения за то, что уделил слишком много внимания "почему они не упоминаются". Это было не то, что я хотел; этот вопрос, возможно, даже не по теме. Что я на самом деле имею в виду, каковы основные недостатки этого, которые мешают более широкому принятию заведомо полезной идеи? (в идеальном мире, где все это уже поддерживает)

(Оказывается, уже есть запрос на Microsoft Connect для реализации эластичных вкладок табуляции в Visual Studio , а также запрос в Eclipse . Плюс есть вопрос о других редакторах, которые реализуют эластичные вкладки табуляции )

Роман Старков
источник
4
Это был бы отличный вопрос для ux.stackexchange.com
JonnyBoats
11
Они никогда не упоминаются в обсуждении «табуляция против пробелов», потому что работающий программист почти не может использовать эти вещи. Возможно, если бы у вас была реализация Eclipse, VS, gvim и emacs, это могло бы измениться.
Пол Томблин
2
Мне действительно нравится эта идея, но только когда вы живете с ней в течение месяца или около того, вы действительно знаете, в чем заключаются подводные камни. Как и все когда-либо, гарантированно будут случаи, когда он делает то, чего вы не ожидаете ...
Крис Берт-Браун
3
@ ChrisBurt-Brown Это всегда риск, да. IntelliSense также имеет свои подводные камни, такие как замена текста, когда вы этого не хотели. В целом, однако, IntelliSense в C # большая жирная победа.
Роман Старков
4
Я хочу это в блокноте ++ ... Я хочу это сейчас
Бен Брока

Ответы:

32

Священные войны субъективны

Эластичные таб-табы Ника - это удивительная концепция, которая может помочь многим людям прийти к согласию относительно работоспособного решения, хотя я очень сомневаюсь, что это полностью положит конец этой священной войне: это, в конце концов, также вопрос вкуса, и многие программисты не будут сдвигать дюйм от их позиции по этому вопросу, даже ценой компромисса. Так что это будет первой причиной.

Например, многим людям на стороне «пробелов» все равно не понравится, поскольку для достойного рендеринга требуется дополнительная часть логики в вашем программном обеспечении (например, просто просмотр набора изменений в веб-представлении вашего SCM).

Проблемы реализации

Но наиболее очевидная причина - это просто технический барьер для входа : это принципиально иное понятие, чем то, что было реализовано в течение ряда лет (если не десятилетий) в IDE и текстовых редакторах. Потребовалось бы переписать некоторые из них для обработки строк в совершенно ином порядке, что затрудняет работу старых и более крупных систем, которые имеют более высокие шансы на глубокую и жесткую связь в своем коде обработки строк. Это, однако, намного проще сделать , когда вы начинаете с нуля (думать о демо Ника или Go «s tabwriter пакет).

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

Мы заботимся достаточно?

Третья причина заключается в том, что некоторые разработчики не настолько зациклены на этом вопросе и не особо заботятся о том, чтобы приложить дополнительные усилия для поддержки этих усилий. В большинстве случаев конфликт пробелов-вкладок не является бизнес-блокиратором, поэтому проблема не так уж и велика.

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

Так что, если хочешь, помоги Нику.

haylem
источник
(не по теме) Я часто задаюсь вопросом, как другие «это хорошие, но очень незначительные» функции превращают его в такие продукты, как Visual Studio. Кажется, что кто-то в команде просто нашел время, чтобы реализовать это по личным причинам. Например, подумайте о вводе нескольких строк одновременно в Visual Studio; это не так, как десятки тысяч людей просили об этом, но мне это нравится.
Роман Старков
3
@romkyns: Что касается многих вещей, то для этого требуется либо один тихий инсайдер, либо тысяча голосов, кричащих у ворот.
Хайлем
35

Много раз мне приходилось бороться с текстовым процессором, чтобы документ выглядел так, как я хочу, без какого-то скрытого автоматического правила, контролирующего размещение моих слов. Я не хочу тратить одну секунду, пытаясь понять, почему редактор настаивает на размещении этих слов там.

mhoran_psprep
источник
11
Я тоже. Я полностью сочувствую этому чувству, так как такие правила меня тоже расстраивают. Но это отличается в двух отношениях. Первый: точно так же, как табуляторы сейчас, вам не нужно использовать их, если вы не хотите. Вы можете оставить текст своих коллег в покое, если он их использует. Второе: у упругих вкладок нет скрытых правил, но явно очевидных. Поведение совершенно естественное - возможно, даже более естественное, чем традиционные табуляции, которые происходят в некоторой произвольной, обычно не относящейся к делу позиции в тексте. Вот почему никто больше не использует табуляции для чего-то кроме отступа.
Тимви
10
@Timwi: Вопрос в том, чтобы перечислить недостатки. Я сделал.
mhoran_psprep
14
Это может быть неочевидно из GIF, но единственное, что можно понять, это то, что когда вы нажимаете «TAB», все, что появляется после, будет правильно выровнено по вертикали. Это не что иное, как текстовый процессор. Просто попробуйте интерактивную демонстрацию по ссылке, которую я разместил, и вы увидите, насколько это естественно.
Роман Старков
3
@mhoran_psprep: Достаточно справедливо, я ценю ваш вклад. Я думаю, что мы смотрели на разные интерпретации вопроса. Вы перечисляете свои недостатки, используя эту функцию, хотя я думал, что она связана с недостатками введения этой функции (то есть делает ее доступной и не обязательной ).
Тимви
27

Я впервые слышу о них. Не уверен, что они являются хорошей идеей, но они кажутся мало полезными, так как у нас есть инструменты (такие как отступ), которые уже автоматически форматируют код.

Что происходит, когда я открываю ваши умные упругие вкладки в vim и редактирую их? Автоматически ли очищается вкладка или у вас все в порядке?

Основными недостатками, как я вижу, являются, возможно, нарушение различий, контроль версий и несовместимость с редакторами, которые их не поддерживают. Возможно, требуется много модификаций кода для их поддержки, и есть более важные вещи, чем функция «еще одна вкладка для форматирования кода». В конце концов, мы все можем использовать, indentчто делает все вышеперечисленное, если память служит.

Sardathrion
источник
9
Что за отсталое отношение. Давайте не иметь никакого прогресса , потому что любимые старые, устаревшие инструменты людей не могут справиться только пока ! (Ирония, конечно, заключается в том, что эти инструменты (такие как vim) имеют открытый исходный код, поэтому, если бы это было действительно важно для вас, вы могли бы (и, вероятно, должны ) добавить в него поддержку эластичной табуляции)
Timwi
14
@Timwi: Вы совершенно не понимаете, о чем я говорил. Что происходит, когда ваш файл кода анализируется чем-то, что не знает об упругих табуляции? Вы в конечном итоге беспорядок или они могут справиться? Как насчет контроля версий и различий? Просто пожелать, чтобы все инструменты поддерживали $ feature, нереально, даже если эти инструменты с открытым исходным кодом.
Сардатрион
14
@Timwi: Вы предполагаете, что все находят упругие табуляторы такими же потрясающими, как вы думаете. Это не может быть правдой.
Сардатрион
7
@ Сардатрион прав. Что происходит, когда мне приходится удаленно подключаться к моему * nix-серверу без установленной оконной системы и мне нужно проверить какой-то код с помощью Vim / Emacs / Pico / Whзнаками? Если есть механизм, чтобы его можно было прочитать, это было бы хорошо ... в противном случае это был бы кошмар. Я не вижу преимущества эластичной вкладки, которая в любом случае перестает быть такой полезной. Я уже могу автоматически отформатировать свой код, чтобы посмотреть, как он должен работать в IDE, которые я использую.
Буровая установка
7
Точка управления версиями хороша - я не думаю, что люди оценят редактор, который молча начинает изменять размещение / формат комментариев в коде как угодно далеко от кода, который они модифицируют (см. Пурпурный раздел в анимации OP). GIF). Было бы полезно иметь эталонную реализацию для игры, но то, что я вижу до сих пор, не примечательно - emacs уже делает большую часть этого, просто с помощью нескольких дополнительных нажатий клавиш (что, вероятно, хорошо).
mcmcc
13

Если честно, я не нахожу их полезными, когда вы преодолеете первоначальное волнение. Например, мне не нравятся комментарии в конце строки - я всегда помещаю свои комментарии в отдельной строке. При этом эластичные вкладки теряют свое основное использование.

После этого вы, конечно, можете использовать их для выравнивания аргументов функции (и параметров) и длинных списков назначений.

Но для первого я склонен просто отступать от всех аргументов на один дополнительный уровень, и это прекрасно работает со мной:

void foo(
    int x,
    int y,
    string z
)

И я не вижу какой - либо необходимости изменить это.

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

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

Если бы редактор их реализовал, я бы их не использовал.

Конрад Рудольф
источник
Оценил. Кажется, что вы могли бы с радостью использовать шрифт переменной ширины, если бы просто захотели, так как в любом случае вы не выравниваете ничего, кроме начала строки. Visual Studio имеет довольно хорошую поддержку для этого, и повышение читабельности приятно.
Роман Старков
1
@romkyns У нас были дискуссии о том , что и в ходе одного я попытался с помощью пропорционального шрифта для программирования в течение некоторого времени. В результате моноширинные шрифты работают лучше, даже если не учитывать отступ. Кроме того, в настоящее время я работаю исключительно в Vim и консоли, ни одна из которых, по всей вероятности, не будет поддерживать пропорциональные шрифты.
Конрад Рудольф
1
@romkyns Тем не менее, эти проблемы разрешимы (или, возможно, даже решены, с пропорциональным шрифтом, предназначенным для программирования). Но я все еще не вижу необходимости.
Конрад Рудольф
13

Один недостаток заключается в том, что он не работает, если требуется выравнивание на одной группе линий, а затем отступ на следующей, поскольку он группирует позиции табуляции соседних линий.

def foo( bar,
         xyzzy ):
         wibble() # Too much indentation

Что я хотел:

def foo( bar,
         xyzzy ):
    wibble()

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

Хаммар
источник
Согласовано. Реализация Ника не очень хорошо работает для таких языков, как Python.
Роман Старков
3
Почему бы это не сработало? Это не принципиальное ограничение, алгоритм просто должен учитывать язык. Но в некоторой степени это верно даже сегодня, например, Vim определяет различные правила отступов в зависимости от языка. Это может легко приспособить отступ Python.
Конрад Рудольф
1
@KonradRudolph Нет, они не могли. Использование упругих табуляторов - это возможность автоматически делать отступы / деиндентировать группы текста вместе. Одним из простых примеров является конец оператора «if»: вы пытаетесь сделать отступ, потому что вы выходите из оператора, но «умные» эластичные табуляции решают, что вы также хотите сделать отступ для одной или двух строк выше, и т.д. и так далее ... И если вам нужно явно сгруппировать текст вместе, то - какой смысл? Это больше работы, чем исправлять отступы ...
Изката
1
@Izkata Unindenting вручную может (должен) просто завершить текущую группу. Зачем вам когда-либо управлять отступом с помощью упругих упоров? Вы этого не сделаете, поэтому алгоритм знает, что когда вы делаете это, он должен заканчивать блок, а не отступать вышеуказанный блок.
Конрад Рудольф
1
О, хорошая мысль. Хм ... может быть, вы могли бы сделать двойной отступ в аргументах? Так что тогда wibble()будет иметь только один отступ и, следовательно, не будет выровнен с аргументами функции?
Ajedi32
12

Почему бы нам не сделать так, чтобы символ вертикальной табуляции (VT, ASCII 11) служил для указания использования упругих табуляторов? Он не имеет смысла ни в одном из основных языков программирования, но все же анализируется как допустимый пробел во всех из них, AFAIK.

Это будет означать, что использование упругих табуляторов больше не является внешним соглашением (например, «этот файл был отформатирован с помощью эластичных табов, пожалуйста, включите их»), а вы выбираете что-то в каждом конкретном случае.

Существующие текстовые редакторы обычно отображают глиф или один пробел вместо вертикальной табуляции. Это не идеал, но небольшая цена, IMO.

Ричард Нельсон
источник
10

Они не упомянуты, потому что они не реализованы в большинстве IDE текстовых редакторов; это новинка, мало используемая в проекте.

Пространства были использованы для разработки программ еще со времен перфокарт. Пришли вкладки, и кто-то явно подумал, что это хорошая идея (они ошиблись: p).

В те дни, когда большинство современных редакторов могут автоматически преобразовывать табуляции в пробелы ... они довольно бессмысленны.

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

TZHX
источник
Я очистил комментарии, когда они опускались в оскорбление.
ChrisF
1
Просто подумал, что укажу, что главная причина, по которой мне нравится идея упругих табуляторов, заключается не в том, что она решает проблему табуляции в сравнении с пробелами, а в поведении, показанном в GIF в первоначальном вопросе; автоматическое, безболезненное выравнивание. Плюс, для различий VCS есть дополнительное преимущество, что в этом примере не было никаких изменений пробелов.
Ajedi32
«Необходимость установить еще один инструмент ...» - не достаточно хороший аргумент ... Как будто уже недостаточно инструментов, используемых.
Milind R
@MilindR Считаете ли вы это достаточно хорошим аргументом или нет, это причина, по которой (в то время три года назад) меня это не интересовало. Использование большого количества инструментов, которые делают что-то полезное, не является причиной для добавления другого, который действительно ничего не добавляет к вашей среде.
TZHX
Подобные установки объясняют, почему такие компании, как MS, решают заставить пользователей использовать новые UX ... Я не могу понять, что произойдет, если такое же отношение будет применено к переходу с дискет на диск>.
Milind R
4

Я думаю, что они нашли бы много пользы, если бы IDE поддерживали их (Microsoft!). Как только люди обнаружат, что они могут шлепнуть свои цветочные ящики сбоку и сделать их хорошо читаемыми, они это сделают. Вы можете добавить больше комментариев к исходному коду внезапно (что может быть только хорошо).

Я полагаю, мы могли бы также добавить «всплывающие подсказки» к списку «было бы хорошо, если бы ...», чтобы ваши большие блоки комментариев можно было спрятать и легко просматривать при необходимости. Возможно, мы могли бы также иметь блоки комментариев, которые составляют часть документации (не вещи типа sandcastle, надлежащие читаемые пользователем фрагменты документации, которые были встроены в код, а не только заголовки методов)

Недостатки: это может привести к тому, что исходные различия будут выглядеть плохо, если группа строк будет выглядеть так, как будто они были изменены, когда действительно была изменена только 1 (если редактор сохранил файл с вкладками, преобразованными в пробелы). Или, если эластичная вкладка была реализована с одним символом (или, более вероятно, с 2 вкладками), тогда просмотр вашего источника за пределами редактора может выглядеть плохо.

Я думаю, что мне нравится идея, хотя «вкладка табуляции» в конце строки эластизирует блок комментариев и выстраивает все комментарии в последующих строках (которые имеют интервал между двумя вкладками) соответственно.

gbjbaanb
источник
3

Вот как я это вижу: если бы большинство популярных инструментов уже поддерживали эластичные таб-стопы, многие люди использовали бы их. То же самое произошло с режимом навигации / редактирования vi, подсветкой синтаксиса и позже с Intellisense. В каждом случае устоявшаяся мудрость заключалась в том, что она бесполезна или не нужна, но она была реализована и взлетела.

Эластичные таб-стопы, конечно, оказывают сравнительно небольшое влияние. Большинство людей достаточно довольны существующим положением вещей, поэтому им все равно. Подобные рассуждения применимы ко многим ситуациям, в которых некоторые люди просто довольны тем, что у них есть, и не видят причин переключаться на что-то более продвинутое. Другими словами, самая большая проблема с упругими таб-стопами такая же, как и для почти любой другой хорошей идеи: она должна набирать обороты.

Но это не означает, что функция не может быть принята постепенно. Каждый отдельный язык программирования принимался постепенно, хотя всей команде требуется новый компилятор и новая среда IDE, чтобы начать использовать его. То же самое верно для каждой аппаратной архитектуры и многих других примеров. Это также не тот случай, когда отсутствие интеграции с существующими инструментами является ограничителем показа: то же самое относится, например, к «унифицированному формату diff», который постепенно заменял ранее менее читаемый формат, который, тем не менее, понимали автоматизированные инструменты. (например, патч). Эти инструменты были обновлены с течением времени.

Я ценю проблемы взаимодействия, о которых упоминали другие, но, несмотря на них, наверняка найдутся команды (вроде моей), которые примут это без колебаний, во всей нашей полноте. Внешние инструменты, такие как дифференцирование, слияние и т. Д., Изначально не будут поддерживать его, но мы сделаем все возможное, чтобы поставщики включили эту функцию. Это то, как прогресс всегда был достигнут. Это требует некоторых усилий для временного переходного периода, но, в конце концов, оно того стоит.

Timwi
источник
Аргумент C против C ++ выглядит немного ошибочным. Хотя это может быть правдой, но это относится к «некоторым людям» (как вы правильно сказали), есть очевидные причины придерживаться C или отдавать предпочтение C ++ в зависимости от ситуации. Размер среды выполнения C ++ является одним из них, по умолчанию.
Хайлем
Я с хайлем. Ваша точка зрения была бы более обоснованной без сравнения C-vs.-C ++. Это совершенно разные языки. На мой взгляд, C предназначен для системного программирования и другой низкоуровневой работы, где вам нужно много контроля (например, виртуальная машина). C ++ больше подходит для приложений среднего уровня, где абстракция полезна для управления сложностью (пространства имен, контейнеры и алгоритмы STL, шаблоны), но производительность по-прежнему остается проблемой (игры являются наиболее заметным примером).
Джон Перди
@haylem: Спасибо за отзыв. Я удалил ссылку на C / C ++.
Тимви
@JonPurdy: Спасибо за отзыв. Я удалил ссылку на C / C ++.
Тимви
2

Самая большая проблема, с которой я столкнулся, это непоследовательный интервал в документации. Я знаю, как программист, я был бы раздражен, увидев цикл или оператор if со «стандартным» отступом, а затем заметив при различных отступах. Я лично знаю, что мне нравится видеть все свои фигурные скобки, выстроенные по всей документации, а не только в блоке кода, который я рассматриваю.

В целом, я думаю, что это хорошая идея, но лично мне бы это не понравилось.

Falcon165o
источник
1

Я только что испробовал реализацию эластичных табов-стопов в jEdit, которая удивительно хорошо работает с языками программирования, с которыми я знаком (в первую очередь с HTML / XML и C-подобными языками). Однако, с помощью кода Python, он выглядит так (пробелы используются вместо вкладок для иллюстрации выравнивания):

def foo(x):
             '''<1 tab before the docstring.
No tab       <tab
No tab       <tab
             <tab  <another tab
             <tab  <another tab
             <tab'''
             if 1 or 2:    #<Tab before this comment
                           yield True

Для такого языка, как Python, который основан на пробелах, это нарушит условия сделки, если вы не отключите функциональность, предоставляемую эластичными табуляции. Редакторы, такие как Vim и Emacs, упрощают отключение большинства видов функций, если вы знаете название опции и как ее отключить, но для кода, подобного приведенному выше, потребуется отключить эту функцию.

Тем не менее, он отлично подходит для x86 ASM, C, C ++, Go, XML, HTML и других, которые не так сильно зависят от пробелов:

import (
    "fmt"    // We love formatting functions.
    "io"     // Because I/O is useful.
    "os"     // Can't open a file without os.Open!
)

type Foo struct {
    Field1              int          // This is properly aligned
    ReallyLongField2    string       // with this.
    privateField        io.Reader    // Elastic tabstops are great for Go.
}

Я скажу, что диалекты Лиспа, такие как Scheme, имеют свои собственные соглашения, которые также заставляют упругие табуляции отображать «некрасивый» код. Если я изменю настройки табуляции в соответствии с соглашением из 2 столбцов и вставлю табуляции в необычных местах (между функцией и ее аргументами):

(let loop ((n 1))
  (if  (> n 10)
        '()
        (cons  n
               (loop (+ n 1)))))

по сравнению с более читабельным:

(let loop ((n 1))
  (if (> n 10)
      '()
      (cons n
            (loop (+ n 1)))))

Конечно, этот не так плох, как пример Python, но он определенно снижает читабельность кода. Хотя мне очень нравится функциональность при кодировании на чем-то вроде C # или C ++, я ненавижу эту функциональность при кодировании на языке, таком как Python или Scheme, где пробелы являются функциональными и / или визуально полезными. Эластичные табуляции были созданы специально для того, чтобы быть полезными, не требуя отдельной утилиты отступов, но очевидно, что она предназначена не для всех языков программирования.


источник
0

Emacs уже обрабатывает отступы при наличии закрытых скобок и автоматически выравнивает wilma с fred . Я понятия не имею, почему Eclipse не делает то же самое. Хорошо, у меня есть идея, но она не является обязательной.

Вы можете заставить Emacs выровнять комментарий тоже без особых проблем, но AFAIK никто, кроме вас, никогда не хотел этого.

Кевин Клайн
источник
2
Я могу только интерпретировать ваше последнее предложение как троллинг, поскольку, очевидно, по крайней мере еще один парень хотел, чтобы он был достаточно чертовски хорош для создания хорошо аргументированной страницы, реализации Java и GIF, чтобы показать, почему это хорошо. Если вы прочитаете ответы, то обнаружите, что Ник тоже не одинок. Ой, подожди, посмотри здесь тоже.
Роман Старков
Кстати, Emacs переопределяет отступ wilmaпри внесении изменений, таких как изменение длины имени функции? Если это так, это довольно близко к тому, что делают упругие таб-стопы.
Роман Старков
@romkyns: Я не хочу быть троллинг, я просто имел в виду , что я никогда не видел , что стиль комментария отступов в в EMACS. Обычно EMACS не переопределяет несколько строк при вводе, но это тоже можно изменить.
Кевин Клайн