I ended up doing it the messy lazy way:
padded.limits=function(limits, floor.lim=-Inf, ceiling.lim=Inf) {
ldiff=limits[2]-limits[1]
lmin=limits[1]
lmax=limits[2]
if (ldiff<=2){
lims=c(round(lmin-0.05,1),round(lmax+0.05,1)) } #round to 0.1
if (ldiff>2 & ldiff<=10){
lims=c(round(lmin-0.5),round(lmax+0.5)) }#round to 1
if (ldiff>10 & ldiff<=50){
lims=c(round((lmin-2.5)*2,-1)/2,round((lmax+2.5)*2,-1)/2) }#round to 5
if (ldiff>50 & ldiff<=100){
lims=c(round(lmin-5,-1),round(lmax+5,-1))} #round to 10
if (ldiff>100 & ldiff<=200){
lims=c(round((lmin-10)*5,-2)/5,round((lmax+10)*5,-2)/5) }#round to 20
if (ldiff>200 & ldiff<=500) {
lims=c(round((lmin-25)*2,-2)/2,round((lmax+25)*2,-2)/2) }#round to 50
if (ldiff>500) {
lims=c(round(lmin-50,-2)/2,round(lmax+50,-2)/2) }#round to 100
if (lims[1]<floor.lim) { lims[1]=floor.lim }
if (lims[2]>ceiling.lim) { lims[2]=ceiling.lim }
return(lims)}
## eg. ylim=padded.limits(limits,floor.lim=0)