📄 buffer.java
字号:
if (seg.count == 0) continue; lineStart = seg.offset; lineEnd = seg.offset + seg.count - 1; for (pos = lineEnd; pos >= lineStart; pos--) { if (!Character.isWhitespace(seg.array[pos])) break; } tail = lineEnd - pos; // no whitespace if (tail == 0) continue; remove(lineElement.getEndOffset() - 1 - tail,tail); } } catch (BadLocationException ble) { Log.log(Log.ERROR, this, ble); } finally { endCompoundEdit(); } } /** * Shifts the indent of each line in the specified list to the left. * @param lines The line numbers * @since jEdit 3.2pre1 */ public void shiftIndentLeft(int[] lines) { int tabSize = getTabSize(); int indentSize = getIndentSize(); boolean noTabs = getBooleanProperty("noTabs"); Element map = getDefaultRootElement(); try { beginCompoundEdit(); for(int i = 0; i < lines.length; i++) { Element lineElement = map.getElement(lines[i]); int lineStart = lineElement.getStartOffset(); String line = getText(lineStart, lineElement.getEndOffset() - lineStart - 1); int whiteSpace = MiscUtilities .getLeadingWhiteSpace(line); if(whiteSpace == 0) continue; int whiteSpaceWidth = Math.max(0,MiscUtilities .getLeadingWhiteSpaceWidth(line,tabSize) - indentSize); remove(lineStart,whiteSpace); insertString(lineStart,MiscUtilities .createWhiteSpace(whiteSpaceWidth, (noTabs ? 0 : tabSize)),null); } } catch (BadLocationException ble) { Log.log(Log.ERROR, this, ble); } finally { endCompoundEdit(); } } /** * Shifts the indent of each line in the specified list to the right. * @param lines The line numbers * @since jEdit 3.2pre1 */ public void shiftIndentRight(int[] lines) { try { beginCompoundEdit(); int tabSize = getTabSize(); int indentSize = getIndentSize(); boolean noTabs = getBooleanProperty("noTabs"); Element map = getDefaultRootElement(); for(int i = 0; i < lines.length; i++) { Element lineElement = map.getElement(lines[i]); int lineStart = lineElement.getStartOffset(); String line = getText(lineStart, lineElement.getEndOffset() - lineStart - 1); int whiteSpace = MiscUtilities .getLeadingWhiteSpace(line); int whiteSpaceWidth = MiscUtilities .getLeadingWhiteSpaceWidth( line,tabSize) + indentSize; remove(lineStart,whiteSpace); insertString(lineStart,MiscUtilities .createWhiteSpace(whiteSpaceWidth, (noTabs ? 0 : tabSize)),null); } } catch(BadLocationException bl) { Log.log(Log.ERROR,this,bl); } finally { endCompoundEdit(); } } /** * Returns the tab size used in this buffer. This is equivalent * to calling getProperty("tabSize"). */ public int getTabSize() { return ((Integer)getProperty("tabSize")).intValue(); } /** * Returns the indent size used in this buffer. This is equivalent * to calling getProperty("indentSize"). * @since jEdit 2.7pre1 */ public int getIndentSize() { return ((Integer)getProperty("indentSize")).intValue(); } /** * Returns the value of a boolean property. * @param name The property name */ public boolean getBooleanProperty(String name) { Object obj = getProperty(name); if(obj instanceof Boolean) return ((Boolean)obj).booleanValue(); else if("true".equals(obj) || "on".equals(obj) || "yes".equals(obj)) return true; else return false; } /** * Sets a boolean property. * @param name The property name * @param value The value */ public void putBooleanProperty(String name, boolean value) { putProperty(name,value ? Boolean.TRUE : Boolean.FALSE); } /** * Returns this buffer's edit mode. */ public final Mode getMode() { return mode; } /** * Sets this buffer's edit mode. Note that calling this before a buffer * is loaded will have no effect; in that case, set the "mode" property * to the name of the mode. A bit inelegant, I know... * @param mode The mode */ public void setMode(Mode mode) { /* This protects against stupid people (like me) * doing stuff like buffer.setMode(jEdit.getMode(...)); */ if(mode == null) throw new NullPointerException("Mode must be non-null"); if(this.mode == mode) return; Mode oldMode = this.mode; this.mode = mode; propertiesChanged(); // sets up token marker // don't fire it for initial mode set if(oldMode != null) { EditBus.send(new BufferUpdate(this,null, BufferUpdate.MODE_CHANGED)); } } /** * Sets this buffer's edit mode by calling the accept() method * of each registered edit mode. */ public void setMode() { // don't do this while loading, otherwise we will // blow away caret location properties if(!getFlag(LOADING)) clearProperties(); parseBufferLocalProperties(); String userMode = (String)getProperty("mode"); if(userMode != null) { Mode m = jEdit.getMode(userMode); if(m != null) { setMode(m); return; } } String nogzName = name.substring(0,name.length() - (name.endsWith(".gz") ? 3 : 0)); Element lineElement = getDefaultRootElement().getElement(0); try { String line = getText(0,(lineElement == null ? 0 : lineElement.getEndOffset()-1)); Mode[] modes = jEdit.getModes(); for(int i = 0; i < modes.length; i++) { if(modes[i].accept(nogzName,line)) { setMode(modes[i]); return; } } } catch(BadLocationException bl) { Log.log(Log.ERROR,this,bl); } Mode defaultMode = jEdit.getMode(jEdit.getProperty("buffer.defaultMode")); if(defaultMode == null) defaultMode = jEdit.getMode("text"); setMode(defaultMode); } /** * If auto indent is enabled, this method is called when the `Tab' * or `Enter' key is pressed to perform mode-specific indentation * and return true, or return false if a normal tab is to be inserted. * @param line The line number to indent * @param canIncreaseIndent If false, nothing will be done if the * calculated indent is greater than the current * @param canDecreaseIndent If false, nothing will be done if the * calculated indent is less than the current * @return true if the tab key event should be swallowed (ignored) * false if a real tab should be inserted */ public boolean indentLine(int lineIndex, boolean canIncreaseIndent, boolean canDecreaseIndent) { if(lineIndex == 0) return false; // Get properties String openBrackets = (String)getProperty("indentOpenBrackets"); String closeBrackets = (String)getProperty("indentCloseBrackets"); String _indentPrevLine = (String)getProperty("indentPrevLine"); boolean doubleBracketIndent = getBooleanProperty("doubleBracketIndent"); RE indentPrevLineRE = null; if(openBrackets == null) openBrackets = ""; if(closeBrackets == null) closeBrackets = ""; if(_indentPrevLine != null) { try { indentPrevLineRE = new RE(_indentPrevLine, RE.REG_ICASE,RESearchMatcher.RE_SYNTAX_JEDIT); } catch(REException re) { Log.log(Log.ERROR,this,"Invalid 'indentPrevLine'" + " regexp: " + _indentPrevLine); Log.log(Log.ERROR,this,re); } } int tabSize = getTabSize(); int indentSize = getIndentSize(); boolean noTabs = getBooleanProperty("noTabs"); Element map = getDefaultRootElement(); String prevLine = null; String line = null; Element lineElement = map.getElement(lineIndex); int start = lineElement.getStartOffset(); // Get line text try { line = getText(start,lineElement.getEndOffset() - start - 1); for(int i = lineIndex - 1; i >= 0; i--) { lineElement = map.getElement(i); int lineStart = lineElement.getStartOffset(); int len = lineElement.getEndOffset() - lineStart - 1; if(len != 0) { prevLine = getText(lineStart,len); break; } } if(prevLine == null) return false; } catch(BadLocationException e) { Log.log(Log.ERROR,this,e); return false; } /* * If 'prevLineIndent' matches a line --> +1 */ boolean prevLineMatches = (indentPrevLineRE == null ? false : indentPrevLineRE.isMatch(prevLine)); /* * On the previous line, * if(bob) { --> +1 * if(bob) { } --> 0 * } else if(bob) { --> +1 */ boolean prevLineStart = true; // False after initial indent int prevLineIndent = 0; // Indent width (tab expanded) int prevLineBrackets = 0; // Additional bracket indent for(int i = 0; i < prevLine.length(); i++) { char c = prevLine.charAt(i); switch(c) { case ' ': if(prevLineStart) prevLineIndent++; break; case '\t': if(prevLineStart) { prevLineIndent += (tabSize - (prevLineIndent % tabSize)); } break; default: prevLineStart = false; if(closeBrackets.indexOf(c) != -1) prevLineBrackets = Math.max( prevLineBrackets-1,0); else if(openBrackets.indexOf(c) != -1) { /* * If supressBracketAfterIndent is true * and we have something that looks like: * if(bob) * { * then the 'if' will not shift the indent, * because of the {. * * If supressBracketAfterIndent is false, * the above would be indented like: * if(bob) * { */ if(!doubleBracketIndent) prevLineMatches = false; prevLineBrackets++; } break; } } /* * On the current line, * } --> -1 * } else if(bob) { --> -1 * if(bob) { } --> 0 */ boolean lineStart = true; // False after initial indent int lineIndent = 0; // Indent width (tab expanded) int lineWidth = 0; // White space count int lineBrackets = 0; // Additional bracket indent int closeBracketIndex = -1; // For lining up closing // and opening brackets for(int i = 0; i < line.length(); i++) { char c = line.charAt(i); switch(c) { case ' ': if(lineStart) { lineIndent++; lineWidth++; } break; case '\t': if(lineStart) { lineIndent += (tabSize - (lineIndent % tabSize)); lineWidth++; } break; default: lineStart = false; if(closeBrackets.indexOf(c) != -1) { if(lineBrackets == 0) closeBracketIndex = i; else lineBrackets--; } else if(openBrackets.indexOf(c) != -1) { if(!doubleBracketIndent) prevLineMatches = false; lineBrackets++; } break; } } try { if(closeBracketIndex != -1) { int offset = TextUtilities.findMatchingBracket( this,lineIndex,closeBracketIndex); if(offset != -1) { lineElement = map.getElement(map.getElementIndex( offset)); int startOffset = lineElement.getStartOffset(); String closeLine = getText(startOffset, lineElement.getEndOffset() - startOffset - 1); prevLineIndent = MiscUtilities .getLeadingWhiteSpaceWidth( closeLine,tabSize); } else return false; } else { prevLineIndent += (prevLineBrackets * indentSize); } if(prevLineMatches) prevLineIndent += indentSize; if(!canDecreaseIndent && prevLineIndent <= lineIndent) return false; if(!canIncreaseIndent && prevLineIndent >= lineIndent) return false; // Do it remove(start,lineWidth); insertString(start,MiscUtilities.createWhiteSpace( prevLineIndent,(noTabs ? 0 : tabSize)),null); return true; } catch(BadLocationException bl) { Log.log(Log.ERROR,this,bl); } return false; } /** * Indents all specified lines. * @param start The first line to indent * @param end The last line to indent * @since jEdit 3.1pre3 */ public void indentLines(int start, int end) { beginCompoundEdit(); for(int i = start; i <= end; i++) indentLine(i,true,true); endCompoundEdit(); } /** * Indents all specified lines. * @param lines The line numbers * @since jEdit 3.2pre1 */ public void indentLines(int[] lines) { beginCompoundEdit(); for(int i = 0; i < lines.length; i++) indentLine(lines[i],true,true); endCompoundEdit(); } /** * @deprecated Don't call this method. */ public void tokenizeLines() {} /** * Reparses the document, by passing the specified lines to the * token marker. This should be called after a large quantity of * text is first inserted. * @param start The first line to parse * @param len The number of lines, after the first one to parse */ public void tokenizeLines(int start, int len) { linesChanged(start,len); for(int i = 0; i < len; i++) markTokens(start + i); } /** * Paints the specified line onto the graphics context. * @since jEdit 3.2pre6 */ public int paintSyntaxLine(int lineIndex, Graphics gfx, int _x, int _y, TabExpander expander, boolean style, boolean color, Font defaultFont, Color foreground, Color background, SyntaxStyle[] styles, TextRenderer renderer) { float x = (float)_x; float y = (float)_y; LineInfo info = lineInfo[lineIndex]; if(info.tokensValid) { // have to do this 'manually' Element lineElement = getDefaultRootElement() .getElement(lineIndex); int lineStart = lineElement.getStartOffset(); try { getText(lineStart,lineElement.getEndOffset() - lineStart - 1,seg); } catch(BadLocationException e) { Log.log(Log.ERROR,this,e); } } else markTokens(lineIndex); Token tokens = info.firstToken; // the above should leave the text in the 'seg' segment char[] text = seg.array; int off = seg.offset; for(;;) { byte id = tokens.id; if(id == Token.END) break; Color tokenForeground; Color tokenBackground = null; if(id == Token.NULL) { gfx.setFont(defaultFont); tokenForeground = foreground; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -