docs: def invoke_editor(before_editing, cluster_name):
      """Starts editor command to edit configuration in human readable format
  
      :param before_editing: human representation before editing
      :returns tuple of human readable and parsed datastructure after changes
      """
      editor_cmd = os.environ.get('EDITOR')
      if not editor_cmd:
          raise PatroniCtlException('EDITOR environment variable is not set')
  
      with temporary_file(contents=before_editing.encode('utf-8'),
                          suffix='.yaml',
                          prefix='{0}-config-'.format(cluster_name)) as tmpfile:
          ret = subprocess.call([editor_cmd, tmpfile])
          if ret:
              raise PatroniCtlException("Editor exited with return code {0}".format(ret))
  
          with codecs.open(tmpfile, encoding='utf-8') as fd:
              after_editing = fd.read()
  
          return after_editing, yaml.safe_load(after_editing)