--- a/src/Pure/General/word.scala Mon Jul 11 19:03:08 2016 +0200
+++ b/src/Pure/General/word.scala Mon Jul 11 20:37:28 2016 +0200
@@ -96,4 +96,10 @@
def explode(text: String): List[String] =
explode(Character.isWhitespace(_), text)
+
+
+ /* brackets */
+
+ val open_brackets = "([{«‹⟨⌈⌊⦇⟦⦃"
+ val close_brackets = ")]}»›⟩⌉⌋⦈⟧⦄"
}
--- a/src/Pure/Isar/token.scala Mon Jul 11 19:03:08 2016 +0200
+++ b/src/Pure/Isar/token.scala Mon Jul 11 20:37:28 2016 +0200
@@ -228,6 +228,8 @@
def is_command(name: String): Boolean = kind == Token.Kind.COMMAND && source == name
def is_keyword: Boolean = kind == Token.Kind.KEYWORD
def is_keyword(name: String): Boolean = kind == Token.Kind.KEYWORD && source == name
+ def is_keyword(name: Char): Boolean =
+ kind == Token.Kind.KEYWORD && source.length == 1 && source(0) == name
def is_delimiter: Boolean = is_keyword && !Symbol.is_ascii_identifier(source)
def is_ident: Boolean = kind == Token.Kind.IDENT
def is_sym_ident: Boolean = kind == Token.Kind.SYM_IDENT
@@ -256,6 +258,9 @@
source.startsWith(Symbol.open) ||
source.startsWith(Symbol.open_decoded))
+ def is_open_bracket: Boolean = is_keyword && Word.open_brackets.exists(is_keyword(_))
+ def is_close_bracket: Boolean = is_keyword && Word.close_brackets.exists(is_keyword(_))
+
def is_begin: Boolean = is_keyword("begin")
def is_end: Boolean = is_command("end")
--- a/src/Tools/jEdit/src/text_structure.scala Mon Jul 11 19:03:08 2016 +0200
+++ b/src/Tools/jEdit/src/text_structure.scala Mon Jul 11 20:37:28 2016 +0200
@@ -68,6 +68,9 @@
def prev_span: Iterator[Token] =
nav.reverse_iterator(prev_line).map(_.info).takeWhile(tok => !tok.is_command)
+ def prev_line_span: Iterator[Token] =
+ nav.reverse_iterator(prev_line, 1).map(_.info).takeWhile(tok => !tok.is_command)
+
def line_indent(line: Int): Int =
if (line < 0 || line >= buffer.getLineCount) 0
@@ -84,6 +87,13 @@
if (keywords.is_command(tok, Keyword.proof_enclose) || tok.is_begin) indent_size
else 0
+ def indent_brackets: Int =
+ (0 /: prev_line_span)(
+ { case (i, tok) =>
+ if (tok.is_open_bracket) i + indent_size
+ else if (tok.is_close_bracket) i - indent_size
+ else i })
+
def indent_extra: Int =
if (prev_span.exists(keywords.is_quasi_command(_))) indent_size
else 0
@@ -110,7 +120,7 @@
val indent =
head_token(current_line) match {
- case None => indent_structure + indent_extra
+ case None => indent_structure + indent_brackets + indent_extra
case Some(tok) =>
if (keywords.is_before_command(tok) ||
keywords.is_command(tok, Keyword.theory)) indent_begin
@@ -124,10 +134,10 @@
case (true, false) => - indent_extra
case (false, true) => indent_extra
}
- line_indent(prev_line) - indent_offset(tok) + extra
+ line_indent(prev_line) - indent_offset(tok) + indent_brackets + extra
case Some(prev_tok) =>
- indent_structure - indent_offset(tok) - indent_offset(prev_tok) -
- indent_indent(prev_tok) + indent_size
+ indent_structure - indent_offset(tok) - indent_offset(prev_tok) +
+ indent_brackets - indent_indent(prev_tok) + indent_size
}
}
}