         opts = defaults opts,
             format : required
             cb     : undefined
+        if @state != 'ready'
+            opts.cb?('not ready')
+            return
         salvus_client.exec
             path        : @path
             project_id  : @project_id

            @element.data("font_size", font_size)

    undo: () =>
        if not @syncstring.in_undo_mode()
            @_handle_dom_change()
        else if @dom.get(true) != @_last_dom  # expensive but I don't know how to handle this case otherwise since dirty checking so hard...

            @dom.on('save', @save)

    render_cursor: (account_id) =>
        if @state != 'ready'
            return
        if account_id == salvus_client.account_id
            return
        x = @syncstring._syncstring.get_cursors()?.get(account_id)
