弾性タブストップの欠点は何ですか?[閉まっている]


83

ここを見てください:タブとスペースの典型的な聖戦

弾性タブストップをご覧ください。すべての問題が解決し、非常に便利な新しい動作が多数追加されました。

弾性タブストップ

弾性タブストップは、タブ対スペースの議論でも言及されていますか?何故なの?弾力性のあるタブストップのアイデアには非常に深刻な欠点があり、誰もそれを人気のあるエディターに実装したことはありませんか?

編集:「なぜ彼らは言及されていない」にあまりにも重点を置いて謝罪します。それは本当に私が意図したものではありませんでした。その質問はおそらく話題外です。私が本当に言っているのは、明らかに有益なアイデアのより広範な採用を妨げるこの最大の欠点は何ですか?(すべてがすでにそれをサポートしている理想的な世界で)

(そこには、Microsoft Connectのリクエストすでにだ判明弾性タブストップのVisual Studioの実装は、およびEclipseの要求はあまりにも。プラスについて尋ねる質問があります弾性タブストップを実装する他のエディタは



11
「タブ対スペース」の議論では、これらのことは決して言及されていません。なぜなら、働くプログラマーがこれらのものを使用する方法はほとんどないからです。たぶん、Eclipse、VS、gvim、emacsの実装があれば、それは変わるかもしれません。
ポールトンブリン

2
私はこのアイデアが本当に好きですが、それが1か月ほど住んでいるときだけ、落とし穴が何であるかを本当に知っています。これまでのすべてのように、そこには、それはあなたが...期待していないもののないいくつかのケースであることが保証されている
クリス・バート・ブラウン

3
@ ChrisBurt-Brownそれは常にリスクです、はい。IntelliSenseにも落とし穴があります。たとえば、望まないときにテキストを置換するなどです。しかし、全体的に見て、C#のIntelliSenseは大きなファットウィンを獲得しています。
ローマンスターコフ

4
notepad ++でこれが欲しい...今すぐ欲しい
ベンブロッカ

回答:


32

聖戦は主観的

ニックの弾力性のあるタブストップは、多くの人々が実行可能なソリューションに同意するのに役立つ素晴らしいコンセプトですが、この聖戦を完全に終わらせることは非常に疑いますが、結局のところ、それは好みの問題であり、多くのプログラマーは動きません妥協の犠牲を払っても、この問題に関する彼らの立場から少し離れています。それが第一の理由でしょう。

たとえば、「スペース」側の多くの人は、適切なレンダリング(たとえば、SCMのWebビューで変更セットを表示する)のためにソフトウェアに追加のロジックが必要になるため、それを嫌います。

実装の問題

しかし、最も明白な理由はちょうどそのあるエントリへの技術的な障壁:それはだ根本的に異なる概念 IDEやテキストエディタでの年数(そうでない場合は数十年)のために実装されたものから。かなり異なる方法で行を処理するためにそれらの一部を書き直す必要があります。これは、行処理コードで深く緊密なカップリングを被る可能性の高い古いシステムや大きなシステムにとって困難です。ただし、ゼロから始める方がはるかに簡単です(NickのデモGotabwriterパッケージを考えてください)。

個人的な逸話として、私はしばらく前に作者に近づいて、見えているemacsのサポートがあるかどうかを尋ねたことを覚えています。この特定の場合、彼はこれが些細ではない理由としてこれに言及しました。また、この機能の実装と大衆への提供を支援するために、コミュニティからの支援を求めました。

私たちは十分気にしますか?

3番目の理由は、一部の開発者は問題にこだわっていず、努力をサポートするために余分なマイルを費やすことをあまり気にしていないからです。ほとんどの場合、spaces-vs-tabsの競合はビジネスのブロッカーではないため、問題の背後にあるドライブはそれほど多くありません。

あなたがそれを望むなら、あなたはそれのために戦わなければなりません。これは、オープンソースソフトウェアで実行可能です。そして、これらを十分に変更する場合、クローズドソースのものは、たとえそれが非常に小さい部分であっても、ユーザーベースの一部を失うリスクを負う必要があります。

それで、あなたがそれを望むならば、ニックに手を貸してください。


(トピック外)他の「これはすばらしいが非常にマイナーな」機能がVisual Studioのような製品にどのように組み込まれるのか、よく疑問に思う。チームの誰かが単に個人的な理由でそれを実装する時間を見つけたようです。たとえば、Visual Studioで一度複数の行入力することを考えてください。何万人もの人々がそれを求めたというわけではありませんが、私はむしろそれが好きです。
ローマンスターコフ

3
@romkyns:多くのことに関しては、静かなインサイダー1人か、門で叫ぶ千の声が必要です。
ヘイレム

35

多くの場合、ワードプロセッサを使用して、ワードの配置を制御する非表示の自動ルールを使用せずに、ドキュメントを思いどおりに表示する必要がありました。編集者がなぜそれらの単語をそこに置くことを主張しているのかを理解しようとして1秒を費やしたくありません。


11
私もこの感情に完全に同情します。そのようなルールも本当に私を苛立たせます。しかし、これは2つの点で異なります。1つ:タブストップと同じように、不要な場合は使用する必要はありません。同僚のテキストを使用する場合は、そのままにしておくことができます。2:弾性タブストップには隠されたルールはありませんが、明らかに明白なルールがあります。動作は完全に自然です。おそらく、テキスト内の任意の、通常は無関係な位置で発生する従来のタブストップよりもさらに自然です。これが、インデント以外にタブストップを使用する人がいない理由です。
ティムウィ

10
@Timwi:問題は欠点を列挙することでした。やった。
mhoran_psprep

14
GIFからは明らかではないかもしれませんが、「TAB」を押すと、後に来るものはすべて適切に垂直方向に整列して出力されるということが、関係する唯一の考えです。それはワードプロセッサのようなものではありません。私が投稿したリンクで実際のインタラクティブデモを試してみてください。
ローマンスターコフ

3
@mhoran_psprep:結構です。ご意見ありがとうございます。質問のさまざまな解釈を見ていました。この機能を使用して自分の欠点をリストしていますが、機能を導入することの欠点(つまり、必須ではなく使用可能にすること)についてだと思いました。
ティムウィ

27

これを聞いたのは初めてです。良いアイデアかどうかはわかりませんが、すでにコードを自動的にフォーマットするツール(インデントなど)があるので、ほとんど役に立たないようです。

vimで賢い弾性タブストップを開いて編集するとどうなりますか?タブは自動的にクリーンアップされますか、それとも混乱が残りますか?

私が見た主な欠点は、おそらく差分、バージョン管理を壊し、それらをサポートしていないエディターと互換性がないことです。それらをサポートするために多くのコード変更が行われる可能性があり、「コードをフォーマットするための別のタブ」機能よりも重要なことがあります。結局のところ、indentメモリが提供される場合、上記のすべてを行うすべてを使用できます。


9
なんと後ろ向きな態度。人々のお気に入りの古くて時代遅れのツールはまだ対処できないので、進歩はありません!(もちろん、皮肉なことに、これらのツール(vimなど)はオープンソースであるため、もしそれが本当に重要であれば、弾性タブ
ストップ

14
@Timwi:あなたは私が言っていたポイントを完全に失います。弾性タブストップを認識しない何かによってコードファイルが解析されるとどうなりますか?あなたは混乱に陥るか、彼らは対処できますか?バージョン管理と差分はどうですか?すべてのツールが$ featureをサポートすることを望むのは、たとえそれらのツールがオープンソースであっても非現実的です。
サルダスリオン

14
@Timwi:誰もが弾性タブストップがあなたが思っているほど素晴らしいと思うと思います。これは真実ではないかもしれません。
サルダスリオン

7
@Sardathrionは正しい。ウィンドウシステムを使用せずに* nixサーバーにリモート接続する必要があり、Vim / Emacs / Pico / Whateverでコードを調べる必要がある場合はどうなりますか?読みやすいメカニズムがあれば、それは問題ありません...そうでなければ悪夢になります。とにかく、弾性タブがそれほど有益であるという利点はありません。既にコードを自動フォーマットして、使用するIDEでどのように表示するかを確認できます。
リグ

7
バージョン管理ポイントは良いものです-人々が、変更中のコードからarbitrarily意的に離れたコード内のコメントの配置/フォーマットを静かに変更し始めるエディターに感謝するつもりはないと思います(OPのアニメーションのマゼンタセクションを参照してください) gif)。参照用の実装を用意しておくと便利ですが、これまでのところ、目立ったものはありません-emacsは既にいくつかの追加のキーストローク(おそらく良いことです)でこれの多くを既に実行しています。
mcmcc

13

正直に言うと、最初の興奮を乗り越えてしまえば、そんなに役立つとは思いません。たとえば、とにかく行末のコメントは好きではありません。コメントは常に別の行に書きます。それにより、弾性タブの主な用途が失われます。

その後も、もちろんそれらを使用して、関数の引数(およびパラメーター)と割り当ての長いリストを調整できます。

しかし、前者については、すべての引数を1レベルだけインデントする傾向があり、それは完全にうまく機能します。

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

そして、私は表示されませんどのように変更する必要が。

割り当ての調整に関しては、私はそれを行いません。私は割り当ての周りに単一のスペースを置きます、それだけです。また、私は多くの課題を一緒にクラスター化しない傾向があるため、読みやすさの問題はめったにありません。

要約すると、弾性タブは絶対に持ってゼロ私のために有用であることを。これはもちろん非常に個人的な好みですが、変化する可能性がありますが、うまく機能することがわかり、弾性タブのサポートの欠如は他の人が同じように考えているためだと思います。

エディターがそれらを実装する場合、私はまだそれらを使用しません。


感謝。とにかく行の先頭以外を揃えないので、必要に応じて可変幅フォントも喜んで使用できるようです。実際、Visual Studioはこれをかなりよくサポートしており、読みやすさの向上は素晴らしいことです。
ローマンスターコフ

1
@romkyns我々はそれについての過程で議論持っていた1、私はいくつかの時間のためのプログラミングのためのプロポーショナルフォントを使用してみましたが。結論としては、インデントを無視した場合でも、等幅フォントがよりよく機能するということでした。それとは別に、私は現在Vimとコンソールでのみ仕事をしていますが、どちらもプロポーショナルフォントをサポートすることはほとんどありません。
コンラッドルドルフ

1
@romkynsとはいえ、これらの問題は解決可能です(または、プログラミング用に設計されたプロポーショナルフォントで解決される可能性もあります)。しかし、私はまだ必要性を本当に見ていません。
コンラッドルドルフ

13

欠点の1つは、隣接する行のタブストップをグループ化するため、ある行グループで整列してから次の行でインデントが必要な場合に機能しないことです。

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

私が欲しかったもの:

def foo( bar,
         xyzzy ):
    wibble()

中括弧言語の場合、これは問題ではないかもしれません。通常は、アニメーションのように開き括弧を独自の行に置くことでこれを解決できますが、空白に敏感な言語の場合、これはすぐに痛みになります。そして、スペースを使用することに頼らざるを得なくなります。


同意した。Nickの実装は、Pythonのような言語ではまったくうまく機能しません。
ローマンスターコフ

3
なぜこれが機能しないのですか?これは基本的な制限ではなく、アルゴリズムは言語を認識する必要があるだけです。しかし、今日でもある程度これは事実です。たとえば、Vimは言語に応じて異なるインデントルールを定義します。これにより、Pythonのインデントに簡単に対応できます。
コンラッドルドルフ

1
@KonradRudolphいいえ、できませんでした。弾性タブストップの描画は、テキストのグループを自動的にインデント/インデント解除する機能です。単純な例の1つは、「if」ステートメントの終了です。ステートメントを終了するためインデントを解除しようとしますが、「スマート」な弾性タブストップにより、上記の1行または2行のインデントも解除することになります。など...そして、テキストを明示的にグループ化する必要がある場合、そのポイントは何ですか?インデントを自分で修正するよりも、それを行うのは
大変

1
@Izkata手動でインデントを解除すると、現在のグループが単純に終了するはずです。弾性タブストップを使用してインデントを手動で制御するのはなぜですか?そうしないので、アルゴリズムは、実行すると、上記のブロックのインデントを解除するのではなく、ブロックを終了することを知っています。
コンラッドルドルフ

1
ああ、良い点。うーん...多分引数を二重インデントできますか?それでは、wibble()インデントが1つしかないため、関数の引数と整列しませんか?
Ajedi32 14

12

なぜ垂直タブ文字(VT、ASCII 11)を弾性タブストップの使用を示すのに役立たせないのですか?主流のプログラミング言語では目的を果たしませんが、それらすべての有効な空白として解析されます。

これは、エラスティックタブストップの使用が外部化された慣習ではなくなったことを意味します(たとえば、「このファイルはエラスティックタブストップでフォーマットされています。オンにしてください」)。

既存のテキストエディタでは、通常、垂直タブの代わりにグリフまたは単一のスペースが表示されます。これは理想的ではありませんが、少額の支払いが必要です、IMO。


10

テキストエディタのほとんどのIDEには実装されていないため、これらのドキュメントは言及されていません。それらは、プロジェクトで実際にほとんど使用されない目新しいものです。

パンチカードの時代からプログラミングのレイアウトにスペースが使用されてきました。タブが登場し、明らかに誰かが自分が良いアイデアだと思った(彼らは間違っていた:p)。

最近のほとんどの編集者がタブをスペースに自動的に変換できる時代には...かなり無意味です。

タブとスペースのように些細なことを処理するためにさらに別のツールをインストールしなければならないことは確かに私にとって魅力的ではなく、同僚の大部分にとってはそうだとは思わない。


彼らがinto辱に陥っていたので、私はコメントをクリアしました。
ChrisF

1
私が指摘したいと思いましたが、弾性タブストップのアイデアが好きな主な理由は、タブ対スペースの問題を解決するためではなく、元の質問のGIFに示されている動作のためです。痛みのない自動アライメント。さらに、VCS diffの場合、この例では空白の変更が不要であるという追加の利点があります。
Ajedi32 14

「さらに別のツールをインストールすること...」は十分な議論ではありません...すでに十分なツールが使用されていないかのように。
Milind R 14

@MilindR十分な議論であるかどうかにかかわらず、それが(3年前の時点で)私がこれに興味を持たない理由です。何か便利なことをする多くのツールが使用されているからといって、実際に環境に何も追加しない別のツールを追加する理由にはなりません。
TZHX

このような態度は、MSのような企業がユーザーを新しいUXに強制することを決定する理由です...同じ態度がフロッピー-> CD移行に適用された場合、どうなるかを考えるとぞっとします。
Milind R

4

IDEがそれらをサポートしていれば、彼らは多くの用途を見つけると思います(Microsoft!)。ひとたびフラワーボックスを横に倒して、見やすく読みやすくすることができたら、彼らはそうするでしょう。突然ソースコードにコメントが追加される可能性があります(これは良いことです)。

「次の場合は...」というリストにコメント「ツールチップ」を追加することもできるので、必要に応じて大きなコメントブロックを非表示にして簡単に表示できます。ドキュメントの一部を形成するコメントブロックを含めることもできます(サンドキャッスル型のものではなく、メソッドヘッダーだけでなく、コードに埋め込まれた適切なユーザー可読ドキュメントスニペット)

短所:本当に1だけが変更されたときに行の束が変更されたように見えると、ソースdiffが悪く見える場合があります(エディターがタブをスペースに変換してファイルを保存した場合)。または、エラスティックタブが1文字(または2つのタブストップ)で実装されている場合、エディターの外部でソースを表示すると見た目が悪くなる可能性があります。

ただし、行末の「タブタブ」はコメントブロックを伸縮させ、それに応じて後続の行(ダブルタブ間隔)にすべてのコメントを並べます。


3

私がそれを見る方法は次のとおりです。人気のあるツールのほとんどが既に弾性タブストップをサポートしていれば、多くの人がそれらを使用するでしょう。viのナビゲート/編集モード、構文の強調表示、およびIntellisenseでも同じことが起こりました。いずれの場合でも、確立された知恵は、それは有用ではないか、必要ではないというものでしたが、実装されて、それが始まりました。

もちろん、弾性タブストップの影響は比較的小さくなります。ほとんどの人は現状に十分満足しているので気にしません。同様の推論は多くの状況に当てはまり、一部の人々は自分の持っているものに満足しているだけで、より高度なものに切り替える理由を見つけられません。言い換えれば、弾性タブストップの最大の問題は、他のほぼすべての良いアイデアと同じです。それは牽引力を得る必要があります。

しかし、それは、この機能を段階的に採用できないという意味ではありません。チーム全体で使用を開始するには新しいコンパイラと新しいIDEが必要ですが、すべてのプログラミング言語は段階的に採用されました。同じことは、すべてのハードウェアアーキテクチャと他の多くの例にも当てはまります。また、既存のツールとの統合の欠如が目を引くものではありません。たとえば、自動ツールで理解されていた以前の読みにくい形式を段階的に置き換えた「unified-diff形式」も同様です。 (パッチなど)。これらのツールは時間の経過とともにアップグレードされています。

他の人が言及した相互運用の問題に感謝しますが、それにもかかわらず、私たち全体でこれをthisすることなく採用するチーム(私のようなチーム)は確かに存在します。差分、マージなどの外部ツールは最初はサポートしていませんが、ベンダーにこの機能を含めるよう奨励する役割を果たします。これは常に進歩がなされてきた方法です。一時的な移行期間には多少の苦労が必要ですが、最終的には価値があります。


CとC ++の引数は少し見当違いです。確かにこれは「一部の人々」(あなたが正しく言ったように)の場合ですが、状況に応じてCに固執するかC ++を支持する明らかな理由があります。デフォルト設定では、それらの1つであるC ++ランタイムのサイズ。
ヘイレム

私はヘイレムと一緒です。あなたのポイントは、C対C ++の比較なしで、より健全です。それらはまったく異なる言語です。私の考えでは、Cは多くの制御(VMなど)が必要なシステムプログラミングやその他の低レベルの作業を目的としています。C ++は、抽象化が複雑さ(名前空間、STLコンテナーとアルゴリズム、テンプレート)を管理するのに役立つ中間レベルのアプリケーションに適していますが、パフォーマンスが依然として問題になります(ゲームが最も目に見える例です)。
ジョンパーディ

@haylem:フィードバックをありがとう。C / C ++への参照を削除しました。
ティムウィ

@JonPurdy:フィードバックをありがとう。C / C ++への参照を削除しました。
ティムウィ

2

私がそれに関して持つ最大の問題は、ドキュメント全体で一貫性のない間隔です。プログラマーとして、ループまたはifステートメントが「標準」インデントで表示されてから、さまざまなインデントで通知されることにイライラすることを知っています。個人的には、私が見ているコードのブロックだけでなく、ドキュメンテーション全体に中括弧が並んでいるのが好きです。

全体的には良いアイデアだと思いますが、個人的には好きではありません。


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のようなLisp方言には、弾力性のあるタブストップが「ugい」コードを表示させる独自の規約があると言います。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はすでに閉じられていない括弧の存在下でインデントを処理し、ウィルマを自動的にfredに揃えます。Eclipseが同じことをしない理由はわかりません。OK、アイデアはありますが、無料です。

Emacsにあまり問題なくコメントを揃えさせることもできますが、知る限り誰も望んでいません。


2
あなたの最後の文はトローリングとしてしか解釈できません。明らかに、少なくとも他の1人の男が、議論の余地のあるページ、Java実装、およびGIFを作成してそれが良い理由を示すのに十分なほどひどく欲しかったからです。答えを読むと、ニックも一人ではないことがわかります。ちょっと待って、こちら見てください
ローマンスターコフ

ところで、wilma関数名の長さを変更するなど、編集を行うとEmacsは再度インデントしますか?もしそうなら、それは伸縮性のあるタブストップがすることとかなり近いです。
ローマンスターコフ

@romkyns:私はちょうどことを意味し、トローリングことを意味するものではありませんでした私は Emacsでインデントコメントのスタイルを見たことがなかったです。一般に、EMACSは入力時に複数行を再インデントしませんが、変更することもできます。
ケビンクライン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.