Coverage for C:\leo.repo\leo-editor\leo\commands\bufferCommands.py: 23%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

179 statements  

1# -*- coding: utf-8 -*- 

2#@+leo-ver=5-thin 

3#@+node:ekr.20150514035559.1: * @file ../commands/bufferCommands.py 

4#@@first 

5"""Leo's buffer commands.""" 

6#@+<< imports >> 

7#@+node:ekr.20150514045750.1: ** << imports >> (bufferCommands.py) 

8from leo.core import leoGlobals as g 

9from leo.commands.baseCommands import BaseEditCommandsClass 

10#@-<< imports >> 

11 

12def cmd(name): 

13 """Command decorator for the BufferCommands class.""" 

14 return g.new_cmd_decorator(name, ['c', 'bufferCommands',]) 

15 

16#@+others 

17#@+node:ekr.20160514095727.1: ** class BufferCommandsClass 

18class BufferCommandsClass(BaseEditCommandsClass): 

19 """ 

20 An Emacs instance does not have knowledge of what is considered a 

21 buffer in the environment. 

22 

23 """ 

24 #@+others 

25 #@+node:ekr.20150514045829.3: *3* buffer.ctor 

26 def __init__(self, c): 

27 """Ctor for the BufferCommandsClass class.""" 

28 # pylint: disable=super-init-not-called 

29 self.c = c 

30 self.fromName = '' # Saved name from getBufferName. 

31 self.nameList = [] # [n: <headline>] 

32 self.names = {} 

33 self.vnodes = {} # Keys are n: <headline>, values are vnodes. 

34 #@+node:ekr.20150514045829.5: *3* buffer.Entry points 

35 #@+node:ekr.20150514045829.6: *4* appendToBuffer 

36 @cmd('buffer-append-to') 

37 def appendToBuffer(self, event): 

38 """Add the selected body text to the end of the body text of a named buffer (node).""" 

39 self.w = self.editWidget(event) 

40 if self.w: 

41 self.c.k.setLabelBlue('Append to buffer: ') 

42 self.getBufferName(event, self.appendToBuffer1) 

43 

44 def appendToBuffer1(self, name): 

45 c, w = self.c, self.w 

46 s = w.getSelectedText() 

47 p = self.findBuffer(name) 

48 if s and p: 

49 w = self.w 

50 c.selectPosition(p) 

51 self.beginCommand(w, f"append-to-buffer: {p.h}") 

52 w.insert('end', s) 

53 w.setInsertPoint('end') 

54 w.seeInsertPoint() 

55 self.endCommand() 

56 c.redraw_after_icons_changed() 

57 c.recolor() 

58 #@+node:ekr.20150514045829.7: *4* copyToBuffer 

59 @cmd('buffer-copy') 

60 def copyToBuffer(self, event): 

61 """Add the selected body text to the end of the body text of a named buffer (node).""" 

62 self.w = self.editWidget(event) 

63 if self.w: 

64 self.c.k.setLabelBlue('Copy to buffer: ') 

65 self.getBufferName(event, self.copyToBuffer1) 

66 

67 def copyToBuffer1(self, name): 

68 c, w = self.c, self.w 

69 s = w.getSelectedText() 

70 p = self.findBuffer(name) 

71 if s and p: 

72 c.selectPosition(p) 

73 self.beginCommand(w, f"copy-to-buffer: {p.h}") 

74 w.insert('end', s) 

75 w.setInsertPoint('end') 

76 self.endCommand() 

77 c.redraw_after_icons_changed() 

78 c.recolor() 

79 #@+node:ekr.20150514045829.8: *4* insertToBuffer 

80 @cmd('buffer-insert') 

81 def insertToBuffer(self, event): 

82 """Add the selected body text at the insert point of the body text of a named buffer (node).""" 

83 self.w = self.editWidget(event) 

84 if self.w: 

85 self.c.k.setLabelBlue('Insert to buffer: ') 

86 self.getBufferName(event, self.insertToBuffer1) 

87 

88 def insertToBuffer1(self, name): 

89 c, w = self.c, self.w 

90 s = w.getSelectedText() 

91 p = self.findBuffer(name) 

92 if s and p: 

93 c.selectPosition(p) 

94 self.beginCommand(w, undoType=f"insert-to-buffer: {p.h}") 

95 i = w.getInsertPoint() 

96 w.insert(i, s) 

97 w.seeInsertPoint() 

98 self.endCommand() 

99 c.redraw_after_icons_changed() 

100 #@+node:ekr.20150514045829.9: *4* killBuffer 

101 @cmd('buffer-kill') 

102 def killBuffer(self, event): 

103 """Delete a buffer (node) and all its descendants.""" 

104 self.w = self.editWidget(event) 

105 if self.w: 

106 self.c.k.setLabelBlue('Kill buffer: ') 

107 self.getBufferName(event, self.killBuffer1) 

108 

109 def killBuffer1(self, name): 

110 c = self.c 

111 p = self.findBuffer(name) 

112 if p: 

113 h = p.h 

114 current = c.p 

115 c.selectPosition(p) 

116 c.deleteOutline(op_name=f"kill-buffer: {h}") 

117 c.selectPosition(current) 

118 self.c.k.setLabelBlue(f"Killed buffer: {h}") 

