From 93bd166ec83656a76e8a1fc4d4a77f74930b69ef Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 17 Dec 2020 14:48:46 +0000 Subject: [PATCH] use source directory of file if send-to-interactive, and delay actual start of FSI --- src/fsharp/FxResolver.fs | 31 +++++--- src/fsharp/ScriptClosure.fs | 35 ++++----- src/fsharp/service/FSharpCheckerResults.fs | 4 +- .../MenusAndCommands.vsct | 3 + .../src/FSharp.VS.FSI/VFSIstrings.txt | 4 +- .../src/FSharp.VS.FSI/fsiSessionToolWindow.fs | 71 ++++++++++++------- vsintegration/src/FSharp.VS.FSI/sessions.fs | 2 +- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.cs.xlf | 8 +-- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.de.xlf | 8 +-- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.es.xlf | 8 +-- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.fr.xlf | 8 +-- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.it.xlf | 8 +-- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.ja.xlf | 8 +-- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.ko.xlf | 8 +-- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.pl.xlf | 8 +-- .../xlf/VFSIstrings.txt.pt-BR.xlf | 8 +-- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.ru.xlf | 8 +-- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.tr.xlf | 8 +-- .../xlf/VFSIstrings.txt.zh-Hans.xlf | 8 +-- .../xlf/VFSIstrings.txt.zh-Hant.xlf | 8 +-- 20 files changed, 146 insertions(+), 108 deletions(-) diff --git a/src/fsharp/FxResolver.fs b/src/fsharp/FxResolver.fs index 8bed916b3..da8003795 100644 --- a/src/fsharp/FxResolver.fs +++ b/src/fsharp/FxResolver.fs @@ -11,6 +11,7 @@ open System.Globalization open System.IO open System.Reflection open System.Runtime.InteropServices +open System.Text open Internal.Utilities open Internal.Utilities.FSharpEnvironment open FSharp.Compiler.AbstractIL.ILBinaryReader @@ -62,18 +63,23 @@ type internal FxResolver(assumeDotNetFramework: bool option, projectDir: string, if File.Exists(candidate) then candidate else dotnet | None -> dotnet - static let desiredDotNetSdkVersionForDirectoryCache = ConcurrentDictionary() + /// We only try once for each directory (cleared on solution unload) to prevent conditions where + /// we repeatedly try to run dotnet.exe on every keystroke for a script + static let desiredDotNetSdkVersionForDirectoryCache = ConcurrentDictionary>() /// Find the relevant sdk version by running `dotnet --version` in the script/project location, /// taking into account any global.json let tryGetDesiredDotNetSdkVersionForDirectory() = - try - desiredDotNetSdkVersionForDirectoryCache.GetOrAdd(projectDir, (fun _ -> - let dotnetHostPath = getDotnetHostPath() + desiredDotNetSdkVersionForDirectoryCache.GetOrAdd(projectDir, (fun _ -> + let dotnetHostPath = getDotnetHostPath() + try let psi = ProcessStartInfo(dotnetHostPath, "--version") psi.RedirectStandardOutput <- true psi.RedirectStandardError <- true - psi.UseShellExecute <- false // use path for 'dotnet' + psi.UseShellExecute <- false + psi.CreateNoWindow <- true + psi.StandardOutputEncoding <- Encoding.UTF8 + psi.StandardErrorEncoding <- Encoding.UTF8 if Directory.Exists(projectDir) then psi.WorkingDirectory <- projectDir let p = Process.Start(psi) @@ -81,12 +87,15 @@ type internal FxResolver(assumeDotNetFramework: bool option, projectDir: string, let stderr = p.StandardError.ReadToEnd() p.WaitForExit() if p.ExitCode <> 0 then - warning(Error(FSComp.SR.scriptSdkNotDetermined(dotnetHostPath, projectDir, stderr, p.ExitCode), m)) - failwith "no sdk determined" - stdout.Trim())) - |> Some - with _ -> - None + Result.Error (Error(FSComp.SR.scriptSdkNotDetermined(dotnetHostPath, projectDir, stderr, p.ExitCode), m)) + else + Result.Ok (stdout.Trim()) + with err -> + Result.Error (Error(FSComp.SR.scriptSdkNotDetermined(dotnetHostPath, projectDir, err.Message, 1), m)))) + // Make sure the warning gets replayed each time we call this + |> function + | Result.Ok res -> Some res + | Result.Error exn -> warning(exn); None /// Get the .NET Core SDK directory relevant to projectDir, used to infer the default target framework assemblies. let tryGetSdkDir() = diff --git a/src/fsharp/ScriptClosure.fs b/src/fsharp/ScriptClosure.fs index 3fc5aa140..408b57b69 100644 --- a/src/fsharp/ScriptClosure.fs +++ b/src/fsharp/ScriptClosure.fs @@ -144,19 +144,22 @@ module ScriptPreprocessClosure = applyCommandLineArgs tcConfigB - let assumeDotNetFramework = + // Work out the references for the script in its location. This may produce diagnostics. + let assumeDotNetFramework, scriptDefaultReferencesDiagnostics = match basicReferences with | None -> + let errorLogger = CapturingErrorLogger("ScriptDefaultReferences") + use unwindEL = PushErrorLoggerPhaseUntilUnwind (fun _ -> errorLogger) let references, assumeDotNetFramework = fxResolver.GetDefaultReferences (useFsiAuxLib, assumeDotNetFramework, useSdkRefs) // Add script references for reference in references do - tcConfigB.AddReferencedAssemblyByPath(range0, reference) - assumeDotNetFramework - | Some rs -> + tcConfigB.AddReferencedAssemblyByPath(range0, reference) + assumeDotNetFramework , errorLogger.Diagnostics + | Some (rs, diagnostics) -> for m, reference in rs do tcConfigB.AddReferencedAssemblyByPath(m, reference) - assumeDotNetFramework + assumeDotNetFramework, diagnostics tcConfigB.resolutionEnvironment <- match codeContext with @@ -171,7 +174,7 @@ module ScriptPreprocessClosure = tcConfigB.useSdkRefs <- useSdkRefs tcConfigB.primaryAssembly <- if assumeDotNetFramework then PrimaryAssembly.Mscorlib else PrimaryAssembly.System_Runtime - TcConfig.Create(tcConfigB, validate=true) + TcConfig.Create(tcConfigB, validate=true), scriptDefaultReferencesDiagnostics let ClosureSourceOfFilename(filename, m, inputCodePage, parseRequired) = try @@ -331,7 +334,7 @@ module ScriptPreprocessClosure = sources, tcConfig, packageReferences /// Reduce the full directive closure into LoadClosure - let GetLoadClosure(ctok, rootFilename, closureFiles, tcConfig: TcConfig, codeContext, packageReferences) = + let GetLoadClosure(ctok, rootFilename, closureFiles, tcConfig: TcConfig, codeContext, packageReferences, earlierDiagnostics) = // Mark the last file as isLastCompiland. let closureFiles = @@ -377,8 +380,8 @@ module ScriptPreprocessClosure = let loadClosureRootDiagnostics, allRootDiagnostics = match List.rev closureFiles with | ClosureFile(_, _, _, parseDiagnostics, metaDiagnostics, _) :: _ -> - (metaDiagnostics @ resolutionDiagnostics), - (parseDiagnostics @ metaDiagnostics @ resolutionDiagnostics) + (earlierDiagnostics @ metaDiagnostics @ resolutionDiagnostics), + (parseDiagnostics @ earlierDiagnostics @ metaDiagnostics @ resolutionDiagnostics) | _ -> [], [] // When no file existed. let isRootRange exn = @@ -421,8 +424,8 @@ module ScriptPreprocessClosure = // // This is tries to mimic the action of running the script in F# Interactive - the initial context for scripting is created // first, then #I and other directives are processed. - let references0, assumeDotNetFramework = - let tcConfig = + let references0, assumeDotNetFramework, scriptDefaultReferencesDiagnostics = + let tcConfig, scriptDefaultReferencesDiagnostics = CreateScriptTextTcConfig(legacyReferenceResolver, defaultFSharpBinariesDir, scriptFileName, codeContext, useSimpleResolution, useFsiAuxLib, None, applyCommandLineArgs, assumeDotNetFramework, @@ -430,17 +433,17 @@ module ScriptPreprocessClosure = let resolutions0, _unresolvedReferences = TcAssemblyResolutions.GetAssemblyResolutionInformation(ctok, tcConfig) let references0 = resolutions0 |> List.map (fun r->r.originalReference.Range, r.resolvedPath) |> Seq.distinct |> List.ofSeq - references0, tcConfig.assumeDotNetFramework + references0, tcConfig.assumeDotNetFramework, scriptDefaultReferencesDiagnostics - let tcConfig = + let tcConfig, scriptDefaultReferencesDiagnostics = CreateScriptTextTcConfig(legacyReferenceResolver, defaultFSharpBinariesDir, scriptFileName, - codeContext, useSimpleResolution, useFsiAuxLib, Some references0, + codeContext, useSimpleResolution, useFsiAuxLib, Some (references0, scriptDefaultReferencesDiagnostics), applyCommandLineArgs, assumeDotNetFramework, useSdkRefs, tryGetMetadataSnapshot, reduceMemoryUsage) let closureSources = [ClosureSource(scriptFileName, range0, sourceText, true)] let closureFiles, tcConfig, packageReferences = FindClosureFiles(scriptFileName, range0, closureSources, tcConfig, codeContext, lexResourceManager, dependencyProvider) - GetLoadClosure(ctok, scriptFileName, closureFiles, tcConfig, codeContext, packageReferences) + GetLoadClosure(ctok, scriptFileName, closureFiles, tcConfig, codeContext, packageReferences, scriptDefaultReferencesDiagnostics) /// Given source filename, find the full load closure /// Used from fsi.fs and fsc.fs, for #load and command line @@ -452,7 +455,7 @@ module ScriptPreprocessClosure = let mainFile, mainFileRange = List.last files let closureSources = files |> List.collect (fun (filename, m) -> ClosureSourceOfFilename(filename, m,tcConfig.inputCodePage,true)) let closureFiles, tcConfig, packageReferences = FindClosureFiles(mainFile, mainFileRange, closureSources, tcConfig, codeContext, lexResourceManager, dependencyProvider) - GetLoadClosure(ctok, mainFile, closureFiles, tcConfig, codeContext, packageReferences) + GetLoadClosure(ctok, mainFile, closureFiles, tcConfig, codeContext, packageReferences, []) type LoadClosure with /// Analyze a script text and find the closure of its references. diff --git a/src/fsharp/service/FSharpCheckerResults.fs b/src/fsharp/service/FSharpCheckerResults.fs index f55051394..b0cbcf560 100644 --- a/src/fsharp/service/FSharpCheckerResults.fs +++ b/src/fsharp/service/FSharpCheckerResults.fs @@ -2156,7 +2156,7 @@ type FsiInteractiveChecker(legacyReferenceResolver, let backgroundDiagnostics = [| |] let reduceMemoryUsage = ReduceMemoryFlag.Yes - let assumeDotNetFramework = (tcConfig.primaryAssembly = PrimaryAssembly.Mscorlib) + let useDotNetFramework = (tcConfig.primaryAssembly = PrimaryAssembly.Mscorlib) let applyCompilerOptions tcConfigB = let fsiCompilerOptions = CompilerOptions.GetCoreFsiCompilerOptions tcConfigB @@ -2167,7 +2167,7 @@ type FsiInteractiveChecker(legacyReferenceResolver, filename, sourceText, CodeContext.Editing, tcConfig.useSimpleResolution, tcConfig.useFsiAuxLib, tcConfig.useSdkRefs, new Lexhelp.LexResourceManager(), - applyCompilerOptions, assumeDotNetFramework, + applyCompilerOptions, useDotNetFramework, tryGetMetadataSnapshot=(fun _ -> None), reduceMemoryUsage=reduceMemoryUsage, dependencyProvider=tcImports.DependencyProvider) diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/MenusAndCommands.vsct b/vsintegration/src/FSharp.ProjectSystem.FSharp/MenusAndCommands.vsct index 53c869649..b1e215a3d 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/MenusAndCommands.vsct +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/MenusAndCommands.vsct @@ -47,6 +47,9 @@ + + + diff --git a/vsintegration/src/FSharp.VS.FSI/VFSIstrings.txt b/vsintegration/src/FSharp.VS.FSI/VFSIstrings.txt index 53f931c29..e6f9011d0 100644 --- a/vsintegration/src/FSharp.VS.FSI/VFSIstrings.txt +++ b/vsintegration/src/FSharp.VS.FSI/VFSIstrings.txt @@ -4,10 +4,10 @@ cannotCreateToolWindow,"Cannot create window F# Interactive ToolWindow" exceptionRaisedWhenCreatingRemotingClient,"Exception raised when creating remoting client for launched fsi.exe\n%s" exceptionRaisedWhenRequestingToolWindow,"Exception raised when requesting FSI ToolWindow.\n%s" couldNotObtainFSharpLS,"Could not load F# language service" -sessionTerminationDetected,"Session termination detected. Press Enter to restart." +sessionTerminationDetected,"Session termination detected." fsharpInteractive,"F# Interactive" couldNotFindFsiExe,"Could not find fsi.exe, the F# Interactive executable.\nThis file does not exist:\n\n%s\n" killingProcessRaisedException,"Killing process raised exception:\n%s" sessionIsNotDebugFriendly,"The current F# Interactive session is not configured for debugging. For the best experience, enable debugging in F# Interactive settings, then reset the session.\n\nAttempt debugging with current settings?" doNotShowWarningInFuture,"Don't show this warning again" -sessionInitialMessage,"Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script." +sessionInitialMessage,"Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script." diff --git a/vsintegration/src/FSharp.VS.FSI/fsiSessionToolWindow.fs b/vsintegration/src/FSharp.VS.FSI/fsiSessionToolWindow.fs index 5604be40a..bc6674745 100644 --- a/vsintegration/src/FSharp.VS.FSI/fsiSessionToolWindow.fs +++ b/vsintegration/src/FSharp.VS.FSI/fsiSessionToolWindow.fs @@ -194,14 +194,18 @@ type internal FsiToolWindow() as this = let history = HistoryBuffer() let sessions = Session.FsiSessions() do fsiLangService.Sessions <- sessions - let writeTextAndScroll (str:string) = + + let writeText scroll (str:string) = if str <> null && textLines <> null then lock textLines (fun () -> textStream.DirectWrite(fixServerPrompt str) - setScrollToEndOfBuffer() // I'm not convinced that users want jump to end on output. - ) // IP sample did it. Previously, VFSI did not. - // What if there is scrolling output on a timer and a user wants to look over it?? - // Maybe, if already at the end, then stay at the end? + if scroll then + setScrollToEndOfBuffer() + ) + + let writeTextAndScroll (str:string) = writeText true str + + let writeTextNoScroll (str:string) = writeText false str // Merge stdout/stderr events prior to buffering. Paired with StdOut/StdErr keys so we can split them afterwards. let responseE = Observable.merge (Observable.map (pair StdOut) sessions.Output) (Observable.map (pair StdErr) sessions.Error) @@ -219,21 +223,22 @@ type internal FsiToolWindow() as this = | StdErr,strs -> writeTextAndScroll (String.concat Environment.NewLine strs) // later: hence keep them split. do responseBufferE.Add(fun keyStrings -> let keyChunks : (Response * string list) list = chunkKeyValues keyStrings List.iter writeKeyChunk keyChunks) + let showInitialMessage scroll = + writeText scroll ((VFSIstrings.SR.sessionInitialMessage())+Environment.NewLine) // Write message on a session termination. Should be called on Gui thread. let recordTermination () = if not sessions.Alive then // check is likely redundant synchronizationContext.Post( System.Threading.SendOrPostCallback( - fun _ -> writeTextAndScroll ((VFSIstrings.SR.sessionTerminationDetected())+Environment.NewLine) + fun _ -> + writeTextAndScroll ((VFSIstrings.SR.sessionTerminationDetected())+Environment.NewLine) + showInitialMessage(true) ), null) do sessions.Exited.Add(fun _ -> recordTermination()) - let showInitialMessage() = - writeTextAndScroll ((VFSIstrings.SR.sessionInitialMessage())+Environment.NewLine) - - do showInitialMessage() + do showInitialMessage(false) let clearUndoStack (textLines:IVsTextLines) = // Clear the UNDO stack. let undoManager = textLines.GetUndoManager() |> throwOnFailure1 @@ -312,7 +317,8 @@ type internal FsiToolWindow() as this = let supportWhenInInputArea (sender:obj) (args:EventArgs) = let command = sender :?> MenuCommand if null <> command then // are these null checks needed? - command.Supported <- not source.IsCompletorActive && isCurrentPositionInInputArea() + let enabled = not source.IsCompletorActive && isCurrentPositionInInputArea() + command.Supported <- enabled /// Support command except when completion is active. let supportUnlessCompleting (sender:obj) (args:EventArgs) = @@ -328,28 +334,40 @@ type internal FsiToolWindow() as this = let supportWhenAtStartOfInputArea (sender:obj) (e:EventArgs) = let command = sender :?> MenuCommand if command <> null then - command.Supported <- isCurrentPositionAtStartOfInputArea() + let enabled = isCurrentPositionAtStartOfInputArea() + command.Enabled <- enabled + command.Supported <- enabled /// Support when at the start of the input area AND no-selection (e.g. to enable NoAction on BACKSPACE). let supportWhenAtStartOfInputAreaAndNoSelection (sender:obj) (e:EventArgs) = let command = sender :?> MenuCommand if command <> null then - command.Supported <- isCurrentPositionAtStartOfInputArea() && not (haveTextViewSelection()) + let enabled = isCurrentPositionAtStartOfInputArea() && not (haveTextViewSelection()) + command.Enabled <- enabled + command.Supported <- enabled let supportWhenSelectionIntersectsWithReadonlyOrNoSelection (sender:obj) (_:EventArgs) = let command = sender :?> MenuCommand if command <> null then - command.Supported <- isSelectionIntersectsWithReadonly() || not (haveTextViewSelection()) + let enabled = isSelectionIntersectsWithReadonly() || not (haveTextViewSelection()) + command.Enabled <- enabled + command.Supported <- enabled - let supportWhenInterruptSupported (sender:obj) (_:EventArgs) = + let visibleWhenInterruptSupported (sender:obj) (_:EventArgs) = let command = sender :?> MenuCommand if command <> null then - command.Supported <- sessions.Alive && sessions.SupportsInterrupt + let enabled = sessions.Alive && sessions.SupportsInterrupt + command.Supported <- enabled + command.Enabled <- enabled + command.Visible <- enabled - let supportWhenSessionAlive (sender:obj) (_:EventArgs) = + let visibleWhenSessionAlive (sender:obj) (_:EventArgs) = let command = sender :?> MenuCommand if command <> null then - command.Supported <- sessions.Alive + let enabled = sessions.Alive + command.Supported <- enabled + command.Enabled <- enabled + command.Visible <- enabled // NOTE: On* are command handlers. @@ -451,6 +469,11 @@ type internal FsiToolWindow() as this = | Some _ -> FsiDebuggerState.AttachedToFSI, debuggedFsi | None -> FsiDebuggerState.AttachedNotToFSI, None + let visibleWhenDebugAttachedFSIProcess (sender:obj) (_:EventArgs) = + let command = sender :?> MenuCommand + if command <> null then + command.Visible <- fst (getDebuggerState ()) = FsiDebuggerState.AttachedToFSI + let getDebugAttachedFSIProcess () = match getDebuggerState () with | FsiDebuggerState.AttachedToFSI, opt -> opt @@ -522,7 +545,7 @@ type internal FsiToolWindow() as this = let onQuitProcess (sender:obj) (args:EventArgs) = sessions.Kill() - showInitialMessage() + showInitialMessage(true) let sendTextToFSI text = try @@ -694,11 +717,11 @@ type internal FsiToolWindow() as this = addCommand guidVSStd97CmdID (int32 VSStd97CmdID.Cut) onCutDoCopy (Some supportWhenSelectionIntersectsWithReadonlyOrNoSelection) addCommand guidVSStd97CmdID (int32 VSStd97CmdID.ClearPane) onClearPane None addCommand guidVSStd2KCmdID (int32 VSStd2KCmdID.SHOWCONTEXTMENU) showContextMenu None - addCommand Guids.guidInteractiveCommands Guids.cmdIDSessionInterrupt onInterrupt (Some supportWhenInterruptSupported) - addCommand Guids.guidInteractiveCommands Guids.cmdIDSessionRestart (onRestart null) (Some supportWhenSessionAlive) - addCommand Guids.guidFsiConsoleCmdSet Guids.cmdIDAttachDebugger onAttachDebugger (Some supportWhenSessionAlive) - addCommand Guids.guidFsiConsoleCmdSet Guids.cmdIDDetachDebugger onDetachDebugger None - addCommand Guids.guidFsiConsoleCmdSet Guids.cmdIDQuitProcess onQuitProcess None + addCommand Guids.guidInteractiveCommands Guids.cmdIDSessionInterrupt onInterrupt (Some visibleWhenInterruptSupported) + addCommand Guids.guidInteractiveCommands Guids.cmdIDSessionRestart (onRestart null) (Some visibleWhenSessionAlive) + addCommand Guids.guidFsiConsoleCmdSet Guids.cmdIDAttachDebugger onAttachDebugger (Some visibleWhenSessionAlive) + addCommand Guids.guidFsiConsoleCmdSet Guids.cmdIDDetachDebugger onDetachDebugger (Some visibleWhenDebugAttachedFSIProcess) + addCommand Guids.guidFsiConsoleCmdSet Guids.cmdIDQuitProcess onQuitProcess (Some visibleWhenSessionAlive) addCommand Guids.guidInteractiveShell Guids.cmdIDSendSelection onMLSendSelection None addCommand Guids.guidInteractiveShell Guids.cmdIDSendLine onMLSendLine None diff --git a/vsintegration/src/FSharp.VS.FSI/sessions.fs b/vsintegration/src/FSharp.VS.FSI/sessions.fs index 0bc273960..b8649fa7f 100644 --- a/vsintegration/src/FSharp.VS.FSI/sessions.fs +++ b/vsintegration/src/FSharp.VS.FSI/sessions.fs @@ -234,7 +234,7 @@ let fsiStartInfo channelName sourceFile = |> addStringOption true "fsi-server-output-codepage" outCP |> addStringOption true "fsi-server-input-codepage" inCP |> addStringOption true "fsi-server-lcid" System.Threading.Thread.CurrentThread.CurrentUICulture.LCID - //|> addStringOption true "fsi-initial-file" sourceFile + //|> addStringOption true "fsi-server-association-file" sourceFile |> addStringOption true "fsi-server" channelName |> (fun s -> s + sprintf " %s" SessionsProperties.fsiArgs) |> addBoolOption fsiSupportsShadowcopy "shadowcopyreferences" SessionsProperties.fsiShadowCopy diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.cs.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.cs.xlf index 48fb44edd..feee32387 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.cs.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.cs.xlf @@ -23,13 +23,13 @@ - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. - Session termination detected. Press Enter to restart. - Zjistilo se ukončení relace. Pokračovat můžete stisknutím klávesy Enter. + Session termination detected. + Zjistilo se ukončení relace. Pokračovat můžete stisknutím klávesy Enter. diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.de.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.de.xlf index 380fa78ab..fe4c08dc0 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.de.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.de.xlf @@ -23,13 +23,13 @@ - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. - Session termination detected. Press Enter to restart. - Es wurde eine Beendigung der Sitzung erkannt. Drücken Sie die EINGABETASTE, um neu zu starten. + Session termination detected. + Es wurde eine Beendigung der Sitzung erkannt. Drücken Sie die EINGABETASTE, um neu zu starten. diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.es.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.es.xlf index 284f7a425..d548c7fea 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.es.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.es.xlf @@ -23,13 +23,13 @@ - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. - Session termination detected. Press Enter to restart. - Se detectó una terminación de sesión. Presione Entrar para reiniciar. + Session termination detected. + Se detectó una terminación de sesión. Presione Entrar para reiniciar. diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.fr.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.fr.xlf index 5f2162b20..992e1e0bc 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.fr.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.fr.xlf @@ -23,13 +23,13 @@ - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. - Session termination detected. Press Enter to restart. - Fin de session détectée. Appuyez sur Entrée pour redémarrer. + Session termination detected. + Fin de session détectée. Appuyez sur Entrée pour redémarrer. diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.it.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.it.xlf index d6e97e550..7e9cc43e1 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.it.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.it.xlf @@ -23,13 +23,13 @@ - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. - Session termination detected. Press Enter to restart. - Rilevata terminazione di sessione. Premere INVIO per riavviare. + Session termination detected. + Rilevata terminazione di sessione. Premere INVIO per riavviare. diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ja.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ja.xlf index 540883765..86d17812b 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ja.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ja.xlf @@ -23,13 +23,13 @@ - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. - Session termination detected. Press Enter to restart. - セッションの終了が検出されました。再開する場合は Enter キーを押してください。 + Session termination detected. + セッションの終了が検出されました。再開する場合は Enter キーを押してください。 diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ko.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ko.xlf index a38ac3071..41c4c2c5f 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ko.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ko.xlf @@ -23,13 +23,13 @@ - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. - Session termination detected. Press Enter to restart. - 세션 종료가 검색되었습니다. 다시 시작하려면 <Enter> 키를 누르세요. + Session termination detected. + 세션 종료가 검색되었습니다. 다시 시작하려면 <Enter> 키를 누르세요. diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pl.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pl.xlf index 4ad39f86a..321f61a87 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pl.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pl.xlf @@ -23,13 +23,13 @@ - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. - Session termination detected. Press Enter to restart. - Wykryto zakończenie sesji. Naciśnij klawisz Enter, aby uruchomić ją ponownie. + Session termination detected. + Wykryto zakończenie sesji. Naciśnij klawisz Enter, aby uruchomić ją ponownie. diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pt-BR.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pt-BR.xlf index 47f68299b..2d9efdf39 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pt-BR.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pt-BR.xlf @@ -23,13 +23,13 @@ - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. - Session termination detected. Press Enter to restart. - Encerramento da sessão detectado. Pressione a tecla Enter para reiniciar. + Session termination detected. + Encerramento da sessão detectado. Pressione a tecla Enter para reiniciar. diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ru.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ru.xlf index baae3009e..a29d800a7 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ru.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ru.xlf @@ -23,13 +23,13 @@ - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. - Session termination detected. Press Enter to restart. - Обнаружено прекращение сеанса. Нажмите клавишу ВВОД для перезапуска. + Session termination detected. + Обнаружено прекращение сеанса. Нажмите клавишу ВВОД для перезапуска. diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.tr.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.tr.xlf index 161549842..779e115b0 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.tr.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.tr.xlf @@ -23,13 +23,13 @@ - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. - Session termination detected. Press Enter to restart. - Oturum sonlandırma algılandı. Yeniden başlatmak için Enter'a basın. + Session termination detected. + Oturum sonlandırma algılandı. Yeniden başlatmak için Enter'a basın. diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hans.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hans.xlf index 14361b064..3585b975b 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hans.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hans.xlf @@ -23,13 +23,13 @@ - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. - Session termination detected. Press Enter to restart. - 检测到会话已终止。请按 Enter 重新启动会话。 + Session termination detected. + 检测到会话已终止。请按 Enter 重新启动会话。 diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hant.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hant.xlf index fc0e1e581..6966eadf7 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hant.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hant.xlf @@ -23,13 +23,13 @@ - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. - Welcome to F# Interactive. To execute code in F# Interactive, use 'Send to Interactive' (Alt-Enter or right-click) from an F# script. Or press Enter to start an F# Interactive session not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. + Welcome to F# Interactive. To execute code, either\n 1. 'Send to Interactive' (Alt-Enter or right-click) from an F# script. The F# Interactive process will\n use settings associated with that script.\n 2. Press 'Enter' to start an F# Interactive process not associated to any script. - Session termination detected. Press Enter to restart. - 偵測到工作階段終止。請按 Enter 重新啟動。 + Session termination detected. + 偵測到工作階段終止。請按 Enter 重新啟動。 -- GitLab