Index: emitter.c
===================================================================
--- emitter.c	(revision 231)
+++ emitter.c	(working copy)
@@ -359,6 +359,7 @@
     char *anchor_name = NULL;
     int indent = 0;
     long x = 0;
+    SyckLevel *parent;
     SyckLevel *lvl = syck_emitter_current_level( e );
     
     /*
@@ -386,6 +387,7 @@
         indent = lvl->spaces + e->indent;
     }
     syck_emitter_add_level( e, indent, syck_lvl_open );
+    parent = lvl;
     lvl = syck_emitter_current_level( e );
 
     /* Look for anchor */
@@ -402,6 +404,13 @@
         {
             char *an = S_ALLOC_N( char, strlen( anchor_name ) + 3 );
             sprintf( an, "&%s ", anchor_name );
+
+            /* Complex key */
+            if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1) {
+                syck_emitter_write( e, "? ", 2 );
+                parent->status = syck_lvl_mapx;
+            }
+
             syck_emitter_write( e, an, strlen( anchor_name ) + 2 );
             free( an );
 
@@ -996,6 +1005,17 @@
 {
     SyckLevel *parent = syck_emitter_parent_level( e );
     SyckLevel *lvl = syck_emitter_current_level( e );
+
+    /* complex key
+     * There should also be the check "&& style == seq_none",
+     * but unfortunately syck cannot parse flow collections as simple keys
+     * now, so we will make a complex key.
+     * Add the check when syck is able to parse "[]: foo" */
+    if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 ) {
+        syck_emitter_write( e, "? ", 2 );
+        parent->status = syck_lvl_mapx;
+    }
+
     syck_emit_tag( e, tag, "tag:yaml.org,2002:seq" );
     if ( style == seq_inline || ( parent->status == syck_lvl_imap || parent->status == syck_lvl_iseq ) ) {
         syck_emitter_write( e, "[", 1 );
@@ -1012,6 +1032,17 @@
 {
     SyckLevel *parent = syck_emitter_parent_level( e );
     SyckLevel *lvl = syck_emitter_current_level( e );
+
+    /* complex key
+     * There should also be the check "&& style == map_none",
+     * but unfortunately syck cannot parse flow collections as simple keys
+     * now, so we will make a complex key.
+     * Add the check when syck is able to parse "{}: foo". */
+    if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 ) {
+        syck_emitter_write( e, "? ", 2 );
+        parent->status = syck_lvl_mapx;
+    }
+
     syck_emit_tag( e, tag, "tag:yaml.org,2002:map" );
     if ( style == map_inline || ( parent->status == syck_lvl_imap || parent->status == syck_lvl_iseq ) ) {
         syck_emitter_write( e, "{", 1 );
@@ -1035,15 +1066,11 @@
             SyckLevel *parent = syck_emitter_parent_level( e );
 
             /* seq-in-map shortcut */
-            if ( parent->status == syck_lvl_map && lvl->ncount == 0 ) {
-                /* complex key */
-                if ( parent->ncount % 2 == 1 ) {
-                    syck_emitter_write( e, "?", 1 );
-                    parent->status = syck_lvl_mapx;
+            if ( parent->status == syck_lvl_mapx && lvl->ncount == 0 ) {
                 /* shortcut -- the lvl->anctag check should be unneccesary but
                  * there is a nasty shift/reduce in the parser on this point and
                  * i'm not ready to tickle it. */
-                } else if ( lvl->anctag == 0 ) { 
+                if ( parent->ncount % 2 == 0 && lvl->anctag == 0 ) {
                     lvl->spaces = parent->spaces;
                 }
             }
@@ -1078,15 +1105,6 @@
         {
             SyckLevel *parent = syck_emitter_parent_level( e );
 
-            /* map-in-map */
-            if ( parent->status == syck_lvl_map && lvl->ncount == 0 ) {
-                /* complex key */
-                if ( parent->ncount % 2 == 1 ) {
-                    syck_emitter_write( e, "?", 1 );
-                    parent->status = syck_lvl_mapx;
-                }
-            }
-
             /* map-in-seq shortcut */
             if ( lvl->anctag == 0 && parent->status == syck_lvl_seq && lvl->ncount == 0 ) {
                 int spcs = ( lvl->spaces - parent->spaces ) - 2;
@@ -1164,21 +1182,27 @@
         break;
 
         case syck_lvl_iseq:
-            syck_emitter_write( e, "]\n", 1 );
+            syck_emitter_write( e, "]", 1 );
+            if ( parent->status == syck_lvl_mapx ) {
+                syck_emitter_write( e, "\n", 1 );
+            }
         break;
 
         case syck_lvl_map:
             if ( lvl->ncount == 0 ) {
                 syck_emitter_write( e, "{}\n", 3 );
             } else if ( lvl->ncount % 2 == 1 ) {
-                syck_emitter_write( e, ":\n", 1 );
+                syck_emitter_write( e, ":", 1 );
             } else if ( parent->status == syck_lvl_mapx ) {
                 syck_emitter_write( e, "\n", 1 );
             }
         break;
 
         case syck_lvl_imap:
-            syck_emitter_write( e, "}\n", 1 );
+            syck_emitter_write( e, "}", 1 );
+            if ( parent->status == syck_lvl_mapx ) {
+                syck_emitter_write( e, "\n", 1 );
+            }
         break;
 
         default: break;
