public void Save(string postfix, bool rememberOpenedFiles)
    {
        SValue state = SValue.NewHash();

        if (mainForm.WindowState == FormWindowState.Maximized)
        {
            state["width"]  = SValue.NewInt(mainForm.RestoreBounds.Width);
            state["height"] = SValue.NewInt(mainForm.RestoreBounds.Height);
            state["x"]      = SValue.NewInt(mainForm.RestoreBounds.X);
            state["y"]      = SValue.NewInt(mainForm.RestoreBounds.Y);
        }
        else
        {
            state["width"]  = SValue.NewInt(mainForm.Width);
            state["height"] = SValue.NewInt(mainForm.Height);
            state["x"]      = SValue.NewInt(mainForm.Location.X);
            state["y"]      = SValue.NewInt(mainForm.Location.Y);
        }
        state["maximized"] = SValue.NewBool(mainForm.WindowState == FormWindowState.Maximized);
        if (rememberOpenedFiles)
        {
            {
                SValue openedTabs = state.SetNewList("openedTabs");
                foreach (Buffer buffer in mainForm.MainNest.buffers.list)
                {
                    SValue valueI = SValue.NewHash().With("fullPath", SValue.NewString(buffer.FullPath));
                    openedTabs.Add(valueI);
                    if (buffer == mainForm.MainNest.buffers.list.Selected)
                    {
                        state["selectedTab"] = valueI;
                    }
                }
            }
            if (mainForm.MainNest2 != null)
            {
                SValue openedTabs = state.SetNewList("openedTabs2");
                foreach (Buffer buffer in mainForm.MainNest2.buffers.list)
                {
                    SValue valueI = SValue.NewHash().With("fullPath", SValue.NewString(buffer.FullPath));
                    openedTabs.Add(valueI);
                    if (buffer == mainForm.MainNest2.buffers.list.Selected)
                    {
                        state["selectedTab2"] = valueI;
                    }
                }
            }
        }
        state["storage"]      = storage.Serialize();
        state["recently"]     = recently.Serialize();
        state["recentlyDirs"] = recentlyDirs.Serialize();
        state["bm"]           = EncodeGlobalBookmakrs();
        ValuesSerialize(state);
        state["commandHistory"]               = commandHistory.Serialize();
        state["findHistory"]                  = findHistory.Serialize();
        state["findInFilesHistory"]           = findInFilesHistory.Serialize();
        state["findInFilesTempFilter"]        = findInFilesTempFilter.Serialize();
        state["findInFilesTempCurrentFilter"] = SValue.NewString(findInFilesTempCurrentFilter.value);
        state["moveHistory"]                  = moveHistory.Serialize();
        state["replacePatternHistory"]        = replacePatternHistory.Serialize();
        state["replaceHistory"]               = replaceHistory.Serialize();
        state["goToLineHistory"]              = goToLineHistory.Serialize();
        state["findParams"] = findParams.Serialize();
        if (!string.IsNullOrEmpty(NullableCurrentDir))
        {
            state["currentDir"] = SValue.NewString(NullableCurrentDir);
        }
        state["showFileTree"]     = SValue.NewBool(mainForm.FileTreeOpened);
        state["fileTreeExpanded"] = mainForm.FileTree.GetExpandedTemp();
        state["helpPosition"]     = SValue.NewInt(helpPosition);
        state["viHelpPosition"]   = SValue.NewInt(viHelpPosition);
        SerializeSettings(ref state);
        File.WriteAllBytes(GetTempSettingsPath(postfix, AppPath.StartupDir), SValue.Serialize(state));
    }