Postgres: modify existing search_path (preserve current values)
SELECT set_config('search_path', 'fred,'||current_setting('search_path'), false);


The false says it's not a transaction-LOCAL setting.

For the bonus question, you can store the value in a custom setting:

SELECT set_config('tmp.search_path', current_setting('search_path'), false);


From version 9.2 on, you don't even have to define this setting in postgresql.conf.