There, I fixed it (with rope)
05AB1E, 38 37 25 bytes
Saved 10 bytes with suggestions from Magic Octopus Urn and another byte changing output format.
Outputs a list of strings.
Footer pretty prints.
'ÙºUζεDÇ¥<)ζε`FX¬sÀU}J]Jζ
Try it online!
Explanation
'ÙºU # store the string "rope" in variable X
ζ # transpose input
ε ] # for each transposed row
D )ζ # zip the row with
Ç¥< # the decremented deltas of its character codes
ε # for each pair of [letter, delta-1]
`F } # delta-1 times do:
X¬ # get the first letter of X (originally "rope")
sÀU # rotate the letters left by 1 and store in X
J # join the rope-letter to the current row-letter
J # join to list of strings (the new columns)
ζ # transpose
Jelly, 21 bytes
ZµOI’R“¡nⱮ»ṁż@"µF€z⁶Y
Try it online!
Explanation
ZµOI’R“¡nⱮ»ṁż@"µF€z⁶Y Main Link
Z Transpose the input so the columns are now rows
µ New monadic chain
O [Vectorizing] Convert each letter to its character code
I [Vectorizing] Get the differences (gap size)
’ [Vectorizing] Add one
R [Vectorizing] Range from 1 .. x
ṁ Mold the string into the ranges
“¡nⱮ» "rope"
ż@" Vectorizing zip the rope strings with the original string (place ropes in gaps)
µ New monadic chain
F€ Flatten Each
z⁶ Zip and fill with spaces
Y Join on newlines for output
-1 byte thanks to Mr. Xcoder
-2 bytes thanks to Erik the Outgolfer
Python 2, 197 194 bytes
def f(s):
r='ROPE'*len(`s`)*9;x=[]
for i in zip(*s):
x+='',
for c,C in zip(i,i[1:]+(' ',)):l=(C>c)*(ord(C)+~ord(c));x[-1]+=c+r[:l];r=r[l:]
print zip(*['%*s'%(-max(map(len,x)),s)for s in x])
Try it online!
- -3 bytes thanks to ovs