
ammonite.terminal.SpecialKeys.scala Maven / Gradle / Ivy
package ammonite.terminal
/**
* One place to assign all the esotic control key input snippets to
* easy-to-remember names
*/
object SpecialKeys {
/**
* Lets you easily pattern match on characters modified by ctrl,
* or convert a character into its ctrl-ed version
*/
object Ctrl{
def apply(c: Char) = c.toInt match{
// For some reason, Ctrl -, Ctrl /, Ctrl [, Ctrl ], all don't seem to
// follow the same offset as the bulk of the other characters, at least
// not on OSX. I haven't managed to find a canonical source of truth for
// what generates what, but for now just hardcode it to fix the problem on
// OSX until we find a more modular/flexible solution
case 45 => 31.toChar.toString
case 47 => 31.toChar.toString
case 91 => 27.toChar.toString
case 93 => 29.toChar.toString
case n => (n - 96).toChar.toString
}
def unapply(i: Int): Option[Int] = Some(i + 96)
}
/**
* The string value you get when you hit the alt key
*/
def Alt = "\u001b"
val Backspace = 127.toChar.toString
val FnDelete = Alt + "[3~"
val Tab = 9.toChar.toString
val NewLine = Seq("\n", "\r")
val DefaultUp = Alt+"[A"
val DefaultDown = Alt+"[B"
val DefaultRight = Alt+"[C"
val DefaultLeft = Alt+"[D"
val WeirdUp = Alt+"OA"
val WeirdDown = Alt+"OB"
val WeirdRight = Alt+"OC"
val WeirdLeft = Alt+"OD"
val Up = Seq(DefaultUp, WeirdUp)
val Down = Seq(DefaultDown, WeirdDown)
val Right = Seq(DefaultRight, WeirdRight)
val Left = Seq(DefaultLeft, WeirdLeft)
val Home = Alt+"OH"
val End = Alt+"OF"
// For some reason Screen makes these print different incantations
// from a normal snippet, so this causes issues like
// https://github.com/lihaoyi/Ammonite/issues/152 unless we special
// case them
val HomeScreen = Alt+"[1~"
val EndScreen = Alt+"[4~"
val HomeLinuxXterm = Alt+"[7~"
val EndRxvt = Alt+"[8~"
val ShiftUp = Alt+"[1;2A"
val ShiftDown = Alt+"[1;2B"
val ShiftRight = Alt+"[1;2C"
val ShiftLeft = Alt+"[1;2D"
val FnUp = Alt+"[5~"
val FnDown = Alt+"[6~"
val FnRight = Alt+"[F"
val FnLeft = Alt+"[H"
val AltUp = Alt*2+"[A"
val AltDown = Alt*2+"[B"
val AltRight = Alt*2+"[C"
val AltLeft = Alt*2+"[D"
val LinuxCtrlRight = Alt+"[1;5C"
val LinuxCtrlLeft = Alt+"[1;5D"
val FnAltUp = Alt*2+"[5~"
val FnAltDown = Alt*2+"[6~"
val FnAltRight = Alt+"[1;9F"
val FnAltLeft = Alt+"[1;9H"
// Same as fn-alt-{up, down}
// val FnShiftUp = Alt*2+"[5~"
// val FnShiftDown = Alt*2+"[6~"
val FnShiftRight = Alt+"[1;2F"
val FnShiftLeft = Alt+"[1;2H"
val AltShiftUp = Alt+"[1;10A"
val AltShiftDown = Alt+"[1;10B"
val AltShiftRight = Alt+"[1;10C"
val AltShiftLeft = Alt+"[1;10D"
// Same as fn-alt-{up, down}
// val FnAltShiftUp = Alt*2+"[5~"
// val FnAltShiftDown = Alt*2+"[6~"
val FnAltShiftRight = Alt+"[1;10F"
val FnAltShiftLeft = Alt+"[1;10H"
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy