# HG changeset patch # User wenzelm # Date 1498248231 -7200 # Node ID 201d42f67bba30925c8982ae19c00aa5eaaab66e # Parent 148d616260143ccc2ceccccd0244e0634d1a020f indentation of keywords after input; diff -r 148d61626014 -r 201d42f67bba src/Tools/jEdit/etc/options --- a/src/Tools/jEdit/etc/options Fri Jun 23 16:16:41 2017 +0200 +++ b/src/Tools/jEdit/etc/options Fri Jun 23 22:03:51 2017 +0200 @@ -39,6 +39,9 @@ section "Indentation" +public option jedit_indent_input : bool = true + -- "indentation of Isabelle keywords after input (typed character or completion)" + public option jedit_indent_newline : bool = true -- "indentation of Isabelle keywords on ENTER (action isabelle.newline)" diff -r 148d61626014 -r 201d42f67bba src/Tools/jEdit/src/completion_popup.scala --- a/src/Tools/jEdit/src/completion_popup.scala Fri Jun 23 16:16:41 2017 +0200 +++ b/src/Tools/jEdit/src/completion_popup.scala Fri Jun 23 22:03:51 2017 +0200 @@ -218,6 +218,7 @@ buffer.remove(range.start, range.length) buffer.insert(range.start, item.replacement) text_area.moveCaretPosition(range.start + item.replacement.length + item.move) + Isabelle.indent_input(text_area) } case _ => } @@ -346,11 +347,13 @@ { GUI_Thread.require {} - if (PIDE.options.bool("jedit_completion")) { - if (!evt.isConsumed) { + if (!evt.isConsumed) { + val backspace = evt.getKeyChar == '\b' + val special = JEdit_Lib.special_key(evt) + + if (PIDE.options.bool("jedit_completion")) { dismissed() - if (evt.getKeyChar != '\b') { - val special = JEdit_Lib.special_key(evt) + if (!backspace) { val immediate = PIDE.options.bool("jedit_completion_immediate") if (PIDE.options.seconds("jedit_completion_delay").is_zero && !special) { input_delay.revoke() @@ -364,6 +367,8 @@ } } } + + if (!backspace && !special) Isabelle.indent_input(text_area) } } diff -r 148d61626014 -r 201d42f67bba src/Tools/jEdit/src/isabelle.scala --- a/src/Tools/jEdit/src/isabelle.scala Fri Jun 23 16:16:41 2017 +0200 +++ b/src/Tools/jEdit/src/isabelle.scala Fri Jun 23 22:03:51 2017 +0200 @@ -244,6 +244,32 @@ /* structured edits */ + def indent_enabled(buffer: JEditBuffer, option: String): Boolean = + indent_rule(JEdit_Lib.buffer_mode(buffer)).isDefined && + buffer.getStringProperty("autoIndent") == "full" && + PIDE.options.bool(option) + + def indent_input(text_area: TextArea) + { + val buffer = text_area.getBuffer + val line = text_area.getCaretLine + val caret = text_area.getCaretPosition + + if (text_area.isEditable && indent_enabled(buffer, "jedit_indent_input")) { + buffer_syntax(buffer) match { + case Some(syntax) if buffer.isInstanceOf[Buffer] => + val nav = new Text_Structure.Navigator(syntax, buffer.asInstanceOf[Buffer], true) + nav.iterator(line, 1).toStream.headOption match { + case Some(Text.Info(range, tok)) + if range.stop == caret && syntax.keywords.is_indent_command(tok) => + buffer.indentLine(line, true) + case _ => + } + case _ => + } + } + } + def newline(text_area: TextArea) { if (!text_area.isEditable()) text_area.getToolkit().beep() @@ -251,11 +277,8 @@ val buffer = text_area.getBuffer def nl { text_area.userInput('\n') } - if (indent_rule(JEdit_Lib.buffer_mode(buffer)).isDefined && - buffer.getStringProperty("autoIndent") == "full" && - PIDE.options.bool("jedit_indent_newline")) - { - Isabelle.buffer_syntax(buffer) match { + if (indent_enabled(buffer, "jedit_indent_newline")) { + buffer_syntax(buffer) match { case Some(syntax) if buffer.isInstanceOf[Buffer] => val keywords = syntax.keywords