• z3bra@lemmy.sdf.org
    link
    fedilink
    arrow-up
    1
    ·
    1 year ago

    Tabs for indent, spaces for alignment. This is the way, I can’t believe people are still fighting that ?

    • GuybrushThreepwo0d@programming.dev
      link
      fedilink
      arrow-up
      2
      ·
      1 year ago

      I used to think this way, at least when writing C++. But it’s objectively harder to do and convince other people to follow, especially if they can’t be bothered to change their environment to display tabs and spaces differently. It’s a losing battle so now I just do spaces when working with other people

    • realharo@lemm.ee
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      1 year ago

      Anything for indent (barely matters, as long as the editor forces it to stay consistent), and fuck alignment, just put things on a new line.

      • z3bra@lemmy.sdf.org
        link
        fedilink
        arrow-up
        2
        ·
        edit-2
        1 year ago
        struct Ident arr = [
        {
        .id
        = 0,
        .name
        = "Bob",
        .pubkey
        = "",
        .privkey
        = ""
        },
        {
        .id
        = 1,
        .name
        = "Alice",
        .pubkey
        = "",
        .privkey
        = ""
        }
        ];
        
        • realharo@lemm.ee
          link
          fedilink
          arrow-up
          1
          ·
          edit-2
          1 year ago

          Not like that, lol

          Just saying, instead of this monstrosity

          CreateOrderRequest(user,
                             productDetails,
                             pricingCalculator,
                             order => order.internalNumber)
          

          Just use

          CreateOrderRequest(
              user,
              ...
          

          Putting the first argument on a separate line.

          Same if you have an if using a bunch of and (one condition per line, first one on a new line instead of same line as the if) and similar situations.

          • z3bra@lemmy.sdf.org
            link
            fedilink
            arrow-up
            2
            ·
            edit-2
            1 year ago

            When I talk about alignment it’s not about function arguments, but values, “=” signs and such. You simply cannot use tabs for that because alignment must be fixed and indentation independent:

            CreateOrderRequest(
                user,
                productDetails     => order.detail,
                pricingCalculator  => DEFAULT_CALCULATOR,
                order              => order.internalNumber)
            
      • milo128@lemm.ee
        link
        fedilink
        arrow-up
        0
        ·
        1 year ago

        seconded on not aligning things. its the whole source of the problem in the first place and doesnt even serve a purpose

        • MajorHavoc@lemmy.world
          link
          fedilink
          arrow-up
          1
          ·
          1 year ago

          It does help with reducing thrashing between edits in git diffs. Or rather, opinionated autoformatters do, which is the only reason I bother with alignment.

    • zagaberoo@beehaw.org
      link
      fedilink
      arrow-up
      0
      ·
      1 year ago

      Then you lose the benefit of tabs: you can’t adjust the tab width without destroying alignment. So you end up with a confusing mix of characters for no benefit.

      Mixing them is the worst option.

      • z3bra@lemmy.sdf.org
        link
        fedilink
        arrow-up
        1
        ·
        1 year ago

        You might not understand how to do it properly so here’s the idea:

        Tabs will let you reach the indentation level of the current block, then from here, you’ll use spaces to align stuff property. Here’s an example, where >••• are tabs (I’m exaggerating alignment for the sake of the example) :

        >•••if (condition1 == true
        >••• || condition2 != false)
        >•••{
        >•••>•••struct ident people[] = [
        >•••>•••>•••{
        >•••>•••>•••>•••.name   = "bob",
        >•••>•••>•••>•••.pubkey = "value1",
        >•••>•••>•••},
        >•••>•••>•••{
        >•••>•••>•••>•••.name   = "alice",
        >•••>•••>•••>•••.pubkey = "value2",
        >•••>•••>•••}
        >•••>•••];
        >•••>•••secureConnection(people[0].name, people[0].pubkey,
        >•••>•••                 people[1].name, people[1].pubkey,
        >•••>•••                 CRYPTO_ALGO_DEFAULT);
        >•••}
        

        As you can see, everything will stay correctly aligned as long as it’s within the same block.

      • JackbyDev@programming.dev
        link
        fedilink
        English
        arrow-up
        0
        ·
        1 year ago

        You’re confusing using tabs for indentation and spaces for alignment with using tabs and spaces for indentation. This means each line starts with tabs. Next you optionally have spaces for alignment with previous lines. Then you have content (like code or comments). Because you never have a tab following a space the alignment is never destroyed by adjusting how wide a tabstop is.

          • JackbyDev@programming.dev
            link
            fedilink
            English
            arrow-up
            1
            ·
            1 year ago

            That example is using tabs for both indentation and alignment. The article you linked even says not using tabs for alignment is a solution.

            • Do not use tabs for alignment. In such case given example should look like:
            fun foo x =
            --->let val abs = if x > 0
            --->              then x
            --->              else -x
            --->in
            --->--->(* ... *)
            --->end