config_hook functionality
As far as I understand config_hook should allow me to update configuration immediately before a function is run. So this example should pass:
``` python
from sacred import Experiment

ex = Experiment('hello_config')

@ex.config
def cfg():
    recipient = "world"
    message = "Hello {}!".format(recipient)

@ex.config_hook 
def hook(config, command_name, logger):
    config.update({'recipient': 'me'})
    return config
    
@ex.automain
def main(recipient, message):
    assert recipient == 'me'
``` 

Furthermore it seems that the run_config_hooks statement here https://github.com/IDSIA/sacred/blob/d5d1a1a763c83ffc1cd88e60ff9df79499b3b875/sacred/initialize.py#L385-L416 has no effect as config is not updated in place there.
diff --git a/sacred/initialize.py b/sacred/initialize.py
index b04e521..7f24e9d 100755
--- a/sacred/initialize.py
+++ b/sacred/initialize.py
@@ -102,13 +102,13 @@ class Scaffold(object):
 
         self.get_config_modifications()
 
-    def run_config_hooks(self, config, config_updates, command_name, logger):
+    def run_config_hooks(self, config, command_name, logger):
         final_cfg_updates = {}
         for ch in self.config_hooks:
             cfg_upup = ch(deepcopy(config), command_name, logger)
             if cfg_upup:
                 recursive_update(final_cfg_updates, cfg_upup)
-        recursive_update(final_cfg_updates, config_updates)
+        recursive_update(final_cfg_updates, self.config_updates)
         return final_cfg_updates
 
     def get_config_modifications(self):
@@ -382,8 +382,9 @@ def create_run(experiment, command_name, config_updates=None,
         # update global config
         config = get_configuration(scaffolding)
         # run config hooks
-        config_updates = scaffold.run_config_hooks(config, config_updates,
-                                                   command_name, run_logger)
+        config_hook_updates = scaffold.run_config_hooks(
+            config, command_name, run_logger)
+        recursive_update(scaffold.config, config_hook_updates)
 
     # Phase 4: finalize seeding
     for scaffold in reversed(list(scaffolding.values())):
diff --git a/tests/test_experiment.py b/tests/test_experiment.py
index 5fd902c..2966c15 100755
--- a/tests/test_experiment.py
+++ b/tests/test_experiment.py
@@ -254,3 +254,22 @@ def test_option_hooks_without_options_arg_raises(ex):
         @ex.option_hook
         def invalid_hook(wrong_arg_name):
             pass
+
+
+def test_config_hook_updates_config(ex):
+
+    @ex.config
+    def cfg():
+        a = 'hello'
+
+    @ex.config_hook
+    def hook(config, command_name, logger):
+        config.update({'a': 'me'})
+        return config
+
+    @ex.main
+    def foo():
+        pass
+
+    r = ex.run()
+    assert r.config['a'] == 'me'
['sacred/initialize.py', 'tests/test_experiment.py']