EDITOR: changed editor tabs to have their own editor mode (#1372)

This commit is contained in:
G4mingJon4s 2024-06-13 04:19:40 +02:00 committed by GitHub
parent 805ca06922
commit bec6e82d7f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 34 additions and 18 deletions

@ -42,6 +42,18 @@ export const MiscPage = (): React.ReactElement => {
</>
}
/>
<OptionSwitch
checked={Settings.MonacoDefaultToVim}
onChange={(newValue) => (Settings.MonacoDefaultToVim = newValue)}
text="Enable Vim as default editor"
tooltip={
<>
This setting is only used when opening a file through ways that do not determine the editor mode. Using
'nano' or 'vim' will set the editor mode for the specified files, while 'ls' will open the file using the
the value from this setting.
</>
}
/>
</GameOptionsPage>
);
};

@ -12,16 +12,25 @@ export class OpenScript {
hostname: string;
lastPosition: Position;
model: ITextModel;
vimMode: boolean;
isTxt: boolean;
// TODO: Adding actual external update notifications for the OpenScript class
// hasExternalUpdate = false;
constructor(path: ContentFilePath, code: string, hostname: string, lastPosition: Position, model: ITextModel) {
constructor(
path: ContentFilePath,
code: string,
hostname: string,
lastPosition: Position,
model: ITextModel,
vimMode: boolean,
) {
this.path = path;
this.code = code;
this.hostname = hostname;
this.lastPosition = lastPosition;
this.model = model;
this.vimMode = vimMode;
this.isTxt = hasTextExtension(path);
}

@ -14,7 +14,6 @@ export interface Options {
fontSize: number;
fontLigatures: boolean;
wordWrap: WordWrapOptions;
vim: boolean;
cursorStyle: CursorStyle;
cursorBlinking: CursorBlinking;
}

@ -93,11 +93,6 @@ export function OptionsModal(props: OptionsModalProps): ReactElement {
</Select>
</div>
<div style={{ display: "flex", alignItems: "center" }}>
<Typography marginRight={"auto"}>Enable vim mode: </Typography>
<Switch onChange={(e) => props.onOptionChange("vim", e.target.checked)} checked={props.options.vim} />
</div>
<div style={{ display: "flex", alignItems: "center" }}>
<Typography marginRight={"auto"}>Font family: </Typography>
<TextField

@ -26,7 +26,7 @@ export interface ScriptEditorContextShape {
const ScriptEditorContext = React.createContext({} as ScriptEditorContextShape);
export function ScriptEditorContextProvider({ children, vim }: { children: React.ReactNode; vim: boolean }) {
export function ScriptEditorContextProvider({ children }: { children: React.ReactNode }) {
const [ram, setRAM] = useState("RAM: ???");
const [ramEntries, setRamEntries] = useState<string[][]>([["???", ""]]);
@ -76,7 +76,6 @@ export function ScriptEditorContextProvider({ children, vim }: { children: React
fontSize: Settings.MonacoFontSize,
fontLigatures: Settings.MonacoFontLigatures,
wordWrap: Settings.MonacoWordWrap,
vim: vim || Settings.MonacoVim,
cursorStyle: Settings.MonacoCursorStyle,
cursorBlinking: Settings.MonacoCursorBlinking,
});
@ -93,7 +92,6 @@ export function ScriptEditorContextProvider({ children, vim }: { children: React
Settings.MonacoCursorStyle = options.cursorStyle;
Settings.MonacoCursorBlinking = options.cursorBlinking;
Settings.MonacoWordWrap = options.wordWrap;
Settings.MonacoVim = options.vim;
}
return (

@ -44,7 +44,7 @@ function Root(props: IProps): React.ReactElement {
const rerender = useRerender();
const editorRef = useRef<IStandaloneCodeEditor | null>(null);
const { options, updateRAM, startUpdatingRAM, finishUpdatingRAM } = useScriptEditorContext();
const { updateRAM, startUpdatingRAM, finishUpdatingRAM } = useScriptEditorContext();
let decorations: monaco.editor.IEditorDecorationsCollection | undefined;
@ -194,6 +194,7 @@ function Root(props: IProps): React.ReactElement {
props.hostname,
new monaco.Position(0, 0),
makeModel(props.hostname, filename, code),
props.vim,
);
openScripts.push(newScript);
currentScript = newScript;
@ -375,7 +376,7 @@ function Root(props: IProps): React.ReactElement {
const { statusBarRef } = useVimEditor({
editor: editorRef.current,
vim: options.vim,
vim: currentScript !== null ? currentScript.vimMode : props.vim,
onSave: save,
onOpenNextTab,
onOpenPreviousTab,
@ -423,7 +424,7 @@ function Root(props: IProps): React.ReactElement {
// Called every time script editor is opened
export function ScriptEditorRoot(props: IProps) {
return (
<ScriptEditorContextProvider vim={props.vim}>
<ScriptEditorContextProvider>
<Root {...props} />
</ScriptEditorContextProvider>
);

@ -101,7 +101,7 @@ export const Settings = {
/** Whether to use font ligatures */
MonacoFontLigatures: false,
/** Whether to use Vim mod by default in the script editor */
MonacoVim: false,
MonacoDefaultToVim: false,
/** Word wrap setting for Script Editor. */
MonacoWordWrap: "off" as WordWrapOptions,
/** Control the cursor style*/

@ -24,6 +24,7 @@ import {
root,
} from "../../Paths/Directory";
import { isMember } from "../../utils/EnumHelper";
import { Settings } from "../../Settings/Settings";
export function ls(args: (string | number | boolean)[], server: BaseServer): void {
interface LSFlags {
@ -138,7 +139,7 @@ export function ls(args: (string | number | boolean)[], server: BaseServer): voi
content = server.scripts.get(fullPath)?.content ?? "";
}
const files = new Map<ContentFilePath, string>();
const options = { hostname: server.hostname };
const options = { hostname: server.hostname, vim: Settings.MonacoDefaultToVim };
files.set(fullPath, content);
Router.toPage(Page.ScriptEditor, { files, options });
}

@ -3,5 +3,5 @@ import { BaseServer } from "../../Server/BaseServer";
import { commonEditor } from "./common/editor";
export function nano(args: (string | number | boolean)[], server: BaseServer): void {
return commonEditor("nano", { args, server });
return commonEditor("nano", { args, server }, { vim: false });
}

@ -72,6 +72,7 @@ import { MathJaxContext } from "better-react-mathjax";
import { useRerender } from "./React/hooks";
import { HistoryProvider } from "./React/Documentation";
import { GoRoot } from "../Go/ui/GoRoot";
import { Settings } from "../Settings/Settings";
import { isBitNodeFinished } from "../BitNode/BitNodeUtils";
const htmlLocation = location;
@ -252,7 +253,7 @@ export function GameRoot(): React.ReactElement {
<ScriptEditorRoot
files={pageWithContext.files ?? new Map()}
hostname={pageWithContext.options?.hostname ?? Player.getCurrentServer().hostname}
vim={!!pageWithContext.options?.vim}
vim={pageWithContext.options === undefined ? Settings.MonacoDefaultToVim : pageWithContext.options.vim}
/>
);
break;

@ -89,7 +89,7 @@ export type PageWithContext =
| { page: SimplePage };
export interface ScriptEditorRouteOptions {
vim?: boolean;
vim: boolean;
hostname?: string;
}