#help_index "DolDoc/Output;StdOut/DolDoc"

public U0 DocPutKey(CDoc *doc, I64 ch=0, I64 sc=0)
{//PutKey(ch,sc) at doc insert pt, cur_entry.
    I64          i, x, y;
    CDoc        *m;
    CDocEntry   *doc_ce;
    U8          *st, *st2;
    Bool         unlock;

    if (!doc && !(doc = DocPut) || doc->doc_signature != DOC_SIGNATURE_VAL)
        return;
    if (doc->user_put_key && (*doc->user_put_key)(doc, doc->user_put_data, ch, sc))
        return;
    unlock = DocLock(doc);
    if (!Bt(doldoc.clean_scan_codes, sc.u8[0]))
        doc->flags |= DOCF_UNDO_DIRTY;
    DocCaptureUndo(doc);
    if (Bt(char_bmp_printable, ch) && !(sc & (SCF_CTRL | SCF_ALT)))
    {
        if (sc & SCF_KEY_DESC)
        {
            st = Char2KeyName(ch, FALSE);
            KeyDescSet("Char  /'%s'", st);
            Free(st);
        }
        else
            EdCharIns(ch, sc, doc);
    }
    else
    {
        doc_ce = doc->cur_entry;
        x  =doc->x;
        y = doc->y;
        if (sc & SCF_ALT)
            switch (ch)
            {
                case CH_BACKSPACE: //<CTRL-H>
                    if (!(sc & (SCF_SHIFT | SCF_CTRL)))
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Edit/Undo");
                        else
                            DocUndoRestore(doc);
                    }
                    break;
            }
        else
            switch (ch)
            {
                case 0:
                    switch (sc.u8[0])
                    {
                        case SC_CURSOR_DOWN:
                            if (!(sc & SCF_CTRL))
                            {
                                if (sc & SCF_KEY_DESC)
                                {
                                    if (sc & SCF_SHIFT)
                                        KeyDescSet("Edit/Cursor Down, Sel");
                                    else
                                        KeyDescSet("Edit/Cursor Down");
                                }
                                else
                                    EdLineDown(doc, sc);
                                break;
                            }
                            else
                                sc &= ~SCF_CTRL;
//Fall Through to SC_END
                        case SC_END:
                            if (!(sc & SCF_CTRL))
                            {
                                if (sc & SCF_KEY_DESC)
                                {
                                    if (sc & SCF_SHIFT)
                                        KeyDescSet("Edit/GoTo Doc End, Sel");
                                    else
                                        KeyDescSet("Edit/GoTo Doc End");
                                }
                                else
                                {
                                    while (doc_ce != doc)
                                    {
                                        BEqual(&doc_ce->type, DOCEt_SEL, sc & SCF_SHIFT);
                                        doc_ce = doc->cur_entry = doc_ce->next;
                                    }
                                    doc->cur_col = doc_ce->min_col;
                                    DocFormBwd(doc);
                                }
                            }
                            break;

                        case SC_CURSOR_UP:
                            if (!(sc & SCF_CTRL))
                            {
                                if (sc & SCF_KEY_DESC)
                                {
                                    if (sc & SCF_SHIFT)
                                        KeyDescSet("Edit/Cursor Up, Sel");
                                    else
                                        KeyDescSet("Edit/Cursor Up");
                                }
                                else
                                    EdLineUp(doc, sc);
                                break;
                            }
                            else
                                sc &= ~SCF_CTRL;
//Fall Through to SC_HOME
                        case SC_HOME:
                            if (!(sc & SCF_CTRL))
                            {
                                if (sc & SCF_KEY_DESC)
                                {
                                    if (sc & SCF_SHIFT)
                                        KeyDescSet("Edit/GoTo Top of Doc, Sel");
                                    else
                                        KeyDescSet("Edit/GoTo Top of Doc");
                                }
                                else
                                {
                                    if (doc_ce == doc)
                                        doc_ce = doc_ce->last;
                                    while (doc_ce != doc)
                                    {
                                        BEqual(&doc_ce->type, DOCEt_SEL, sc & SCF_SHIFT);
                                        doc_ce = doc->cur_entry = doc_ce->last;
                                    }
                                    doc_ce = doc->cur_entry = doc->head.next;
                                    doc->cur_col = doc_ce->min_col;
                                    DocFormFwd(doc);
                                }
                            }
                            break;

                        case SC_PAGE_DOWN:
                            if (!(sc & SCF_CTRL))
                            {
                                if (sc & SCF_KEY_DESC)
                                {
                                    if (sc & SCF_SHIFT)
                                        KeyDescSet("Edit/Page Down, Sel");
                                    else
                                        KeyDescSet("Edit/Page Down");
                                }
                                else
                                {
                                    i = doc_ce->y + doc->win_task->win_height - 1;
                                    if (doc_ce->type_u8 == DOCT_HEX_ED)
                                        i += doc->cur_col / 3 / doc_ce->hex_ed_width;
                                    while (doc_ce != doc &&
                                          (doc_ce->type_u8 != DOCT_HEX_ED && doc_ce->y < i ||
                                           doc_ce->type_u8 == DOCT_HEX_ED &&
                                           doc_ce->y + doc->cur_col / 3 / doc_ce->hex_ed_width < i))
                                    {
                                        EdLineDown(doc, sc);
//paranoid check for stuck on same node
                                        if (doc->cur_entry == doc_ce && doc_ce->type_u8 != DOCT_HEX_ED)
                                            break;
                                        doc_ce = doc->cur_entry;
                                    }
                                }
                            }
                            break;

                        case SC_PAGE_UP:
                            if (!(sc & SCF_CTRL))
                            {
                                if (sc & SCF_KEY_DESC)
                                {
                                    if (sc & SCF_SHIFT)
                                        KeyDescSet("Edit/Page Up, Sel");
                                    else
                                        KeyDescSet("Edit/Page Up");
                                }
                                else
                                {
                                    i = doc_ce->y - (doc->win_task->win_height - 1);
                                    if (doc_ce->type_u8 == DOCT_HEX_ED)
                                        i += doc->cur_col / 3 / doc_ce->hex_ed_width;
                                    while (doc_ce->last != doc &&
                                           (doc_ce->type_u8 != DOCT_HEX_ED && doc_ce->y>i ||
                                            doc_ce->type_u8 == DOCT_HEX_ED &&
                                            doc_ce->y + doc->cur_col / 3 / doc_ce->hex_ed_width > i) &&
                                           doc_ce->y != doc->head.next->y)
                                    {
                                        EdLineUp(doc, sc);
//paranoid check for stuck on same node
                                        if (doc->cur_entry == doc_ce && doc_ce->type_u8 != DOCT_HEX_ED)
                                            break;
                                        doc_ce = doc->cur_entry;
                                    }
                                }
                            }
                            break;

                        case SC_CURSOR_LEFT:
                            if (sc & SCF_KEY_DESC)
                            {
                                if (sc & SCF_CTRL)
                                    KeyDescSet("Edit/GoTo Start of Line");
                                else
                                {
                                    if (sc & SCF_SHIFT)
                                        KeyDescSet("Edit/Cursor Left, Sel");
                                    else
                                        KeyDescSet("Edit/Cursor Left");
                                }
                            }
                            else
                                EdCursorLeft(doc, sc);
                            break;

                        case SC_CURSOR_RIGHT:
                            if (sc & SCF_KEY_DESC)
                            {
                                if (sc & SCF_CTRL)
                                    KeyDescSet("Edit/GoTo End of Line");
                                else
                                {
                                    if (sc & SCF_SHIFT)
                                        KeyDescSet("Edit/Cursor Right, Sel");
                                    else
                                        KeyDescSet("Edit/Cursor Right");
                                }
                            }
                            else
                                EdCursorRight(doc, sc);
                            break;

                        case SC_DELETE:
                            if (!(sc & SCF_CTRL))
                            {
                                if (sc & SCF_KEY_DESC)
                                {
                                    if (sc & SCF_SHIFT)
                                        KeyDescSet("Edit/Cut To Clip");
                                    else
                                        KeyDescSet("Char  /Delete");
                                }
                                else
                                {
                                    if (sc & SCF_SHIFT)
                                        ClipCut(doc);
                                    else
                                        EdCharDel(doc);
                                }
                            }
                            break;

                        case SC_INS:
                            if (sc & (SCF_SHIFT | SCF_CTRL) != (SCF_SHIFT | SCF_CTRL))
                            {
                                if (sc & SCF_KEY_DESC)
                                {
                                    if (sc & SCF_SHIFT)
                                        KeyDescSet("Edit/Paste Clip");
                                    else if (sc & SCF_CTRL)
                                        KeyDescSet("Edit/Copy to Clip");
                                    else
                                        KeyDescSet("Edit/Toggle Overstrike");
                                }
                                else
                                {
                                    if (sc & SCF_SHIFT)
                                        ClipPaste(doc);
                                    else if (sc & SCF_CTRL)
                                        ClipCopy(doc);
                                    else
                                        doc->flags ^= DOCF_OVERSTRIKE;
                                }
                            }
                            break;

                        case SC_F11:
                        case SC_F12:
                        case SC_F1...SC_F10:
                            if (sc & SCF_CTRL)
                            {
                                if (sc & SCF_KEY_DESC)
                                {
                                    if (sc & SCF_SHIFT)
                                        KeyDescSet("Cmd /Src Code of Sym");
                                    else
                                        KeyDescSet("Edit/Autocomplete Sym");
                                }
                                else
                                {
                                    DocUnlock(doc);
                                    if (AutoComplete(ON))
                                    {
                                        if (sc & SCF_SHIFT)
                                        {
                                            if (sc.u8[0] == SC_F11)
                                                ACMan(11, Fs);
                                            else if (sc.u8[0] == SC_F12)
                                                ACMan(12, Fs);
                                            else
                                                ACMan(sc.u8[0]-SC_F1 + 1, Fs);
                                        }
                                        else
                                        {
                                            if (sc.u8[0] == SC_F11)
                                                ACFillIn(11);
                                            else if (sc.u8[0] == SC_F12)
                                                ACFillIn(12);
                                            else
                                            ACFillIn(sc.u8[0] - SC_F1 + 1);
                                        }
                                    }
                                    DocLock(doc);
                                }
                            }
                            else
                            {
                                switch (sc.u8[0])
                                {
                                    case SC_F1:
                                        if (sc & SCF_KEY_DESC)
                                        {
                                            if (sc & SCF_SHIFT)
                                                KeyDescSet("Cmd /About");
                                            else
                                                KeyDescSet("Cmd /Help");
                                        }
                                        else
                                        {
                                            if (sc & SCF_SHIFT)
                                                Ed("::/Doc/AboutZealOS.DD");
                                            else
                                                Ed("::/Doc/HelpIndex.DD");
                                        }
                                        break;

                                    case SC_F2:
                                        if (sc & SCF_KEY_DESC)
                                        {
                                            if (sc & SCF_SHIFT)
                                                KeyDescSet("Edit/Play Macro");
                                            else
                                                KeyDescSet("Edit/Macro");
                                        }
                                        else
                                        {
                                            DocUnlock(doc);
                                            if (sc & SCF_SHIFT)
                                            {
                                                if (TaskValidate(sys_macro_task))
                                                    MessagePostWait(sys_macro_task, MESSAGE_KEY_DOWN_UP, CH_SHIFT_ESC, 0);
                                                SysMacroStripKey(&sys_macro_head, ch, sc);
                                                PlaySysMacro;
                                            }
                                            else
                                                EdMacroUtil;
                                            DocLock(doc);
                                        }
                                        break;

                                    case SC_F3:
                                        if (sc & SCF_KEY_DESC)
                                        {
                                            if (sc & SCF_SHIFT)
                                                KeyDescSet("Edit/Find Last");
                                            else
                                                KeyDescSet("Edit/Find Next");
                                        }
                                        else
                                        {
                                            doc->find_replace->scan_fwd = !(sc & SCF_SHIFT);
                                            EdFindNext(doc);
                                        }
                                        break;

                                    case SC_F4:
                                        if (sc & SCF_KEY_DESC)
                                        {
                                            if (sc & SCF_SHIFT)
                                                KeyDescSet("Cmd /Insert Directory Name");
                                            else
                                                KeyDescSet("Cmd /Insert FileName");
                                        }
                                        else
                                        {
                                            DocUnlock(doc);
                                            if (sc & SCF_SHIFT)
                                                st = PopUpPickDir;
                                            else
                                                st = PopUpPickFile;
                                            DocLock(doc);
                                            if (st)
                                            {
                                                DocPrintPartial(doc, "%s", st);
                                                Free(st);
                                            }
                                        }
                                        break;

                                    case SC_F5:
                                        if (sc & SCF_KEY_DESC)
                                        {
                                            if (sc & SCF_SHIFT)
                                                KeyDescSet("Cmd /System Include");
                                            else
                                                KeyDescSet("Cmd /Run (Execute)");
                                        }
                                        else
                                        {
                                            if (st2 = DocEntryLink(doc, doc_ce))
                                            {
                                                st = DocLinkFile(st2);
                                                Free(st2);
                                            }
                                            else
                                            {
                                                if (DriveIsWritable)
                                                {
                                                    DocWrite(doc);
                                                    st = StrNew(doc->filename.name);
                                                }
                                                else
                                                    if (PopUpCancelOk(ST_WARN_ST "Drive not writable.\nCompile file stored on drive?"))
                                                        st = StrNew(doc->filename.name);
                                                    else
                                                        break;
                                            }
                                            if (st2 = DirFile(st, "Run", "ZC"))
                                            {
                                                if (FileFind(st2))
                                                {
                                                    Free(st);
                                                    st = st2;
                                                }
                                                else
                                                    Free(st2);
                                            }
                                            if (st)
                                            {
                                                if (sc & SCF_SHIFT)
                                                    SysFile(st);
                                                else
                                                    PopUpFile(st);
                                                Free(st);
                                            }
                                        }
                                        break;

                                    case SC_F6:
                                        if (sc & SCF_KEY_DESC)
                                            KeyDescSet("Cmd /God Song");
                                        else
                                            GodSong;
                                        break;

                                    case SC_F7:
                                        if (sc & SCF_KEY_DESC)
                                        {
                                            if (sc & SCF_SHIFT)
                                                KeyDescSet("Cmd /God Passage");
                                            else
                                                KeyDescSet("Cmd /God Word");
                                        }
                                        else
                                        {
                                            FifoU8Flush(god.fifo);
                                            GodBitsInsert(GOD_GOOD_BITS, KbdMouseEventTime >> GOD_BAD_BITS);
                                            if (sc & SCF_SHIFT)
                                                GodBiblePassage;
                                            else
                                                GodWord;
                                        }
                                        break;
                                }
                            }
                            break;
                    }
                    break;

                case CH_CTRLA:
                    if (!(sc & SCF_SHIFT))
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Edit/Save As");
                        else if (DocWrite(doc, TRUE) && (st = FileNameAbs(doc->filename.name)))
                        {
                            DirContextDel(doc->filename.dirc);
                            doc->filename.dirc = DirContextNew(st);
                            Free(st);
                        }
                    }
                    break;

                case CH_CTRLB:
                    if (!(sc & SCF_SHIFT))
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Cmd /Toggle Border");
                        else
                            WinBorder(Bt(&doc->win_task->display_flags, DISPLAYf_NO_BORDER), doc->win_task);
                    }
                    break;

                case CH_CTRLC:
                    if (!(sc & SCF_SHIFT))
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Edit/Copy to Clip");
                        else
                            ClipCopy(doc);
                    }
                    break;

                case CH_CTRLD:
                    if (!(sc & SCF_SHIFT))
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Cmd /File Manager");
                        else
                        {
                            DocUnlock(doc);
                            FileMgr;
                            DocLock(doc);
                        }
                    }
                    break;

                case CH_CTRLF:
                    if (sc & SCF_SHIFT)
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Cmd /Search Files");
                        else
                            FindWiz;
                    }
                    else
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Edit/Find & Replace");
                        else
                            EdFindReplace(doc);
                    }
                    break;

                case CH_CTRLG:
                    if (!(sc & SCF_SHIFT))
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Edit/GoTo Line Num");
                        else
                            EdGoToLine(doc);
                    }
                    break;

                case CH_BACKSPACE: //<CTRL-H>
                    if (sc & SCF_KEY_DESC)
                        KeyDescSet("Char  /Back Space");
                    else
                    {
                        DocCaptureUndo(doc);
                        doc_ce = doc->cur_entry;
                        if (doc->cur_col <= doc_ce->min_col)
                        {
                            doc_ce = doc->cur_entry = doc_ce->last;
                            if (doc_ce !=  doc && doc_ce->type_u8 == DOCT_SOFT_NEW_LINE)
                                doc_ce = doc->cur_entry = doc_ce->last;
                            if (doc_ce == doc || doc_ce->type_u8 == DOCT_PROMPT)
                            {
                                doc_ce = doc->cur_entry = doc_ce->next;
                                doc->cur_col = doc_ce->min_col;
                            }
                            else
                            {
                                doc->cur_col = doc_ce->max_col;
                                if (doc->cur_col > doc_ce->min_col)
                                    doc->cur_col--;
                                EdCharDel(doc);
                            }
                        }
                        else
                        {
                            doc->cur_col--;
                            EdCharDel(doc);
                        }
                    }
                    break;

                case CH_CTRLI:
                    if (sc.u8[0] != SC_TAB)
                    {
                        if (sc & SCF_SHIFT)
                        {
                            if (sc & SCF_KEY_DESC)
                                KeyDescSet("Dol /Unindent 2");
                            else
                                DocPrint(doc, "$ID,-2$");
                        }
                        else
                        {
                            if (sc & SCF_KEY_DESC)
                                KeyDescSet("Dol /Indent 2");
                            else
                                DocPrint(doc, "$ID,2$");
                        }
                    }
                    break;

                case '\n':
                    if (sc & SCF_KEY_DESC)
                    {
                        if (sc & SCF_SHIFT)
                            KeyDescSet("Char  /Return");
                        else
                            KeyDescSet("Char  /Page Break");
                    }
                    else
                        EdCharIns(ch, sc, doc);
                    break;

                case CH_CTRLK:
                    if (sc & SCF_SHIFT)
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Dol /Blinking Text Off");
                        else
                            DocPrint(doc, "$BK,0$");
                    }
                    else
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Dol /Blinking Text On");
                        else
                            DocPrint(doc, "$BK,1$");
                    }
                    break;

                case CH_CTRLL:
                    if (sc & SCF_SHIFT)
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Cmd /Code Tools");
                        else
                        {
                            DocUnlock(doc);
                            EdCodeTools(doc);
                            DocLock(doc);
                        }
                    }
                    else
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Cmd /Insert Text Widgets Wizard");
                        else
                        {
                            DocUnlock(doc);
                            EdInsWidgetWiz;
                            DocLock(doc);
                        }
                    }
                    break;

                case CH_CTRLM:
                    if (sc & SCF_SHIFT)
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Cmd /Personal Notes");
                        else
                            Ed("~/PersonalNotes.DD");
                    }
                    else
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Cmd /Personal Menu");
                        else
                        {
                            m = DocRead("~/PersonalMenu.DD");
                            DocMenu(m);
                            DocDel(m);
                        }
                    }
                    break;

                case CH_CTRLO:
                    if (sc & SCF_SHIFT)
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Edit/Collapse");
                        else
                            DocCollapse(TRUE, doc);
                    }
                    else
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Edit/Uncolapse");
                        else
                            DocCollapse(FALSE, doc);
                    }
                    break;

                case CH_CTRLP:
                    if (doc->flags & (DOCF_SUPERSCRIPT_MODE | DOCF_SUBSCRIPT_MODE))
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Dol /Toggle Super or Sub script");
                        else
                        {
                            DocPrint(doc, "$SY,0$");
                            doc->flags &= ~(DOCF_SUPERSCRIPT_MODE | DOCF_SUBSCRIPT_MODE);
                        }
                    }
                    else if (sc & SCF_SHIFT)
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Dol /Toggle Subscript");
                        else
                        {
                            DocPrint(doc, "$SY,3$");
                            doc->flags |= DOCF_SUBSCRIPT_MODE;
                        }
                    }
                    else
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Dol /Toggle Superscript");
                        else
                        {
                            DocPrint(doc, "$SY,-3$");
                            doc->flags |= DOCF_SUPERSCRIPT_MODE;
                        }
                    }
                    break;

                case CH_CTRLQ:
                    break;

                case CH_CTRLR:
                    if (!(sc & SCF_SHIFT))
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Cmd /Sprite Graphic Resource");
                        else
                            if (!(doc->flags & DOCF_FORM) && !(doc->flags & (DOCF_PLAIN_TEXT | DOCF_PLAIN_TEXT_TABS)))
                            {
                                DocUnlock(doc);
                                if (doc_ce->type_u8 == DOCT_SPRITE)
                                    EdSpriteEd(doc);
                                else
                                    EdSpriteIns(doc);
                                DocLock(doc);
                            }
                    }
                    break;

                case CH_CTRLS:
                    if (sc & SCF_SHIFT)
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Edit/Toggle AutoSave");
                        else
                            LBtc(&doc->flags, DOCf_AUTO_SAVE);
                    }
                    else
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Edit/Save");
                        else
                        {
                            if (DriveIsWritable)
                            {
                                DocWrite(doc);
                            }
                            else
                                PopUpOk(ST_ERR_ST "Drive not writable.\nCannot save file.");
                        }

                    }
                    break;

                case CH_CTRLT:
                    if (sc & SCF_SHIFT)
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Edit/Single Entry Toggle Plain Text");
                        else if (!(doc->flags & DOCF_FORM))
                            DocEntryToggle(doc);
                    }
                    else
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Edit/Toggle Plain Text Display");
                        else if (!(doc->flags & DOCF_FORM))
                            DocFlagsToggle(doc, DOCF_PLAIN_TEXT);
                    }
                    break;

                case CH_CTRLU:
                    if (sc & SCF_SHIFT)
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Dol /Underline Off");
                        else
                            DocPrint(doc, "$UL,0$");
                    }
                    else
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Dol /Underline On");
                        else
                            DocPrint(doc, "$UL,1$");
                    }
                    break;

                case CH_CTRLV:
                    if (!(sc & SCF_SHIFT))
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Edit/Paste Clip");
                        else
                            ClipPaste(doc);
                    }
                    break;

                case CH_CTRLW:
                    if (sc & SCF_SHIFT)
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Dol /Word Wrap Off");
                        else
                            DocPrint(doc, "$WW,0$");
                    }
                    else
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Dol /Word Wrap On");
                        else
                            DocPrint(doc, "$WW,1$");
                    }
                    break;

                case CH_CTRLX:
                    if (!(sc & SCF_SHIFT))
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Edit/Cut To Clip");
                        else
                            ClipCut(doc);
                    }
                    break;

                case CH_CTRLY:
                    if (!(sc & SCF_SHIFT))
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Edit/Delete Line");
                        else
                            EdLineDel(doc);
                    }
                    break;

                case CH_CTRLZ:
                    if (sc & SCF_SHIFT)
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Dol /Inverted Text Off");
                        else
                            DocPrint(doc, "$IV,0$");
                    }
                    else
                    {
                        if (sc & SCF_KEY_DESC)
                            KeyDescSet("Dol /Inverted Text On");
                        else
                            DocPrint(doc, "$IV,1$");
                    }
                    break;

                case '0'...'9':
                    if (sc & SCF_CTRL)
                    {
                        if (sc & SCF_KEY_DESC)
                        {
                            if (sc & SCF_SHIFT)
                                KeyDescSet("Cmd /Word Definition");
                            else
                                KeyDescSet("Edit/Autocomplete Word");
                        }
                        else
                        {
                            if (AutoComplete(ON))
                            {
                                DocUnlock(doc);
                                if (sc & SCF_SHIFT)
                                    ACDDef(ch - '0', Fs);
                                else
                                    ACDFillin(ch - '0');
                                DocLock(doc);
                            }
                        }
                    }
                    break;

                case '[':
                    if (sc & SCF_CTRL)
                    {
                        if (sc & SCF_SHIFT)
                        {
                            if (sc & SCF_KEY_DESC)
                                KeyDescSet("Edit/GoTo matching brace");
                            else
                                EdFindPaired(doc, '}', '{', FALSE);
                        }
                        else
                        {
                            if (sc & SCF_KEY_DESC)
                                KeyDescSet("Edit/GoTo matching bracket");
                            else
                                EdFindPaired(doc, ']', '[', FALSE);
                        }
                    }
                    break;

                case ']':
                    if (sc & SCF_CTRL)
                    {
                        if (sc & SCF_SHIFT)
                        {
                            if (sc & SCF_KEY_DESC)
                                KeyDescSet("Edit/GoTo matching brace");
                            else
                                EdFindPaired(doc, '{', '}', TRUE);
                        }
                        else
                        {
                            if (sc & SCF_KEY_DESC)
                                KeyDescSet("Edit/GoTo matching bracket");
                            else
                                EdFindPaired(doc, '[', ']', TRUE);
                        }
                    }
                    break;
            }
    }
    if (unlock)
        DocUnlock(doc);
    if (!(doc->flags & DOCF_DONT_SWAP_OUT))
        Yield;
}

Bool KDDocPutKey(I64 ch, I64 scan_code)
{
    CDoc *doc;

    if (doc = DocPut)
        DocPutKey(doc, ch, scan_code);

    return FALSE;
}