# There, I fixed it (with rope)

## 05AB1E, 3837 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
O                    [Vectorizing] Convert each letter to its character code
I                   [Vectorizing] Get the differences (gap size)
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)
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