119 c.redraw(current) 

120 #@+node:ekr.20150514045829.10: *4* listBuffers & listBuffersAlphabetically 

121 @cmd('buffers-list') 

122 def listBuffers(self, event): 

123 """ 

124 List all buffers (node headlines), in outline order. Nodes with the 

125 same headline are disambiguated by giving their parent or child index. 

126 """ 

127 self.computeData() 

128 g.es('buffers...') 

129 for name in self.nameList: 

130 g.es('', name) 

131 

132 @cmd('buffers-list-alphabetically') 

133 def listBuffersAlphabetically(self, event): 

134 """ 

135 List all buffers (node headlines), in alphabetical order. Nodes with 

136 the same headline are disambiguated by giving their parent or child 

137 index. 

138 """ 

139 self.computeData() 

140 names = sorted(self.nameList) 

141 g.es('buffers...') 

142 for name in names: 

143 g.es('', name) 

144 #@+node:ekr.20150514045829.11: *4* prependToBuffer 

145 @cmd('buffer-prepend-to') 

146 def prependToBuffer(self, event): 

147 """Add the selected body text to the start of the body text of a named buffer (node).""" 

148 self.w = self.editWidget(event) 

149 if self.w: 

150 self.c.k.setLabelBlue('Prepend to buffer: ') 

151 self.getBufferName(event, self.prependToBuffer1) 

152 

153 def prependToBuffer1(self, name): 

154 c, w = self.c, self.w 

155 s = w.getSelectedText() 

156 p = self.findBuffer(name) 

157 if s and p: 

158 c.selectPosition(p) 

159 self.beginCommand(w, f"prepend-to-buffer: {p.h}") 

160 w.insert(0, s) 

161 w.setInsertPoint(0) 

162 w.seeInsertPoint() 

163 self.endCommand() 

164 c.redraw_after_icons_changed() 

165 c.recolor() 

166 #@+node:ekr.20150514045829.12: *4* renameBuffer (not ready) 

167 def renameBuffer(self, event): 

168 """Rename a buffer, i.e., change a node's headline.""" 

169 g.es('rename-buffer not ready yet') 

170 if 0: 

171 self.c.k.setLabelBlue('Rename buffer from: ') 

172 self.getBufferName(event, self.renameBufferFinisher1) 

173 

174 def renameBufferFinisher1(self, name): 

175 self.fromName = name 

176 self.c.k.setLabelBlue(f"Rename buffer from: {name} to: ") 

177 event = None 

178 self.getBufferName(event, self.renameBufferFinisher2) 

179 

180 def renameBufferFinisher2(self, name): 

181 c = self.c 

182 p = self.findBuffer(self.fromName) 

183 if p: 

184 c.endEditing() 

185 p.h = name 

186 c.redraw(p) 

187 #@+node:ekr.20150514045829.13: *4* switchToBuffer 

188 @cmd('buffer-switch-to') 

189 def switchToBuffer(self, event): 

190 """Select a buffer (node) by its name (headline).""" 

191 self.c.k.setLabelBlue('Switch to buffer: ') 

192 self.getBufferName(event, self.switchToBuffer1) 

193 

194 def switchToBuffer1(self, name): 

195 c = self.c 

196 p = self.findBuffer(name) 

197 if p: 

198 c.selectPosition(p) 

199 c.redraw_after_select(p) 

200 #@+node:ekr.20150514045829.14: *3* buffer.Utils 

201 #@+node:ekr.20150514045829.15: *4* computeData 

202 def computeData(self): 

203 self.nameList = [] 

204 self.names = {} 

205 self.vnodes = {} 

206 for p in self.c.all_unique_positions(): 

207 h = p.h.strip() 

208 v = p.v 

209 nameList = self.names.get(h, []) 

210 if nameList: 

211 if p.parent(): 

212 key = f"{h}, parent: {p.parent().h}" 

213 else: 

214 key = f"{h}, child index: {p.childIndex()}" 

215 else: 

216 key = h 

217 self.nameList.append(key) 

218 self.vnodes[key] = v 

219 nameList.append(key) 

220 self.names[h] = nameList 

221 #@+node:ekr.20150514045829.16: *4* findBuffer 

222 def findBuffer(self, name): 

223 v = self.vnodes.get(name) 

224 for p in self.c.all_unique_positions(): 

225 if p.v == v: 

226 return p 

227 g.es_print("no node named", name, color='orange') 

228 return None 

229 #@+node:ekr.20150514045829.17: *4* getBufferName 

230 def getBufferName(self, event, finisher): 

231 """Get a buffer name into k.arg and call k.setState(kind,n,handler).""" 

232 k = self.c.k 

233 self.computeData() 

234 self.getBufferNameFinisher = finisher 

235 prefix = k.getLabel() 

236 k.get1Arg( 

237 event, handler=self.getBufferName1, prefix=prefix, tabList=self.nameList) 

238 

239 def getBufferName1(self, event): 

240 k = self.c.k 

241 k.resetLabel() 

242 k.clearState() 

243 finisher = self.getBufferNameFinisher 

244 self.getBufferNameFinisher = None 

245 finisher(k.arg) 

246 #@-others 

247#@-others 

248#@-leo