1 4 package gnu.jemacs.buffer; 5 import gnu.mapping.*; 6 import java.io.*; 7 8 public class ProcessMode extends Mode 9 { 10 protected Writer toInferior; 11 12 protected Marker processMark; 13 14 protected boolean lineMode = false; 15 16 static Procedure enterAction = new gnu.expr.PrimProcedure(gnu.bytecode.ClassType.make("gnu.jemacs.buffer.ProcessMode").getDeclaredMethod("enterAction", 0)); 17 18 public static EKeymap modeMap = new EKeymap("process"); 19 static 20 { 21 modeMap.defineKey("\n", enterAction); 22 modeMap.defineKey("\r", enterAction); 23 modeMap.defineKey("enter", enterAction); 24 modeMap.defineKey("return", enterAction); 25 Object insert = new ProcessInsertCommand(); 26 modeMap.set(' ', 126, insert); 28 modeMap.set(128, 255, insert); 29 } 30 31 public Marker getProcessMark () 32 { 33 return processMark; 34 } 35 36 public static void enterAction() 37 { 38 Buffer buffer = Buffer.getCurrent(); 39 ProcessMode pmode = getProcessMode(buffer); 40 pmode.enter(); 41 } 42 43 public void enter() 44 { 45 try 46 { 47 if (lineMode) 48 { 49 buffer.insert('\n', 1, null); 50 int pos = buffer.getDot(); 51 int markPos = processMark.getOffset(); 52 53 buffer.writeTo(markPos, pos - markPos, toInferior); 54 processMark.setDot(pos); 55 } 56 else 57 toInferior.write('\r'); 58 toInferior.flush(); 59 } 60 catch (Exception ex) 61 { 62 throw new WrappedException(ex); 63 } 64 } 65 66 public static ProcessMode getProcessMode(Buffer buffer) 67 { 68 for (Mode mode = buffer.modes; ; mode = mode.next) 69 { 70 if (mode == null) 71 Signal.error("not in process mode"); 72 if (mode instanceof ProcessMode) 73 return (ProcessMode) mode; 74 } 75 } 76 77 public void writeToInferior(gnu.lists.CharSeq str) 78 throws java.io.IOException 79 { 80 str.writeTo(toInferior); 81 toInferior.flush(); 82 } 83 84 public void selfInsert() 85 { 86 EWindow window = EWindow.getSelected(); 87 insert((char) window.pendingKeys[window.pendingLength], 1); 88 } 89 90 public void insert(char ch, int count) 91 { 92 if (! lineMode) 93 { 94 try 95 { 96 while (--count >= 0) 97 toInferior.write(ch); 98 toInferior.flush(); 99 } 100 catch (Exception ex) 101 { 102 throw new WrappedException(ex); 103 } 104 } 105 else 106 buffer.insert(ch, count); 107 } 108 109 113 public void invoke(Runnable doRun) 114 { 115 buffer.invoke(doRun); 116 } 117 } 118 119 class ProcessInsertCommand extends Procedure0 120 { 121 public Object getProperty (Object key, Object defaultValue) 122 { 123 if (key == "emacs-interactive") 124 return "*"; 125 return super.getProperty(key, defaultValue); 126 } 127 128 public Object apply0 () 129 { 130 EWindow window = EWindow.getSelected(); 131 Buffer buffer = window.buffer; 132 ProcessMode pmode = ProcessMode.getProcessMode(buffer); 133 pmode.insert((char) window.pendingKeys[window.pendingLength], 1); 134 return Values.empty; 135 } 136 } 137 | Popular Tags |