jQuery Plugin options
I am writing (my first) jQuery plugin.


Congratulations!


  The user can provide a JSON object to configure the plugin when they initialise it.


Terminology is wrong here. JSON is the transport format that looks like a JS object, but serialized into a string. What you use is just a JS object. They look the same because JSON was modeled after the JS literal notation, which (historically) was easily "unserialized" (turned back into an object) with eval. Proper parsers came in later on.

//check to see if options are provided and extend if required.
$.fn.hide_and_peek.custom = function(){
    if(typeof options === "undefined"){
        return $.fn.hide_and_peek.custom;
    }else{
        return $.fn.extend($.fn.hide_and_peek.custom,options);
    }
}();

//merge defaults and custom options
var oOptions = $.fn.extend({}, $.fn.hide_and_peek.defaults, $.fn.hide_and_peek.custom);


So I assume custom is another level of options, maybe set during setup and globally for all instances of the plugin. You don't need to check if it's undefined. You can just merge it in. jQuery will take care of it being undefined and will just skip over it. 

// Last will take precedence
var oOptions = $.fn.extend({}, defaults, custom, options);