ヒストリ機能を追加
@@ -8,6 +8,7 @@ | ||
8 | 8 | {".help", "doHelp", ".help\nヘルプを表示します。"}, |
9 | 9 | |
10 | 10 | {".history", "doHistory", ".history\nコマンド履歴を表示します。"}, |
11 | + {".!", "doExecHistory", ".! <[履歴番号]>\n指定した履歴番号の履歴を再実行します。"}, | |
11 | 12 | |
12 | 13 | {".book.add", "doBookAdd", ".book.add <Book名>\n新しいブックを追加します。"}, |
13 | 14 | {".book.current", "doBookCurrent", ".book.current <Book名>\nカレントブックを変更します。"}, |
@@ -39,6 +39,7 @@ | ||
39 | 39 | |
40 | 40 | LinkedList<String> cmdHistory = new LinkedList<>(); |
41 | 41 | LinkedList<String> aggregatedHistory = new LinkedList<>(); |
42 | + String _nextCommand = ""; | |
42 | 43 | |
43 | 44 | CommandFragment _commandStorage = new CommandFragment("."); |
44 | 45 |
@@ -51,7 +52,6 @@ | ||
51 | 52 | * @param args |
52 | 53 | */ |
53 | 54 | public static void main(String[] args) { |
54 | - // TODO 自動生成されたメソッド・スタブ | |
55 | 55 | |
56 | 56 | ConsolePicocalc cp = new ConsolePicocalc(); |
57 | 57 | cp.setup(); |
@@ -116,15 +116,21 @@ | ||
116 | 116 | String line; |
117 | 117 | while(true) { |
118 | 118 | try { |
119 | - // プロンプト表示 | |
120 | - Book currentBook = _books.get(_currentBookName); | |
121 | - System.out.print("[" + _currentBookName + "]" + currentBook.getResolver().getCurrentSheet().getName() + ": "); | |
122 | - | |
123 | 119 | |
124 | - System.out.println(Integer.toString(isr.read())); | |
125 | - // 入力がなくなったら終了 | |
126 | - if ((line = br.readLine().trim()) == null) { | |
127 | - break; | |
120 | + // ヒストリからの実行か? | |
121 | + if (_nextCommand == null) { | |
122 | + // ヒストリではない。 | |
123 | + // プロンプト表示 | |
124 | + Book currentBook = _books.get(_currentBookName); | |
125 | + printPrompt(currentBook); | |
126 | + // 入力がなくなったら終了 | |
127 | + if ((line = br.readLine().trim()) == null) { | |
128 | + break; | |
129 | + } | |
130 | + } else { | |
131 | + // ヒストリからの実行 | |
132 | + line = _nextCommand; | |
133 | + _nextCommand = null; | |
128 | 134 | } |
129 | 135 | |
130 | 136 | // 未入力だったら何もしない |
@@ -137,6 +143,13 @@ | ||
137 | 143 | break; |
138 | 144 | } |
139 | 145 | |
146 | + // ヒストリからの実行でない場合、入力内容を履歴に保持 | |
147 | + if (_nextCommand == null) { | |
148 | + cmdHistory.add(line); | |
149 | + aggregatedHistory.remove(line); | |
150 | + aggregatedHistory.add(line); | |
151 | + } | |
152 | + | |
140 | 153 | // 1文字目がドットか否かでコマンドもしくはセル入力を判断 |
141 | 154 | if (line.charAt(0) == '.') { |
142 | 155 | processCommand(line); |
@@ -143,10 +156,8 @@ | ||
143 | 156 | } else { |
144 | 157 | _cellCommand.processCell(_books.get(_currentBookName), line); |
145 | 158 | } |
146 | - System.out.println(line); | |
147 | - cmdHistory.add(line); | |
148 | - aggregatedHistory.remove(line); | |
149 | - aggregatedHistory.add(line); | |
159 | + | |
160 | + | |
150 | 161 | } catch (Exception e) { |
151 | 162 | e.printStackTrace(); |
152 | 163 | } |
@@ -164,6 +175,11 @@ | ||
164 | 175 | } |
165 | 176 | |
166 | 177 | |
178 | + private void printPrompt(Book currentBook) { | |
179 | + System.out.print("[" + _currentBookName + "]" + currentBook.getResolver().getCurrentSheet().getName() + ": "); | |
180 | + } | |
181 | + | |
182 | + | |
167 | 183 | private void processCommand(String line) { |
168 | 184 | |
169 | 185 | String cmdStr; |
@@ -269,11 +285,29 @@ | ||
269 | 285 | |
270 | 286 | private void doHistory(String argStr) { |
271 | 287 | StringBuilder sb = new StringBuilder(); |
288 | + int cnt = 1; | |
272 | 289 | for (String s : cmdHistory) { |
273 | - sb.append(s).append("\n"); | |
290 | + sb.append(cnt).append("\t").append(s).append("\n"); | |
291 | + cnt++; | |
274 | 292 | } |
293 | + if (sb.length() > 0 && sb.charAt(sb.length() - 1) == '\n') { | |
294 | + sb.deleteCharAt(sb.length() - 1); | |
295 | + } | |
275 | 296 | System.out.println(sb); |
276 | 297 | } |
298 | + | |
299 | + private void doExecHistory(String argStr) { | |
300 | + int reqHistNo = 0; | |
301 | + try { | |
302 | + reqHistNo = Integer.parseInt(argStr); | |
303 | + } catch (Exception e) { | |
304 | + return; | |
305 | + } | |
306 | + | |
307 | + this._nextCommand = this.cmdHistory.get(reqHistNo - 1); | |
308 | + System.out.println(_nextCommand); | |
309 | + | |
310 | + } | |
277 | 311 | |
278 | 312 | private void doCellList(String argStr) { |
279 | 313 | Sheet sheet = _books.get(_currentBookName).getResolver().getCurrentSheet(); |