you could use wp_parse_args() to merge your arguments into the default query
// Define the default query args
global $wp_query;
$defaults = $wp_query->query_vars;
// Your custom args
$args = array('cat'=>-4);
// merge the default with your custom args
$args = wp_parse_args( $args, $defaults );
// query posts based on merged arguments
query_posts($args);
although, i think the more elegant route is using the pre_get_posts() action. this modifies the query before the query is made so that the query isn’t run twice.
check out:
http://codex.wordpress.org/Custom_Queries#Category_Exclusion
based on that example to exclude category 4 from the index i’d put this in your functions.php:
add_action('pre_get_posts', 'wpa_44672' );
function wpa_44672( $wp_query ) {
//$wp_query is passed by reference. we don't need to return anything. whatever changes made inside this function will automatically effect the global variable
$excluded = array(4); //made it an array in case you need to exclude more than one
// only exclude on the home page
if( is_home() ) {
set_query_var('category__not_in', $excluded);
//which is merely the more elegant way to write:
//$wp_query->set('category__not_in', $excluded);
}
}