📄 bufferiorequest.java
字号:
// trailing \n into account lastLine = i + 1; break; case '\n': // If lastWasCR is true, // we just read a \r followed // by a \n. We specify that // this is a Windows file, // but take no further // action and just ignore // the \r. if(lastWasCR) { CROnly = false; CRLF = true; lastWasCR = false; // Bump lastLine so // that the next line // doesn't erronously // pick up the \r lastLine = i + 1; } // Otherwise, we found a \n // that follows some other // character, hence we have // a Unix file else { CROnly = false; CRLF = false; seg.append(buf,lastLine, i - lastLine); seg.append('\n'); endOffsets.add(seg.count); if(trackProgress && lineCount++ % PROGRESS_INTERVAL == 0) setProgressValue(seg.count); lastLine = i + 1; } break; default: // If we find some other // character that follows // a \r, so it is not a // Windows file, and probably // a Mac file if(lastWasCR) { CROnly = true; CRLF = false; lastWasCR = false; } break; } } if(trackProgress) setProgressValue(seg.count); // Add remaining stuff from buffer seg.append(buf,lastLine,len - lastLine); } setAbortable(false); String lineSeparator; if(length == 0) { // fix for "[ 865589 ] 0-byte files should open using // the default line seperator" lineSeparator = null; } else if(CRLF) lineSeparator = "\r\n"; else if(CROnly) lineSeparator = "\r"; else lineSeparator = "\n"; in.close(); // Chop trailing newline and/or ^Z (if any) int bufferLength = seg.count; if(bufferLength != 0) { char ch = seg.array[bufferLength - 1]; if(ch == 0x1a /* DOS ^Z */) seg.count--; } buffer.setBooleanProperty(Buffer.TRAILING_EOL,false); if(bufferLength != 0 && jEdit.getBooleanProperty("stripTrailingEOL")) { char ch = seg.array[bufferLength - 1]; if(ch == '\n') { buffer.setBooleanProperty(Buffer.TRAILING_EOL,true); seg.count--; endOffsets.setSize(endOffsets.getSize() - 1); } } // add a line marker at the end for proper offset manager // operation endOffsets.add(seg.count + 1); // to avoid having to deal with read/write locks and such, // we insert the loaded data into the buffer in the // post-load cleanup runnable, which runs in the AWT thread. if(!insert) { buffer.setProperty(LOAD_DATA,seg); buffer.setProperty(END_OFFSETS,endOffsets); buffer.setProperty(NEW_PATH,path); if(lineSeparator != null) buffer.setProperty(Buffer.LINESEP,lineSeparator); } // used in insert() return seg; } //}}} //{{{ readMarkers() method private void readMarkers(Buffer buffer, InputStream _in) throws IOException { // For `reload' command buffer.removeAllMarkers(); BufferedReader in = new BufferedReader(new InputStreamReader(_in)); String line; while((line = in.readLine()) != null) { // compatibility kludge for jEdit 3.1 and earlier if(!line.startsWith("!")) continue; char shortcut = line.charAt(1); int start = line.indexOf(';'); int end = line.indexOf(';',start + 1); int position = Integer.parseInt(line.substring(start + 1,end)); buffer.addMarker(shortcut,position); } in.close(); } //}}} //{{{ save() method private void save() { OutputStream out = null; try { String[] args = { vfs.getFileName(path) }; setStatus(jEdit.getProperty("vfs.status.save",args)); // the entire save operation can be aborted... setAbortable(true); path = vfs._canonPath(session,path,view); if(!MiscUtilities.isURL(path)) path = MiscUtilities.resolveSymlinks(path); // Only backup once per session if(buffer.getProperty(Buffer.BACKED_UP) == null || jEdit.getBooleanProperty("backupEverySave")) { vfs._backup(session,path,view); buffer.setBooleanProperty(Buffer.BACKED_UP,true); } /* if the VFS supports renaming files, we first * save to #<filename>#save#, then rename that * to <filename>, so that if the save fails, * data will not be lost. * * as of 4.1pre7 we now call vfs.getTwoStageSaveName() * instead of constructing the path directly * since some VFS's might not allow # in filenames. */ String savePath; boolean twoStageSave = (vfs.getCapabilities() & VFS.RENAME_CAP) != 0 && jEdit.getBooleanProperty("twoStageSave"); if(twoStageSave) savePath = vfs.getTwoStageSaveName(path); else savePath = path; out = vfs._createOutputStream(session,savePath,view); try { // this must be after the stream is created or // we deadlock with SSHTools. buffer.readLock(); if(out != null) { // Can't use buffer.getName() here because // it is not changed until the save is // complete if(savePath.endsWith(".gz")) buffer.setBooleanProperty(Buffer.GZIPPED,true); if(buffer.getBooleanProperty(Buffer.GZIPPED)) out = new GZIPOutputStream(out); write(buffer,out); if(twoStageSave) { if(!vfs._rename(session,savePath,path,view)) throw new IOException("Rename failed: " + savePath); } // We only save markers to VFS's that support deletion. // Otherwise, we will accumilate stale marks files. if((vfs.getCapabilities() & VFS.DELETE_CAP) != 0) { if(jEdit.getBooleanProperty("persistentMarkers") && buffer.getMarkers().size() != 0) { setStatus(jEdit.getProperty("vfs.status.save-markers",args)); setProgressValue(0); out = vfs._createOutputStream(session,markersPath,view); if(out != null) writeMarkers(buffer,out); } else vfs._delete(session,markersPath,view); } } else buffer.setBooleanProperty(ERROR_OCCURRED,true); if(!twoStageSave) VFSManager.sendVFSUpdate(vfs,path,true); } finally { buffer.readUnlock(); } } catch(IOException io) { Log.log(Log.ERROR,this,io); String[] pp = { io.toString() }; VFSManager.error(view,path,"ioerror.write-error",pp); buffer.setBooleanProperty(ERROR_OCCURRED,true); } catch(WorkThread.Abort a) { if(out != null) { try { out.close(); } catch(IOException io) { } } buffer.setBooleanProperty(ERROR_OCCURRED,true); } finally { try { vfs._saveComplete(session,buffer,path,view); vfs._endVFSSession(session,view); } catch(IOException io) { Log.log(Log.ERROR,this,io); String[] pp = { io.toString() }; VFSManager.error(view,path,"ioerror.write-error",pp); buffer.setBooleanProperty(ERROR_OCCURRED,true); } catch(WorkThread.Abort a) { buffer.setBooleanProperty(ERROR_OCCURRED,true); } } } //}}} //{{{ autosave() method private void autosave() { OutputStream out = null; try { String[] args = { vfs.getFileName(path) }; setStatus(jEdit.getProperty("vfs.status.autosave",args)); // the entire save operation can be aborted... setAbortable(true); try { //buffer.readLock(); if(!buffer.isDirty()) { // buffer has been saved while we // were waiting. return; } out = vfs._createOutputStream(session,path,view); if(out == null) return; write(buffer,out); } catch(Exception e) { } finally { //buffer.readUnlock(); } } catch(WorkThread.Abort a) { if(out != null) { try { out.close(); } catch(IOException io) { } } } } //}}} //{{{ write() method private void write(Buffer buffer, OutputStream _out) throws IOException { String encoding = buffer.getStringProperty(Buffer.ENCODING); if(encoding.equals(MiscUtilities.UTF_8_Y)) { // not supported by Java... _out.write(UTF8_MAGIC_1); _out.write(UTF8_MAGIC_2); _out.write(UTF8_MAGIC_3); _out.flush(); encoding = "UTF-8"; } BufferedWriter out = new BufferedWriter( new OutputStreamWriter(_out,encoding), IOBUFSIZE); Segment lineSegment = new Segment(); String newline = buffer.getStringProperty(Buffer.LINESEP); if(newline == null) newline = System.getProperty("line.separator"); setProgressMaximum(buffer.getLineCount() / PROGRESS_INTERVAL); setProgressValue(0); int i = 0; while(i < buffer.getLineCount()) { buffer.getLineText(i,lineSegment); out.write(lineSegment.array,lineSegment.offset, lineSegment.count); if(i != buffer.getLineCount() - 1) { out.write(newline); } if(++i % PROGRESS_INTERVAL == 0) setProgressValue(i / PROGRESS_INTERVAL); } if(jEdit.getBooleanProperty("stripTrailingEOL") && buffer.getBooleanProperty(Buffer.TRAILING_EOL)) { out.write(newline); } out.close(); } //}}} //{{{ writeMarkers() method private void writeMarkers(Buffer buffer, OutputStream out) throws IOException { Writer o = new BufferedWriter(new OutputStreamWriter(out)); Vector markers = buffer.getMarkers(); for(int i = 0; i < markers.size(); i++) { Marker marker = (Marker)markers.elementAt(i); o.write('!'); o.write(marker.getShortcut()); o.write(';'); String pos = String.valueOf(marker.getPosition()); o.write(pos); o.write(';'); o.write(pos); o.write('\n'); } o.close(); } //}}} //{{{ insert() method private void insert() { InputStream in = null; try { try { String[] args = { vfs.getFileName(path) }; setStatus(jEdit.getProperty("vfs.status.load",args)); setAbortable(true); path = vfs._canonPath(session,path,view); VFS.DirectoryEntry entry = vfs._getDirectoryEntry( session,path,view); long length; if(entry != null) length = entry.length; else length = 0L; in = vfs._createInputStream(session,path,false,view); if(in == null) return; final SegmentBuffer seg = read( autodetect(in),length,true); /* we don't do this in Buffer.insert() so that we can insert multiple files at once */ VFSManager.runInAWTThread(new Runnable() { public void run() { view.getTextArea().setSelectedText( seg.toString()); } }); } catch(IOException io) { Log.log(Log.ERROR,this,io); String[] pp = { io.toString() }; VFSManager.error(view,path,"ioerror.read-error",pp); buffer.setBooleanProperty(ERROR_OCCURRED,true); } } catch(WorkThread.Abort a) { if(in != null) { try { in.close(); } catch(IOException io) { } } buffer.setBooleanProperty(ERROR_OCCURRED,true); } finally { try { vfs._endVFSSession(session,view); } catch(IOException io) { Log.log(Log.ERROR,this,io); String[] pp = { io.toString() }; VFSManager.error(view,path,"ioerror.read-error",pp); buffer.setBooleanProperty(ERROR_OCCURRED,true); } catch(WorkThread.Abort a) { buffer.setBooleanProperty(ERROR_OCCURRED,true); } } } //}}} //}}}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -