Zimbabwe lost two early wickets but recovered to finish 126 for two at the close on the second day of the second Test on Monday in reply to Sri Lanka's first-innings total of 504.
Brian Chari and Craig Ervine were both 60 not out as Zimbabwe fought back after a poor start when they slumped to 17 for two but the hosts still trail by 378 runs.
Sri Lanka, who won a closely contested first Test last week, went from 290 for five overnight to being dismissed just before tea with Asela Gunaratne completing a maiden test century.
Dhanajaya de Silva was before caught and bowled by Zimbabwe skipper Graeme Cremer for 127.
Gunaratne, playing his second Test, made 116 and was the last man out.
He was on 91 when the ninth wicket went down and had to watch as No. 11 Lahiru Kumara fended off the Zimbabwe bowlers before reclaiming the strike and moving to three figures.
Sri Lanka’s stand-in captain Rangana Herath took the wickets of Tino Mawoyo and Hamilton Masakadza in the same over as Zimbabwe’s openers again failed to get their team off to a solid start.
Karunaratne century gives Sri Lanka huge lead
Kohli is leading from the front for all of us: Rahane
Aus captain Smith on what triggered Perth Test loss
Australia seal T20 series in Dilshan's farewell
Anderson cleared to join England squad for India series