From 88cc9f3096dc506eae1164c169407864fbd54d89 Mon Sep 17 00:00:00 2001 From: sawka Date: Tue, 11 Apr 2023 23:50:42 -0700 Subject: [PATCH] implement branch/venv in prompt --- src/linecomps.tsx | 36 +++++++++++++++++++---- src/main.tsx | 8 ++--- src/model.ts | 4 +-- src/sh2.less | 75 ++++++++++++++++++++++++++++------------------- src/types.ts | 14 ++++----- 5 files changed, 87 insertions(+), 50 deletions(-) diff --git a/src/linecomps.tsx b/src/linecomps.tsx index 29fdb938..356d72d8 100644 --- a/src/linecomps.tsx +++ b/src/linecomps.tsx @@ -8,7 +8,7 @@ import localizedFormat from 'dayjs/plugin/localizedFormat'; import {If, For, When, Otherwise, Choose} from "tsx-control-statements/components"; import {GlobalModel, GlobalCommandRunner, Session, Cmd, ScreenLines, Screen, getTermPtyData} from "./model"; import {windowWidthToCols, windowHeightToRows, termHeightFromRows, termWidthFromCols} from "./textmeasure"; -import type {LineType, CmdDataType, FeStateType, RemoteType, RemotePtrType, RenderModeType, RendererContext, RendererOpts, SimpleBlobRendererComponent, RendererPluginType, LineHeightChangeCallbackType, RendererModelInitializeParams, RendererModel} from "./types"; +import type {LineType, CmdDataType, RemoteType, RemotePtrType, RenderModeType, RendererContext, RendererOpts, SimpleBlobRendererComponent, RendererPluginType, LineHeightChangeCallbackType, RendererModelInitializeParams, RendererModel} from "./types"; import cn from "classnames"; import {TermWrap} from "./term"; import type {LineContainerModel} from "./model"; @@ -27,6 +27,17 @@ type OMap = mobx.ObservableMap; type RendererComponentProps = {screen : LineContainerModel, line : LineType, width : number, staticRender : boolean, visible : OV, onHeightChange : LineHeightChangeCallbackType, collapsed : boolean}; type RendererComponentType = { new(props : RendererComponentProps) : React.Component }; +function getShortVEnv(venvDir : string) : string { + if (isBlank(venvDir)) { + return ""; + } + let lastSlash = venvDir.lastIndexOf("/"); + if (lastSlash == -1) { + return venvDir; + } + return venvDir.substr(lastSlash+1); +} + function makeFullRemoteRef(ownerName : string, remoteRef : string, name : string) : string { if (isBlank(ownerName) && isBlank(name)) { return remoteRef; @@ -60,7 +71,7 @@ function replaceHomePath(path : string, homeDir : string) : string { return path; } -function getCwdStr(remote : RemoteType, state : FeStateType) : string { +function getCwdStr(remote : RemoteType, state : Record) : string { if (state == null || isBlank(state.cwd)) { return "~"; } @@ -594,7 +605,7 @@ class Line extends React.Component<{screen : LineContainerModel, line : LineType } @mobxReact.observer -class Prompt extends React.Component<{rptr : RemotePtrType, festate : FeStateType}, {}> { +class Prompt extends React.Component<{rptr : RemotePtrType, festate : Record}, {}> { render() { let rptr = this.props.rptr; if (rptr == null || isBlank(rptr.remoteid)) { @@ -602,7 +613,8 @@ class Prompt extends React.Component<{rptr : RemotePtrType, festate : FeStateTyp } let remote = GlobalModel.getRemote(this.props.rptr.remoteid); let remoteStr = getRemoteStr(rptr); - let cwd = getCwdStr(remote, this.props.festate); + let festate = this.props.festate ?? {}; + let cwd = getCwdStr(remote, festate); let isRoot = false; if (remote && remote.remotevars) { if (remote.remotevars["sudo"] || remote.remotevars["bestuser"] == "root") { @@ -621,8 +633,22 @@ class Prompt extends React.Component<{rptr : RemotePtrType, festate : FeStateTyp if (remote && remote.remotecanonicalname) { remoteTitle = "connected to " + remote.remotecanonicalname; } + let cwdElem = ({cwd}); + let remoteElem = ([{remoteStr}]); + let rootIndicatorElem = ({isRoot ? "#" : "$"}); + let branchElem = null; + let pythonElem = null; + if (!isBlank(festate["PROMPTVAR_GITBRANCH"])) { + let branchName = festate["PROMPTVAR_GITBRANCH"]; + branchElem = ({branchName} ); + } + if (!isBlank(festate["VIRTUAL_ENV"])) { + let venvDir = festate["VIRTUAL_ENV"]; + let venv = getShortVEnv(venvDir); + pythonElem = ({venv} ); + } return ( - [{remoteStr}] {cwd} {isRoot ? "#" : "$"} + {remoteElem} {pythonElem}{branchElem}{cwdElem} {rootIndicatorElem} ); } } diff --git a/src/main.tsx b/src/main.tsx index 911f6c4e..80fb6416 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -8,7 +8,7 @@ import cn from "classnames"; import {debounce, throttle} from "throttle-debounce"; import {v4 as uuidv4} from "uuid"; import dayjs from "dayjs"; -import type {SessionDataType, LineType, CmdDataType, RemoteType, RemoteStateType, RemoteInstanceType, RemotePtrType, HistoryItem, HistoryQueryOpts, RemoteEditType, FeStateType, ContextMenuOpts, BookmarkType, RenderModeType, ClientMigrationInfo, LineFactoryProps} from "./types"; +import type {SessionDataType, LineType, CmdDataType, RemoteType, RemoteStateType, RemoteInstanceType, RemotePtrType, HistoryItem, HistoryQueryOpts, RemoteEditType, ContextMenuOpts, BookmarkType, RenderModeType, ClientMigrationInfo, LineFactoryProps} from "./types"; import type * as T from "./types"; import localizedFormat from 'dayjs/plugin/localizedFormat'; import {GlobalModel, GlobalCommandRunner, Session, Cmd, ScreenLines, Screen, riToRPtr, TabColors, RemoteColors} from "./model"; @@ -907,10 +907,10 @@ class CmdInput extends React.Component<{}, {}> { rptr = screen.curRemote.get(); } let remote : RemoteType = null; - let remoteState : FeStateType = null; + let feState : Record = null; if (ri != null) { remote = GlobalModel.getRemote(ri.remoteid); - remoteState = ri.festate; + feState = ri.festate; } let infoShow = inputModel.infoShow.get(); let historyShow = !infoShow && inputModel.historyShow.get(); @@ -942,7 +942,7 @@ class CmdInput extends React.Component<{}, {}> {
- +
diff --git a/src/model.ts b/src/model.ts index 7c6c5675..12ac77cf 100644 --- a/src/model.ts +++ b/src/model.ts @@ -5,7 +5,7 @@ import {debounce} from "throttle-debounce"; import {handleJsonFetchResponse, base64ToArray, genMergeData, genMergeDataMap, genMergeSimpleData, boundInt, isModKeyPress} from "./util"; import {TermWrap} from "./term"; import {v4 as uuidv4} from "uuid"; -import type {SessionDataType, LineType, RemoteType, HistoryItem, RemoteInstanceType, RemotePtrType, CmdDataType, FeCmdPacketType, TermOptsType, RemoteStateType, ScreenDataType, ScreenOptsType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, UIContextType, HistoryInfoType, HistoryQueryOpts, FeInputPacketType, TermWinSize, RemoteInputPacketType, FeStateType, ContextMenuOpts, RendererContext, RendererModel, PtyDataType, BookmarkType, ClientDataType, HistoryViewDataType, AlertMessageType, HistorySearchParams, FocusTypeStrs, ScreenLinesType, HistoryTypeStrs, RendererPluginType, WindowSize, ClientMigrationInfo, WebShareOpts, TermContextUnion, RemoteEditType, RemoteViewType, CommandRtnType} from "./types"; +import type {SessionDataType, LineType, RemoteType, HistoryItem, RemoteInstanceType, RemotePtrType, CmdDataType, FeCmdPacketType, TermOptsType, RemoteStateType, ScreenDataType, ScreenOptsType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, UIContextType, HistoryInfoType, HistoryQueryOpts, FeInputPacketType, TermWinSize, RemoteInputPacketType, ContextMenuOpts, RendererContext, RendererModel, PtyDataType, BookmarkType, ClientDataType, HistoryViewDataType, AlertMessageType, HistorySearchParams, FocusTypeStrs, ScreenLinesType, HistoryTypeStrs, RendererPluginType, WindowSize, ClientMigrationInfo, WebShareOpts, TermContextUnion, RemoteEditType, RemoteViewType, CommandRtnType} from "./types"; import {WSControl} from "./ws"; import {measureText, getMonoFontSize, windowWidthToCols, windowHeightToRows, termWidthFromCols, termHeightFromRows} from "./textmeasure"; import dayjs from "dayjs"; @@ -176,7 +176,7 @@ class Cmd { return this.data.get().cmdstr; } - getRemoteFeState() : FeStateType { + getRemoteFeState() : Record { return this.data.get().festate; } diff --git a/src/sh2.less b/src/sh2.less index 951f41c5..f4e80d3f 100644 --- a/src/sh2.less +++ b/src/sh2.less @@ -2352,50 +2352,65 @@ input[type=checkbox] { color: @term-bright-red; } -#main .term-prompt-remote { - color: @term-bright-green; - - &.color-green { - color: @term-bright-green; +#main .term-prompt { + i { + font-size: 12px; + margin-right: 3px; } - &.color-red { - color: @term-bright-red; + .term-prompt-branch { + color: @term-white; } - &.color-blue { - color: @term-bright-blue; - } - - &.color-yellow { - color: @term-bright-yellow; - } - - &.color-magenta { + .term-prompt-python { color: @term-bright-magenta; } - &.color-cyan { - color: @term-bright-cyan; + .term-prompt-remote { + color: @term-bright-green; + + &.color-green { + color: @term-bright-green; + } + + &.color-red { + color: @term-bright-red; + } + + &.color-blue { + color: @term-bright-blue; + } + + &.color-yellow { + color: @term-bright-yellow; + } + + &.color-magenta { + color: @term-bright-magenta; + } + + &.color-cyan { + color: @term-bright-cyan; + } + + &.color-white { + color: @term-bright-white; + } + + &.color-orange { + color: @tab-orange; + } } - &.color-white { - color: @term-bright-white; + .term-prompt-cwd { + color: @term-bright-green; } - &.color-orange { - color: @tab-orange; + .term-prompt-end { + color: @term-bright-green; } } -#main .term-prompt-cwd { - color: @term-bright-green; -} - -#main .term-prompt-end { - color: @term-bright-green; -} - #main .screen-tabs .screen-tab { &.color-green { color: @tab-black-text; diff --git a/src/types.ts b/src/types.ts index ebe6ac19..6a53af73 100644 --- a/src/types.ts +++ b/src/types.ts @@ -89,7 +89,7 @@ type RemoteType = { errorstr : string, installstatus : string, installerrorstr : string, - defaultfestate : FeStateType, + defaultfestate : Record, connectmode : string, autoinstall : boolean, remoteidx : number, @@ -117,15 +117,11 @@ type RemoteInstanceType = { screenid : string, remoteownerid : string, remoteid : string, - festate : FeStateType, + festate : Record, remove? : boolean, } -type FeStateType = { - cwd : string, -}; - type RemotePtrType = { remoteid : string, ownerid? : string, @@ -230,7 +226,7 @@ type CmdDataType = { cmdid : string, remote : RemotePtrType, cmdstr : string, - festate : FeStateType, + festate : Record, termopts : TermOptsType, origtermopts : TermOptsType, status : string, @@ -533,7 +529,7 @@ type WebCmd = { remote : WebRemote, cmdstr : string, rawcmdstr : string, - festate : FeStateType, + festate : Record, termopts : TermOptsType, status : string, startpk : CmdStartPacketType, @@ -595,4 +591,4 @@ type CommandRtnType = { type LineHeightChangeCallbackType = (lineNum : number, newHeight : number, oldHeight : number) => void; -export type {SessionDataType, LineType, RemoteType, RemoteStateType, RemoteInstanceType, HistoryItem, CmdRemoteStateType, FeCmdPacketType, TermOptsType, CmdStartPacketType, CmdDataType, ScreenDataType, ScreenOptsType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, RemotePtrType, UIContextType, HistoryInfoType, HistoryQueryOpts, WatchScreenPacketType, TermWinSize, FeInputPacketType, RemoteInputPacketType, RemoteEditType, FeStateType, ContextMenuOpts, RendererContext, WindowSize, RendererModel, PtyDataType, BookmarkType, ClientDataType, PlaybookType, PlaybookEntryType, HistoryViewDataType, RenderModeType, AlertMessageType, HistorySearchParams, ScreenLinesType, FocusTypeStrs, HistoryTypeStrs, RendererOpts, RendererPluginType, SimpleBlobRendererComponent, RendererModelContainerApi, RendererModelInitializeParams, RendererOptsUpdate, ClientMigrationInfo, WebShareOpts, RemoteStatusTypeStrs, WebFullScreen, WebScreen, WebLine, WebCmd, RemoteTermContext, TermContextUnion, WebRemote, PtyDataUpdate, WebShareWSMessage, LineHeightChangeCallbackType, LineFactoryProps, LineInterface, RendererContainerType, RemoteViewType, CommandRtnType}; +export type {SessionDataType, LineType, RemoteType, RemoteStateType, RemoteInstanceType, HistoryItem, CmdRemoteStateType, FeCmdPacketType, TermOptsType, CmdStartPacketType, CmdDataType, ScreenDataType, ScreenOptsType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, RemotePtrType, UIContextType, HistoryInfoType, HistoryQueryOpts, WatchScreenPacketType, TermWinSize, FeInputPacketType, RemoteInputPacketType, RemoteEditType, ContextMenuOpts, RendererContext, WindowSize, RendererModel, PtyDataType, BookmarkType, ClientDataType, PlaybookType, PlaybookEntryType, HistoryViewDataType, RenderModeType, AlertMessageType, HistorySearchParams, ScreenLinesType, FocusTypeStrs, HistoryTypeStrs, RendererOpts, RendererPluginType, SimpleBlobRendererComponent, RendererModelContainerApi, RendererModelInitializeParams, RendererOptsUpdate, ClientMigrationInfo, WebShareOpts, RemoteStatusTypeStrs, WebFullScreen, WebScreen, WebLine, WebCmd, RemoteTermContext, TermContextUnion, WebRemote, PtyDataUpdate, WebShareWSMessage, LineHeightChangeCallbackType, LineFactoryProps, LineInterface, RendererContainerType, RemoteViewType, CommandRtnType};