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
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
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 >>
12def cmd(name):
13 """Command decorator for the BufferCommands class."""
14 return g.new_cmd_decorator(name, ['c', 'bufferCommands',])
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.
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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