# HG changeset patch # User wenzelm # Date 1377863192 -7200 # Node ID d0e4c8f73541cba65ccf6c3c5c7f850ebf3c7d6a # Parent a1cf42366ceaba327f35f5d9c865bfa71be81357# Parent d8ad101cc6849e04ce2df8ab96b2750aa0f483e9 merged diff -r a1cf42366cea -r d0e4c8f73541 NEWS --- a/NEWS Fri Aug 30 13:23:23 2013 +0200 +++ b/NEWS Fri Aug 30 13:46:32 2013 +0200 @@ -90,18 +90,41 @@ according to Isabelle/Scala plugin option "jedit_font_reset_size" (cf. keyboard shortcut C+0). -* More reactive and less intrusive completion, managed by -Isabelle/jEdit instead of SideKick. Plain words need to be at least 3 -characters long to be completed (was 2 before). Symbols are only -completed in backslash forms, e.g. \forall or \ that both -produce the Isabelle symbol \ in its Unicode rendering. - -* Standard jEdit completion via C+b uses action isabelle.complete -with fall-back on complete-word for non-Isabelle buffers. - * Improved support for Linux look-and-feel "GTK+", see also "Utilities / Global Options / Appearance". +* Improved completion mechanism, which is now managed by the +Isabelle/jEdit plugin instead of SideKick. + + - Various Isabelle plugin options to control popup behaviour and + immediate insertion into buffer. + + - Light-weight popup, which avoids explicit window (more reactive + and more robust). Interpreted key events: TAB, ESCAPE, UP, DOWN, + PAGE_UP, PAGE_DOWN. All other key events are passed to the jEdit + text area unchanged. + + - Explicit completion via standard jEdit shortcut C+b, which has + been remapped to action "isabelle.complete" (fall-back on regular + "complete-word" for non-Isabelle buffers). + + - Implicit completion via keyboard input on text area, with popup or + immediate insertion into buffer. + + - Implicit completion of plain words requires at least 3 characters + (was 2 before). + + - Immediate completion ignores plain words; it requires > 1 + characters of symbol abbreviation to complete, otherwise fall-back + on completion popup. + + - Isabelle Symbols are only completed in backslashed forms, + e.g. \forall or \ that both produce the Isabelle symbol + \ in its Unicode rendering. + + - Refined table of Isabelle symbol abbreviations (see + $ISABELLE_HOME/etc/symbols). + *** Pure *** diff -r a1cf42366cea -r d0e4c8f73541 etc/symbols --- a/etc/symbols Fri Aug 30 13:23:23 2013 +0200 +++ b/etc/symbols Fri Aug 30 13:46:32 2013 +0200 @@ -161,11 +161,11 @@ \ code: 0x0021d0 group: arrow \ code: 0x0027f8 group: arrow \ code: 0x0021d2 group: arrow abbrev: => -\ code: 0x0027f9 group: arrow abbrev: ==> -\ code: 0x002194 group: arrow -\ code: 0x0027f7 group: arrow abbrev: <-> +\ code: 0x0027f9 group: arrow abbrev: ==> abbrev: ≡> +\ code: 0x002194 group: arrow abbrev: <-> +\ code: 0x0027f7 group: arrow abbrev: <-> abbrev: <--> \ code: 0x0021d4 group: arrow -\ code: 0x0027fa group: arrow abbrev: <=> +\ code: 0x0027fa group: arrow \ code: 0x0021a6 group: arrow abbrev: |-> \ code: 0x0027fc group: arrow abbrev: |--> \ code: 0x002500 group: arrow @@ -190,42 +190,42 @@ \ code: 0x0021d3 group: arrow \ code: 0x002195 group: arrow \ code: 0x0021d5 group: arrow -\ code: 0x0027e8 group: punctuation abbrev: <. -\ code: 0x0027e9 group: punctuation abbrev: .> -\ code: 0x002308 group: punctuation -\ code: 0x002309 group: punctuation -\ code: 0x00230a group: punctuation -\ code: 0x00230b group: punctuation +\ code: 0x0027e8 group: punctuation abbrev: << +\ code: 0x0027e9 group: punctuation abbrev: >> +\ code: 0x002308 group: punctuation abbrev: [. +\ code: 0x002309 group: punctuation abbrev: .] +\ code: 0x00230a group: punctuation abbrev: [. +\ code: 0x00230b group: punctuation abbrev: .] \ code: 0x002987 group: punctuation abbrev: (| \ code: 0x002988 group: punctuation abbrev: |) \ code: 0x0027e6 group: punctuation abbrev: [| \ code: 0x0027e7 group: punctuation abbrev: |] -\ code: 0x002983 group: punctuation abbrev: {. -\ code: 0x002984 group: punctuation abbrev: .} +\ code: 0x002983 group: punctuation abbrev: {| +\ code: 0x002984 group: punctuation abbrev: |} \ code: 0x0000ab group: punctuation abbrev: << \ code: 0x0000bb group: punctuation abbrev: >> \ code: 0x0022a5 group: logic \ code: 0x0022a4 group: logic -\ code: 0x002227 group: logic abbrev: /\ +\ code: 0x002227 group: logic abbrev: /\ abbrev: & \ code: 0x0022c0 group: logic abbrev: !! -\ code: 0x002228 group: logic abbrev: \/ +\ code: 0x002228 group: logic abbrev: \/ abbrev: | \ code: 0x0022c1 group: logic abbrev: ?? -\ code: 0x002200 group: logic abbrev: ! -\ code: 0x002203 group: logic abbrev: ? +\ code: 0x002200 group: logic abbrev: ! abbrev: ALL +\ code: 0x002203 group: logic abbrev: ? abbrev: EX \ code: 0x002204 group: logic abbrev: ~? \ code: 0x0000ac group: logic abbrev: ~ \ code: 0x0025a1 group: logic \ code: 0x0025c7 group: logic \ code: 0x0022a2 group: relation abbrev: |- \ code: 0x0022a8 group: relation abbrev: |= -\ code: 0x0022a9 group: relation abbrev: ||- -\ code: 0x0022ab group: relation abbrev: ||= +\ code: 0x0022a9 group: relation abbrev: |- +\ code: 0x0022ab group: relation abbrev: |= \ code: 0x0022a3 group: relation abbrev: -| \ code: 0x00221a group: relation \ code: 0x002264 group: relation abbrev: <= \ code: 0x002265 group: relation abbrev: >= -\ code: 0x00226a group: relation -\ code: 0x00226b group: relation +\ code: 0x00226a group: relation abbrev: << +\ code: 0x00226b group: relation abbrev: >> \ code: 0x002272 group: relation \ code: 0x002273 group: relation \ code: 0x002a85 group: relation @@ -240,21 +240,21 @@ \ code: 0x002290 group: relation \ code: 0x002291 group: relation abbrev: [= \ code: 0x002292 group: relation abbrev: =] -\ code: 0x002229 group: operator -\ code: 0x0022c2 group: operator -\ code: 0x00222a group: operator -\ code: 0x0022c3 group: operator +\ code: 0x002229 group: operator abbrev: Int +\ code: 0x0022c2 group: operator abbrev: Inter +\ code: 0x00222a group: operator abbrev: Un +\ code: 0x0022c3 group: operator abbrev: Union \ code: 0x002294 group: operator -\ code: 0x002a06 group: operator +\ code: 0x002a06 group: operator abbrev: SUP \ code: 0x002293 group: operator -\ code: 0x002a05 group: operator +\ code: 0x002a05 group: operator abbrev: INF \ code: 0x002216 group: operator \ code: 0x00221d group: operator \ code: 0x00228e group: operator \ code: 0x002a04 group: operator \ code: 0x002260 group: relation abbrev: ~= \ code: 0x00223c group: relation -\ code: 0x002250 group: relation +\ code: 0x002250 group: relation abbrev: .= \ code: 0x002243 group: relation \ code: 0x002248 group: relation \ code: 0x00224d group: relation @@ -269,10 +269,10 @@ \ code: 0x00227c group: relation \ code: 0x00227d group: relation \ code: 0x002225 group: punctuation abbrev: || -\ code: 0x0000a6 group: punctuation +\ code: 0x0000a6 group: punctuation abbrev: || \ code: 0x0000b1 group: operator \ code: 0x002213 group: operator -\ code: 0x0000d7 group: operator +\ code: 0x0000d7 group: operator abbrev: * \
code: 0x0000f7 group: operator \ code: 0x0022c5 group: operator \ code: 0x0022c6 group: operator diff -r a1cf42366cea -r d0e4c8f73541 lib/Tools/components --- a/lib/Tools/components Fri Aug 30 13:23:23 2013 +0200 +++ b/lib/Tools/components Fri Aug 30 13:46:32 2013 +0200 @@ -134,7 +134,7 @@ fi if [ -e "${FULL_NAME}.tar.gz" ]; then echo "Unpacking \"${FULL_NAME}.tar.gz\"" - tar -C "$(dirname "$FULL_NAME")" -x -f "${FULL_NAME}.tar.gz" + tar -C "$(dirname "$FULL_NAME")" -x -f "${FULL_NAME}.tar.gz" || exit 2 fi fi done diff -r a1cf42366cea -r d0e4c8f73541 src/Pure/General/symbol.scala --- a/src/Pure/General/symbol.scala Fri Aug 30 13:23:23 2013 +0200 +++ b/src/Pure/General/symbol.scala Fri Aug 30 13:46:32 2013 +0200 @@ -216,27 +216,28 @@ private val No_Decl = new Regex("""(?xs) ^\s* (?: \#.* )? $ """) private val Key = new Regex("""(?xs) (.+): """) - private def read_decl(decl: String): (Symbol, Map[String, String]) = + private def read_decl(decl: String): (Symbol, Properties.T) = { def err() = error("Bad symbol declaration: " + decl) - def read_props(props: List[String]): Map[String, String] = + def read_props(props: List[String]): Properties.T = { props match { - case Nil => Map() + case Nil => Nil case _ :: Nil => err() - case Key(x) :: y :: rest => read_props(rest) + (x -> y) + case Key(x) :: y :: rest => (x -> y) :: read_props(rest) case _ => err() } } decl.split("\\s+").toList match { - case sym :: props if sym.length > 1 && !is_malformed(sym) => (sym, read_props(props)) + case sym :: props if sym.length > 1 && !is_malformed(sym) => + (sym, read_props(props)) case _ => err() } } - private val symbols: List[(Symbol, Map[String, String])] = - (((List.empty[(Symbol, Map[String, String])], Set.empty[Symbol]) /: + private val symbols: List[(Symbol, Properties.T)] = + (((List.empty[(Symbol, Properties.T)], Set.empty[Symbol]) /: split_lines(symbols_spec).reverse) { case (res, No_Decl()) => res case ((list, known), decl) => @@ -255,28 +256,35 @@ } val groups: List[(String, List[Symbol])] = - symbols.map({ case (sym, props) => (sym, props.getOrElse("group", "unsorted")) }) + symbols.map({ case (sym, props) => + val gs = for (("group", g) <- props) yield g + if (gs.isEmpty) List(sym -> "unsorted") else gs.map(sym -> _) + }).flatten .groupBy(_._2).toList.map({ case (group, list) => (group, list.map(_._1)) }) .sortBy(_._1) - val abbrevs: Map[Symbol, String] = - Map(( - for ((sym, props) <- symbols if props.isDefinedAt("abbrev")) - yield (sym -> props("abbrev"))): _*) + val abbrevs: Multi_Map[Symbol, String] = + Multi_Map(( + for { + (sym, props) <- symbols + ("abbrev", a) <- props.reverse + } yield (sym -> a)): _*) /* recoding */ + private val Code = new Properties.String("code") private val (decoder, encoder) = { val mapping = for { (sym, props) <- symbols code = - try { Integer.decode(props("code")).intValue } - catch { - case _: NoSuchElementException => error("Missing code for symbol " + sym) - case _: NumberFormatException => error("Bad code for symbol " + sym) + props match { + case Code(s) => + try { Integer.decode(s).intValue } + catch { case _: NumberFormatException => error("Bad code for symbol " + sym) } + case _ => error("Missing code for symbol " + sym) } ch = new String(Character.toChars(code)) } yield { @@ -305,10 +313,9 @@ /* user fonts */ + private val Font = new Properties.String("font") val fonts: Map[Symbol, String] = - recode_map(( - for ((sym, props) <- symbols if props.isDefinedAt("font")) - yield (sym -> props("font"))): _*) + recode_map((for ((sym, Font(font)) <- symbols) yield (sym -> font)): _*) val font_names: List[String] = Set(fonts.toList.map(_._2): _*).toList val font_index: Map[String, Int] = Map((font_names zip (0 until font_names.length).toList): _*) @@ -376,7 +383,7 @@ def names: Map[Symbol, String] = symbols.names def groups: List[(String, List[Symbol])] = symbols.groups - def abbrevs: Map[Symbol, String] = symbols.abbrevs + def abbrevs: Multi_Map[Symbol, String] = symbols.abbrevs def decode(text: String): String = symbols.decode(text) def encode(text: String): String = symbols.encode(text) diff -r a1cf42366cea -r d0e4c8f73541 src/Pure/Isar/completion.scala --- a/src/Pure/Isar/completion.scala Fri Aug 30 13:23:23 2013 +0200 +++ b/src/Pure/Isar/completion.scala Fri Aug 30 13:46:32 2013 +0200 @@ -11,7 +11,7 @@ object Completion { - /* items */ + /* result */ sealed case class Item( original: String, @@ -20,6 +20,8 @@ immediate: Boolean) { override def toString: String = description } + sealed case class Result(original: String, unique: Boolean, items: List[Item]) + /* init */ @@ -39,12 +41,14 @@ def reverse_symbol: Parser[String] = """>[A-Za-z0-9_']+\^?<\\""".r def reverse_symb: Parser[String] = """[A-Za-z0-9_']{2,}\^?<\\""".r def escape: Parser[String] = """[a-zA-Z0-9_']+\\""".r - def word: Parser[String] = """[a-zA-Z0-9_']{3,}""".r + def word: Parser[String] = word_regex + def word3: Parser[String] = """[a-zA-Z0-9_']{3,}""".r - def read(in: CharSequence): Option[String] = + def read(explicit: Boolean, in: CharSequence): Option[String] = { + val parse_word = if (explicit) word else word3 val reverse_in = new Library.Reverse(in) - parse((reverse_symbol | reverse_symb | escape | word) ^^ (_.reverse), reverse_in) match { + parse((reverse_symbol | reverse_symb | escape | parse_word) ^^ (_.reverse), reverse_in) match { case Success(result, _) => Some(result) case _ => None } @@ -54,9 +58,9 @@ final class Completion private( words_lex: Scan.Lexicon = Scan.Lexicon.empty, - words_map: Map[String, String] = Map.empty, + words_map: Multi_Map[String, String] = Multi_Map.empty, abbrevs_lex: Scan.Lexicon = Scan.Lexicon.empty, - abbrevs_map: Map[String, (String, String)] = Map.empty) + abbrevs_map: Multi_Map[String, (String, String)] = Multi_Map.empty) { /* adding stuff */ @@ -74,10 +78,10 @@ val words = (for ((x, _) <- Symbol.names) yield (x, x)).toList ::: (for ((x, y) <- Symbol.names) yield ("\\" + y, x)).toList ::: - (for ((x, y) <- Symbol.abbrevs if Completion.is_word(y)) yield (y, x)).toList + (for ((x, y) <- Symbol.abbrevs.iterator if Completion.is_word(y)) yield (y, x)).toList val abbrs = - (for ((x, y) <- Symbol.abbrevs if !Completion.is_word(y)) + (for ((x, y) <- Symbol.abbrevs.iterator if !Completion.is_word(y)) yield (y.reverse.toString, (y, x))).toList new Completion( @@ -90,17 +94,20 @@ /* complete */ - def complete(decode: Boolean, line: CharSequence): Option[(String, List[Completion.Item])] = + def complete(decode: Boolean, explicit: Boolean, line: CharSequence): Option[Completion.Result] = { val raw_result = abbrevs_lex.parse(abbrevs_lex.keyword, new Library.Reverse(line)) match { case abbrevs_lex.Success(reverse_a, _) => - val (word, c) = abbrevs_map(reverse_a) - Some(word, List(c)) + val abbrevs = abbrevs_map.get_list(reverse_a) + abbrevs match { + case Nil => None + case (a, _) :: _ => Some((a, abbrevs.map(_._2))) + } case _ => - Completion.Parse.read(line) match { + Completion.Parse.read(explicit, line) match { case Some(word) => - words_lex.completions(word).map(words_map(_)) match { + words_lex.completions(word).map(words_map.get_list(_)).flatten match { case Nil => None case cs => Some(word, cs.sorted) } @@ -109,11 +116,14 @@ } raw_result match { case Some((word, cs)) => - val ds = (if (decode) cs.map(Symbol.decode(_)).sorted else cs) + val ds = (if (decode) cs.map(Symbol.decode(_)).sorted else cs).filter(_ != word) if (ds.isEmpty) None else { - val immediate = !Completion.is_word(word) - Some((word, ds.map(s => Completion.Item(word, s, s, immediate)))) + val immediate = + !Completion.is_word(word) && + Character.codePointCount(word, 0, word.length) > 1 + val items = ds.map(s => Completion.Item(word, s, s, explicit || immediate)) + Some(Completion.Result(word, cs.length == 1, items)) } case None => None } diff -r a1cf42366cea -r d0e4c8f73541 src/Tools/WWW_Find/etc/symbols --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Tools/WWW_Find/etc/symbols Fri Aug 30 13:46:32 2013 +0200 @@ -0,0 +1,357 @@ +# Default interpretation of some Isabelle symbols + +\ code: 0x01d7ec group: digit +\ code: 0x01d7ed group: digit +\ code: 0x01d7ee group: digit +\ code: 0x01d7ef group: digit +\ code: 0x01d7f0 group: digit +\ code: 0x01d7f1 group: digit +\ code: 0x01d7f2 group: digit +\ code: 0x01d7f3 group: digit +\ code: 0x01d7f4 group: digit +\ code: 0x01d7f5 group: digit +\ code: 0x01d49c group: letter +\ code: 0x00212c group: letter +\ code: 0x01d49e group: letter +\ code: 0x01d49f group: letter +\ code: 0x002130 group: letter +\ code: 0x002131 group: letter +\ code: 0x01d4a2 group: letter +\ code: 0x00210b group: letter +\ code: 0x002110 group: letter +\ code: 0x01d4a5 group: letter +\ code: 0x01d4a6 group: letter +\ code: 0x002112 group: letter +\ code: 0x002133 group: letter +\ code: 0x01d4a9 group: letter +\ code: 0x01d4aa group: letter +\

code: 0x01d5c9 group: letter +\ code: 0x01d5ca group: letter +\ code: 0x01d5cb group: letter +\ code: 0x01d5cc group: letter +\ code: 0x01d5cd group: letter +\ code: 0x01d5ce group: letter +\ code: 0x01d5cf group: letter +\ code: 0x01d5d0 group: letter +\ code: 0x01d5d1 group: letter +\ code: 0x01d5d2 group: letter +\ code: 0x01d5d3 group: letter +\ code: 0x01d504 group: letter +\ code: 0x01d505 group: letter +\ code: 0x00212d group: letter +\

code: 0x01d507 group: letter +\ code: 0x01d508 group: letter +\ code: 0x01d509 group: letter +\ code: 0x01d50a group: letter +\ code: 0x00210c group: letter +\ code: 0x002111 group: letter +\ code: 0x01d50d group: letter +\ code: 0x01d50e group: letter +\ code: 0x01d50f group: letter +\ code: 0x01d510 group: letter +\ code: 0x01d511 group: letter +\ code: 0x01d512 group: letter +\ code: 0x01d513 group: letter +\ code: 0x01d514 group: letter +\ code: 0x00211c group: letter +\ code: 0x01d516 group: letter +\ code: 0x01d517 group: letter +\ code: 0x01d518 group: letter +\ code: 0x01d519 group: letter +\ code: 0x01d51a group: letter +\ code: 0x01d51b group: letter +\ code: 0x01d51c group: letter +\ code: 0x002128 group: letter +\ code: 0x01d51e group: letter +\ code: 0x01d51f group: letter +\ code: 0x01d520 group: letter +\
code: 0x01d521 group: letter +\ code: 0x01d522 group: letter +\ code: 0x01d523 group: letter +\ code: 0x01d524 group: letter +\ code: 0x01d525 group: letter +\ code: 0x01d526 group: letter +\ code: 0x01d527 group: letter +\ code: 0x01d528 group: letter +\ code: 0x01d529 group: letter +\ code: 0x01d52a group: letter +\ code: 0x01d52b group: letter +\ code: 0x01d52c group: letter +\ code: 0x01d52d group: letter +\ code: 0x01d52e group: letter +\ code: 0x01d52f group: letter +\ code: 0x01d530 group: letter +\ code: 0x01d531 group: letter +\ code: 0x01d532 group: letter +\ code: 0x01d533 group: letter +\ code: 0x01d534 group: letter +\ code: 0x01d535 group: letter +\ code: 0x01d536 group: letter +\ code: 0x01d537 group: letter +\ code: 0x0003b1 group: greek +\ code: 0x0003b2 group: greek +\ code: 0x0003b3 group: greek +\ code: 0x0003b4 group: greek +\ code: 0x0003b5 group: greek +\ code: 0x0003b6 group: greek +\ code: 0x0003b7 group: greek +\ code: 0x0003b8 group: greek +\ code: 0x0003b9 group: greek +\ code: 0x0003ba group: greek +\ code: 0x0003bb group: greek abbrev: % +\ code: 0x0003bc group: greek +\ code: 0x0003bd group: greek +\ code: 0x0003be group: greek +\ code: 0x0003c0 group: greek +\ code: 0x0003c1 group: greek +\ code: 0x0003c3 group: greek +\ code: 0x0003c4 group: greek +\ code: 0x0003c5 group: greek +\ code: 0x0003c6 group: greek +\ code: 0x0003c7 group: greek +\ code: 0x0003c8 group: greek +\ code: 0x0003c9 group: greek +\ code: 0x000393 group: greek +\ code: 0x000394 group: greek +\ code: 0x000398 group: greek +\ code: 0x00039b group: greek +\ code: 0x00039e group: greek +\ code: 0x0003a0 group: greek +\ code: 0x0003a3 group: greek +\ code: 0x0003a5 group: greek +\ code: 0x0003a6 group: greek +\ code: 0x0003a8 group: greek +\ code: 0x0003a9 group: greek +\ code: 0x01d539 group: letter +\ code: 0x002102 group: letter +\ code: 0x002115 group: letter +\ code: 0x00211a group: letter +\ code: 0x00211d group: letter +\ code: 0x002124 group: letter +\ code: 0x002190 group: arrow +\ code: 0x0027f5 group: arrow +\ code: 0x002192 group: arrow abbrev: -> +\ code: 0x0027f6 group: arrow abbrev: --> +\ code: 0x0021d0 group: arrow +\ code: 0x0027f8 group: arrow +\ code: 0x0021d2 group: arrow abbrev: => +\ code: 0x0027f9 group: arrow abbrev: ==> +\ code: 0x002194 group: arrow +\ code: 0x0027f7 group: arrow abbrev: <-> +\ code: 0x0021d4 group: arrow +\ code: 0x0027fa group: arrow abbrev: <=> +\ code: 0x0021a6 group: arrow abbrev: |-> +\ code: 0x0027fc group: arrow abbrev: |--> +\ code: 0x002500 group: arrow +\ code: 0x002550 group: arrow +\ code: 0x0021a9 group: arrow +\ code: 0x0021aa group: arrow +\ code: 0x0021bd group: arrow +\ code: 0x0021c1 group: arrow +\ code: 0x0021bc group: arrow +\ code: 0x0021c0 group: arrow +\ code: 0x0021cc group: arrow +\ code: 0x00219d group: arrow abbrev: ~> +\ code: 0x0021c3 group: arrow +\ code: 0x0021c2 group: arrow +\ code: 0x0021bf group: arrow +#\ code: 0x0021be group: arrow +\ code: 0x0021be group: punctuation +\ code: 0x002237 group: punctuation +\ code: 0x002191 group: arrow +\ code: 0x0021d1 group: arrow +\ code: 0x002193 group: arrow +\ code: 0x0021d3 group: arrow +\ code: 0x002195 group: arrow +\ code: 0x0021d5 group: arrow +\ code: 0x0027e8 group: punctuation abbrev: <. +\ code: 0x0027e9 group: punctuation abbrev: .> +\ code: 0x002308 group: punctuation +\ code: 0x002309 group: punctuation +\ code: 0x00230a group: punctuation +\ code: 0x00230b group: punctuation +\ code: 0x002987 group: punctuation abbrev: (| +\ code: 0x002988 group: punctuation abbrev: |) +\ code: 0x0027e6 group: punctuation abbrev: [| +\ code: 0x0027e7 group: punctuation abbrev: |] +\ code: 0x002983 group: punctuation abbrev: {. +\ code: 0x002984 group: punctuation abbrev: .} +\ code: 0x0000ab group: punctuation abbrev: << +\ code: 0x0000bb group: punctuation abbrev: >> +\ code: 0x0022a5 group: logic +\ code: 0x0022a4 group: logic +\ code: 0x002227 group: logic abbrev: /\ +\ code: 0x0022c0 group: logic abbrev: !! +\ code: 0x002228 group: logic abbrev: \/ +\ code: 0x0022c1 group: logic abbrev: ?? +\ code: 0x002200 group: logic abbrev: ! +\ code: 0x002203 group: logic abbrev: ? +\ code: 0x002204 group: logic abbrev: ~? +\ code: 0x0000ac group: logic abbrev: ~ +\ code: 0x0025a1 group: logic +\ code: 0x0025c7 group: logic +\ code: 0x0022a2 group: relation abbrev: |- +\ code: 0x0022a8 group: relation abbrev: |= +\ code: 0x0022a9 group: relation abbrev: ||- +\ code: 0x0022ab group: relation abbrev: ||= +\ code: 0x0022a3 group: relation abbrev: -| +\ code: 0x00221a group: relation +\ code: 0x002264 group: relation abbrev: <= +\ code: 0x002265 group: relation abbrev: >= +\ code: 0x00226a group: relation +\ code: 0x00226b group: relation +\ code: 0x002272 group: relation +\ code: 0x002273 group: relation +\ code: 0x002a85 group: relation +\ code: 0x002a86 group: relation +\ code: 0x002208 group: relation abbrev: : +\ code: 0x002209 group: relation abbrev: ~: +\ code: 0x002282 group: relation +\ code: 0x002283 group: relation +\ code: 0x002286 group: relation abbrev: (= +\ code: 0x002287 group: relation abbrev: =) +\ code: 0x00228f group: relation +\ code: 0x002290 group: relation +\ code: 0x002291 group: relation abbrev: [= +\ code: 0x002292 group: relation abbrev: =] +\ code: 0x002229 group: operator +\ code: 0x0022c2 group: operator +\ code: 0x00222a group: operator +\ code: 0x0022c3 group: operator +\ code: 0x002294 group: operator +\ code: 0x002a06 group: operator +\ code: 0x002293 group: operator +\ code: 0x002a05 group: operator +\ code: 0x002216 group: operator +\ code: 0x00221d group: operator +\ code: 0x00228e group: operator +\ code: 0x002a04 group: operator +\ code: 0x002260 group: relation abbrev: ~= +\ code: 0x00223c group: relation +\ code: 0x002250 group: relation +\ code: 0x002243 group: relation +\ code: 0x002248 group: relation +\ code: 0x00224d group: relation +\ code: 0x002245 group: relation +\ code: 0x002323 group: relation +\ code: 0x002261 group: relation abbrev: == +\ code: 0x002322 group: relation +\ code: 0x0022c8 +\ code: 0x002a1d +\ code: 0x00227a group: relation +\ code: 0x00227b group: relation +\ code: 0x00227c group: relation +\ code: 0x00227d group: relation +\ code: 0x002225 group: punctuation abbrev: || +\ code: 0x0000a6 group: punctuation +\ code: 0x0000b1 group: operator +\ code: 0x002213 group: operator +\ code: 0x0000d7 group: operator +\
code: 0x0000f7 group: operator +\ code: 0x0022c5 group: operator +\ code: 0x0022c6 group: operator +\ code: 0x002219 group: operator +\ code: 0x002218 group: operator +\ code: 0x002020 +\ code: 0x002021 +\ code: 0x0022b2 group: relation +\ code: 0x0022b3 group: relation +\ code: 0x0022b4 group: relation +\ code: 0x0022b5 group: relation +\ code: 0x0025c3 group: relation +\ code: 0x0025b9 group: relation +\ code: 0x0025b3 group: relation +\ code: 0x00225c group: relation +\ code: 0x002295 group: operator abbrev: +o +\ code: 0x002a01 group: operator abbrev: +O +\ code: 0x002297 group: operator abbrev: *o +\ code: 0x002a02 group: operator abbrev: *O +\ code: 0x002299 group: operator abbrev: .o +\ code: 0x002a00 group: operator abbrev: .O +\ code: 0x002296 group: operator abbrev: -o +\ code: 0x002298 group: operator abbrev: /o +\ code: 0x002026 group: punctuation abbrev: ... +\ code: 0x0022ef group: punctuation +\ code: 0x002211 group: operator abbrev: SUM +\ code: 0x00220f group: operator abbrev: PROD +\ code: 0x002210 group: operator +\ code: 0x00221e +\ code: 0x00222b group: operator +\ code: 0x00222e group: operator +\ code: 0x002663 +\ code: 0x002662 +\ code: 0x002661 +\ code: 0x002660 +\ code: 0x002135 +\ code: 0x002205 +\ code: 0x002207 +\ code: 0x002202 +\ code: 0x00266d +\ code: 0x00266e +\ code: 0x00266f +\ code: 0x002220 +\ code: 0x0000a9 +\ code: 0x0000ae +\ code: 0x0000ad group: punctuation +\ code: 0x0000af group: punctuation +\ code: 0x0000bc group: digit +\ code: 0x0000bd group: digit +\ code: 0x0000be group: digit +\ code: 0x0000aa +\ code: 0x0000ba +\
code: 0x0000a7 +\ code: 0x0000b6 +\ code: 0x0000a1 +\ code: 0x0000bf +\ code: 0x0020ac +\ code: 0x0000a3 +\ code: 0x0000a5 +\ code: 0x0000a2 +\ code: 0x0000a4 +\ code: 0x0000b0 +\ code: 0x002a3f group: operator +\ code: 0x002127 group: operator +\ code: 0x0025ca +\ code: 0x002118 +\ code: 0x002240 group: relation +\ code: 0x0022c4 +\ code: 0x0000b4 +\ code: 0x000131 +\ code: 0x0000a8 +\ code: 0x0000b8 +\ code: 0x0002dd +\ code: 0x0003f5 +\<^sub> code: 0x0021e9 group: control font: IsabelleText +\<^sup> code: 0x0021e7 group: control font: IsabelleText +\<^bold> code: 0x002759 group: control font: IsabelleText +\<^bsub> code: 0x0021d8 group: control_block font: IsabelleText abbrev: =_( +\<^esub> code: 0x0021d9 group: control_block font: IsabelleText abbrev: =_) +\<^bsup> code: 0x0021d7 group: control_block font: IsabelleText abbrev: =^( +\<^esup> code: 0x0021d6 group: control_block font: IsabelleText abbrev: =^) + diff -r a1cf42366cea -r d0e4c8f73541 src/Tools/WWW_Find/unicode_symbols.ML --- a/src/Tools/WWW_Find/unicode_symbols.ML Fri Aug 30 13:23:23 2013 +0200 +++ b/src/Tools/WWW_Find/unicode_symbols.ML Fri Aug 30 13:46:32 2013 +0200 @@ -1,7 +1,7 @@ (* Title: Tools/WWW_Find/unicode_symbols.ML Author: Timothy Bourke, NICTA -Ad-hoc parsing of ~~/etc/symbols. +Parsing of private etc/symbols. *) signature UNICODE_SYMBOLS = @@ -176,7 +176,8 @@ end; local -val (fromsym, fromabbr, tosym, toabbr) = read_symbols (Path.explode "~~/etc/symbols"); +val (fromsym, fromabbr, tosym, toabbr) = + read_symbols (Path.explode "~~/src/Tools/WWW_Find/etc/symbols"); in val symbol_to_unicode = Symtab.lookup fromsym; val abbrev_to_unicode = Symtab.lookup fromabbr; diff -r a1cf42366cea -r d0e4c8f73541 src/Tools/jEdit/src/completion_popup.scala --- a/src/Tools/jEdit/src/completion_popup.scala Fri Aug 30 13:23:23 2013 +0200 +++ b/src/Tools/jEdit/src/completion_popup.scala Fri Aug 30 13:46:32 2013 +0200 @@ -91,7 +91,7 @@ } } - def action(immediate: Boolean) + def action(immediate: Boolean = false, explicit: Boolean = false) { val view = text_area.getView val layered = view.getLayeredPane @@ -106,31 +106,33 @@ val start = buffer.getLineStartOffset(line) val text = buffer.getSegment(start, caret - start) - syntax.completion.complete(Isabelle_Encoding.is_active(buffer), text) match { - case Some((_, List(item))) if item.immediate && immediate => - insert(item) - - case Some((original, items)) => - val font = - painter.getFont.deriveFont(Rendering.font_size("jedit_popup_font_scale")) + val decode = Isabelle_Encoding.is_active(buffer) + syntax.completion.complete(decode, explicit, text) match { + case Some(result) => + if (result.unique && result.items.head.immediate && immediate) + insert(result.items.head) + else { + val font = + painter.getFont.deriveFont(Rendering.font_size("jedit_popup_font_scale")) - val loc1 = text_area.offsetToXY(caret - original.length) - if (loc1 != null) { - val loc2 = - SwingUtilities.convertPoint(painter, - loc1.x, loc1.y + painter.getFontMetrics.getHeight, layered) + val loc1 = text_area.offsetToXY(caret - result.original.length) + if (loc1 != null) { + val loc2 = + SwingUtilities.convertPoint(painter, + loc1.x, loc1.y + painter.getFontMetrics.getHeight, layered) - val completion = - new Completion_Popup(layered, loc2, font, items) { - override def complete(item: Completion.Item) { insert(item) } - override def propagate(evt: KeyEvent) { - JEdit_Lib.propagate_key(view, evt) - input(evt) + val completion = + new Completion_Popup(layered, loc2, font, result.items) { + override def complete(item: Completion.Item) { insert(item) } + override def propagate(evt: KeyEvent) { + JEdit_Lib.propagate_key(view, evt) + input(evt) + } + override def refocus() { text_area.requestFocus } } - override def refocus() { text_area.requestFocus } - } - completion_popup = Some(completion) - completion.show_popup() + completion_popup = Some(completion) + completion.show_popup() + } } case None => } @@ -161,7 +163,7 @@ if (PIDE.options.seconds("jedit_completion_delay").is_zero && !special) { input_delay.revoke() - action(PIDE.options.bool("jedit_completion_immediate")) + action(immediate = PIDE.options.bool("jedit_completion_immediate")) } else input_delay.invoke() } @@ -170,7 +172,7 @@ private val input_delay = Swing_Thread.delay_last(PIDE.options.seconds("jedit_completion_delay")) { - action(false) + action() } diff -r a1cf42366cea -r d0e4c8f73541 src/Tools/jEdit/src/isabelle.scala --- a/src/Tools/jEdit/src/isabelle.scala Fri Aug 30 13:23:23 2013 +0200 +++ b/src/Tools/jEdit/src/isabelle.scala Fri Aug 30 13:46:32 2013 +0200 @@ -168,7 +168,8 @@ def complete(view: View) { Completion_Popup.Text_Area(view.getTextArea) match { - case Some(text_area_completion) => text_area_completion.action(true) + case Some(text_area_completion) => + text_area_completion.action(immediate = true, explicit = true) case None => CompleteWord.completeWord(view) } } diff -r a1cf42366cea -r d0e4c8f73541 src/Tools/jEdit/src/symbols_dockable.scala --- a/src/Tools/jEdit/src/symbols_dockable.scala Fri Aug 30 13:23:23 2013 +0200 +++ b/src/Tools/jEdit/src/symbols_dockable.scala Fri Aug 30 13:46:32 2013 +0200 @@ -43,8 +43,7 @@ } tooltip = JEdit_Lib.wrap_tooltip( - symbol + - (if (Symbol.abbrevs.isDefinedAt(symbol)) "\nabbrev: " + Symbol.abbrevs(symbol) else "")) + cat_lines(symbol :: Symbol.abbrevs.get_list(symbol).map(a => "abbrev: " + a))) } private class Reset_Component extends Button

code: 0x01d4ab group: letter +\ code: 0x01d4ac group: letter +\ code: 0x00211b group: letter +\ code: 0x01d4ae group: letter +\ code: 0x01d4af group: letter +\ code: 0x01d4b0 group: letter +\ code: 0x01d4b1 group: letter +\ code: 0x01d4b2 group: letter +\ code: 0x01d4b3 group: letter +\ code: 0x01d4b4 group: letter +\ code: 0x01d4b5 group: letter +\ code: 0x01d5ba group: letter +\ code: 0x01d5bb group: letter +\ code: 0x01d5bc group: letter +\ code: 0x01d5bd group: letter +\ code: 0x01d5be group: letter +\ code: 0x01d5bf group: letter +\ code: 0x01d5c0 group: letter +\ code: 0x01d5c1 group: letter +\ code: 0x01d5c2 group: letter +\ code: 0x01d5c3 group: letter +\ code: 0x01d5c4 group: letter +\ code: 0x01d5c5 group: letter +\ code: 0x01d5c6 group: letter +\ code: 0x01d5c7 group: letter +\ code: 0x01d5c8 group: letter +\