End the tabs versus space war
Vim, 37, 34, 33, 32 bytes
:%s/\t/ /g|%norm ^hr/hv0r*r/
Try it online!
Note that this requires a trailing carriage return (enter) in vim, although not in the online interpreter.
This uses the V interpreter because it's backwards compatible. A very straightforward solution.
Here's a gif that lets you see the solution happen in real time. This uses a slightly older version, and I added some extra keystrokes to make it run slower so you can see what happens:
And here is the explanation of how it works:
:%s/\t/ /g "Replace every tab with 4 spaces
| "AND
%norm "On every line:
^ " Move to the first non-whitespace char
h " Move one character to the left. If there is none, the command will end here.
r/ " Replace it with a slash
h " Move to the left
v0 " Visually select everything until the first column
r* " Replace this selection with asterisks
r/ " Replace the first character with a slash
Perl, 41 bytes
s,␉, ,g;s,^ ( +),/@{[$1=~y| |*|r]}/,
Run with the -p
flag, like so:
perl -pe 's,␉, ,g;s,^ ( +),/@{[$1=~y| |*|r]}/,'
# ↑ └───────────────────┬───────────────────┘
# 1 byte 40 bytes
Replace ␉
by a tab (in Bash, try typing Control-V Tab.)
Cheddar, 60 57 56 bytes
Saved 3 bytes thanks to @Conor O'Brien
@.sub(/\t/g," "*4).sub(/^ +/gm,i->"/"+"*"*(i.len-2)+"/")
I wish Cheddar had better string formatting.
Try it online!
Explanation
This is a function. @
is a represents functionized property (e.g. ruby's &:
) letting you do things like: `ar.map(@.head(-1))
@ // Input
.sub( /\t/g, " "*4) // Replace tabs with four spaces
.sub(
/^ +/gm, // Regex matches leading spaces
i -> // i is the matched leading spaces
"/"+ // The / at the beginning
"*"*(i.len-2)+ // Repeat *s i-2 times
"/" // The / at the end
)
If you aren't familiar with regex the:
/^ +/gm
this basically matched one or more (+
) spaces () at the beginning (
^
) of every (g
) line (m
).