From c83dafe0e18da01011701f52a17585b946e20775 Mon Sep 17 00:00:00 2001 From: Heikki Vesalainen Date: Fri, 15 Mar 2024 15:15:59 +0200 Subject: [PATCH] Remove SHELLOPTS=vi and -Xjline support, reinstate -Xnojline This functionality is better provided by jline through the `~/.inputrc` or other file pointed to by `-Djline.inputrc` The content of the file needs to just include the line ``` set editing-mode vi # or emacs ``` --- project/ScalaOptionParser.scala | 2 +- .../scala/tools/nsc/settings/ScalaSettings.scala | 4 ++-- src/manual/scala/man1/scalac.scala | 4 ++-- src/partest/scala/tools/partest/ReplTest.scala | 2 +- .../scala/tools/nsc/interpreter/jline/Reader.scala | 10 ---------- .../tools/nsc/interpreter/shell/ShellConfig.scala | 7 ++----- test/files/run/type-tag-leak.scala | 2 +- .../scala/tools/nsc/interpreter/CompletionTest.scala | 2 +- test/macro-annot/run/repl/repl_2.scala | 2 +- 9 files changed, 11 insertions(+), 24 deletions(-) diff --git a/project/ScalaOptionParser.scala b/project/ScalaOptionParser.scala index 9378b7edcd42..f6e6f2a986a7 100644 --- a/project/ScalaOptionParser.scala +++ b/project/ScalaOptionParser.scala @@ -83,7 +83,7 @@ object ScalaOptionParser { // TODO retrieve these data programmatically, ala https://github.com/scala/scala-tool-support/blob/master/bash-completion/src/main/scala/BashCompletion.scala private def booleanSettingNames = List("-X", "-Xasync", "-Xcheckinit", "-Xdev", "-Xdisable-assertions", "-Xexperimental", "-Xfatal-warnings", "-Xlog-free-terms", "-Xlog-free-types", "-Xlog-implicit-conversions", "-Xlog-reflective-calls", - "-Xno-forwarders", "-Xno-patmat-analysis", "-Xnon-strict-patmat-analysis", "-Xprint-pos", "-Xprint-types", "-Xprompt", "-Xresident", "-Xshow-phases", "-Xverify", "-Y", + "-Xnojline", "-Xno-forwarders", "-Xno-patmat-analysis", "-Xnon-strict-patmat-analysis", "-Xprint-pos", "-Xprint-types", "-Xprompt", "-Xresident", "-Xshow-phases", "-Xverify", "-Y", "-Ybreak-cycles", "-Ydebug", "-Ydebug-type-error", "-Ycompact-trees", "-YdisableFlatCpCaching", "-Ydoc-debug", "-Yide-debug", "-Ylog-classpath", "-Ymacro-debug-lite", "-Ymacro-debug-verbose", "-Ymacro-no-expand", diff --git a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala index f424205edec1..7931cd7ec97e 100644 --- a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala @@ -100,8 +100,6 @@ trait ScalaSettings extends StandardScalaSettings with Warnings { _: MutableSett val maxwarns = IntSetting ("-Xmaxwarns", "Maximum warnings to print", 100, None, _ => None) val Xmigration = ScalaVersionSetting ("-Xmigration", "version", "Warn about constructs whose behavior may have changed since version.", initial = NoScalaVersion, default = Some(AnyScalaVersion)) val Xnojline = BooleanSetting ("-Xnojline", "Do not use JLine for editing.") - .withDeprecationMessage("Replaced by -Xjline:off") - .withPostSetHook(_ => Xjline.value = "off") val Xjline = ChoiceSetting ( name = "-Xjline", helpArg = "mode", @@ -112,6 +110,8 @@ trait ScalaSettings extends StandardScalaSettings with Warnings { _: MutableSett "emacs key bindings.", "vi key bindings", "No JLine editing.")) + .withDeprecationMessage("Replaced by use of '~/.inputrc'. Set 'editing-mode' to 'vi', 'emacs' or 'dumb'") + val Xverify = BooleanSetting ("-Xverify", "Verify generic signatures in generated bytecode.") val plugin = MultiStringSetting ("-Xplugin", "paths", "Load a plugin from each classpath.") val disable = MultiStringSetting ("-Xplugin-disable", "plugin", "Disable plugins by name.") diff --git a/src/manual/scala/man1/scalac.scala b/src/manual/scala/man1/scalac.scala index fdeddd825301..1e7e04584781 100644 --- a/src/manual/scala/man1/scalac.scala +++ b/src/manual/scala/man1/scalac.scala @@ -239,8 +239,8 @@ object scalac extends Command { CmdOption("Xno-patmat-analysis"), "Don't perform exhaustivity/unreachability analysis. Also, ignore " & MItalic("@switch") & " annotation."), Definition( - CmdOption("Xjline"), - "The JLine keybindings to use: emacs/vi/off."), + CmdOption("Xnojline"), + "Do not use JLine at all for REPL input."), Definition( CmdOptionBound("Xplugin:", Argument("paths")), "Load a plugin from each classpath."), diff --git a/src/partest/scala/tools/partest/ReplTest.scala b/src/partest/scala/tools/partest/ReplTest.scala index eb35dc29238b..308693b308f6 100644 --- a/src/partest/scala/tools/partest/ReplTest.scala +++ b/src/partest/scala/tools/partest/ReplTest.scala @@ -32,7 +32,7 @@ abstract class ReplTest extends DirectTest { // final because we need to enforce the existence of a couple settings. final override def settings: Settings = { val s = super.settings - s.Xjline.value = "off" + s.Xnojline.value = true if (getClass.getClassLoader.getParent != null) { s.classpath.value = s.classpath.value match { case "" => testOutput.toString diff --git a/src/repl-frontend/scala/tools/nsc/interpreter/jline/Reader.scala b/src/repl-frontend/scala/tools/nsc/interpreter/jline/Reader.scala index 0bc37ec1f374..6e606e488648 100644 --- a/src/repl-frontend/scala/tools/nsc/interpreter/jline/Reader.scala +++ b/src/repl-frontend/scala/tools/nsc/interpreter/jline/Reader.scala @@ -14,7 +14,6 @@ package scala.tools.nsc.interpreter package jline import org.jline.builtins.InputRC -import org.jline.keymap.KeyMap import org.jline.reader.Parser.ParseContext import org.jline.reader._ import org.jline.reader.impl.{CompletionMatcherImpl, DefaultParser, LineReaderImpl} @@ -150,8 +149,6 @@ object Reader { case NonFatal(_) => } //ignore - val keyMap = reader.getKeyMaps.get("main") - object ScalaShowType { val Name = "scala-show-type" private var lastInvokeLocation: Option[(String, Int)] = None @@ -180,13 +177,6 @@ object Reader { } reader.getWidgets().put(ScalaShowType.Name, () => ScalaShowType()) - locally { - import LineReader._ - // VIINS, VICMD, EMACS - val keymap = if (config.viMode) VIINS else EMACS - reader.getKeyMaps.put(MAIN, reader.getKeyMaps.get(keymap)); - keyMap.bind(new Reference(ScalaShowType.Name), KeyMap.alt(KeyMap.ctrl('t'))) - } def secure(p: java.nio.file.Path): Unit = { try scala.reflect.internal.util.OwnerOnlyChmod.chmodFileOrCreateEmpty(p) catch { case scala.util.control.NonFatal(e) => diff --git a/src/repl-frontend/scala/tools/nsc/interpreter/shell/ShellConfig.scala b/src/repl-frontend/scala/tools/nsc/interpreter/shell/ShellConfig.scala index c758e7ed22b5..76405daf3751 100644 --- a/src/repl-frontend/scala/tools/nsc/interpreter/shell/ShellConfig.scala +++ b/src/repl-frontend/scala/tools/nsc/interpreter/shell/ShellConfig.scala @@ -38,8 +38,7 @@ object ShellConfig { val batchText: String = if (settings.execute.isSetByUser) settings.execute.value else "" val batchMode: Boolean = batchText.nonEmpty val doCompletion: Boolean = !(settings.noCompletion.value || batchMode) - val haveInteractiveConsole: Boolean = settings.Xjline.value != "off" - override val viMode = super.viMode || settings.Xjline.value == "vi" + val haveInteractiveConsole: Boolean = !settings.Xnojline.value def xsource: String = if (settings.isScala3: @nowarn) settings.source.value.versionString else "" } case _ => new ShellConfig { @@ -48,8 +47,7 @@ object ShellConfig { val batchText: String = "" val batchMode: Boolean = false val doCompletion: Boolean = !settings.noCompletion.value - val haveInteractiveConsole: Boolean = settings.Xjline.value != "off" - override val viMode = super.viMode || settings.Xjline.value == "vi" + val haveInteractiveConsole: Boolean = !settings.Xnojline.value def xsource: String = if (settings.isScala3: @nowarn) settings.source.value.versionString else "" } } @@ -62,7 +60,6 @@ trait ShellConfig { def batchMode: Boolean def doCompletion: Boolean def haveInteractiveConsole: Boolean - def viMode: Boolean = envOrNone("SHELLOPTS").map(_.split(":").contains("vi")).getOrElse(false) // source compatibility, i.e., -Xsource def xsource: String diff --git a/test/files/run/type-tag-leak.scala b/test/files/run/type-tag-leak.scala index 277799f765eb..f0f9af86aa4e 100644 --- a/test/files/run/type-tag-leak.scala +++ b/test/files/run/type-tag-leak.scala @@ -19,7 +19,7 @@ object Test extends Test { def main(args: Array[String]): Unit = { for (i <- 1 to 16) { val settings = new scala.tools.nsc.Settings - settings.Xjline.value = "off" + settings.Xnojline.value = true settings.usejavacp.value = true val intp = new IMain(settings, new shell.ReplReporterImpl(settings, new PrintWriter(new StringWriter))) diff --git a/test/junit/scala/tools/nsc/interpreter/CompletionTest.scala b/test/junit/scala/tools/nsc/interpreter/CompletionTest.scala index 8889a6553f63..802784b716b6 100644 --- a/test/junit/scala/tools/nsc/interpreter/CompletionTest.scala +++ b/test/junit/scala/tools/nsc/interpreter/CompletionTest.scala @@ -13,7 +13,7 @@ class CompletionTest { def newIMain(classBased: Boolean = false): IMain = { val settings = new Settings() - settings.Xjline.value = "off" + settings.Xnojline.value = true settings.usejavacp.value = true settings.Yreplclassbased.value = classBased diff --git a/test/macro-annot/run/repl/repl_2.scala b/test/macro-annot/run/repl/repl_2.scala index db7320da6cb2..9e026ca5354f 100644 --- a/test/macro-annot/run/repl/repl_2.scala +++ b/test/macro-annot/run/repl/repl_2.scala @@ -4,7 +4,7 @@ import scala.tools.nsc.interpreter.shell._ object Test extends App { private def repl(code: String): String = { val s = new Settings - s.Xjline.value = "off" + s.Xnojline.value = true s.usejavacp.value = false s.classpath.value = sys.props("sbt.paths.tests.classpath") s.plugin.value = List(sys.props("sbt.paths.plugin.jar"))