///|
fn Prompt::run_selection_clipboard_handler(
self : Prompt,
state : InputState,
key_bindings : KeyBindings,
info : @console.ConsoleKeyInfo,
) -> KeyProcessingResult {
if key_bindings.copy_selection.matches(info) {
if self.pane_state.selection is Some(sel) {
let (start, end) = sel.range()
let text = line_from_buffers(state.left, state.right)
let selected_text = text.sub(start~, end~).to_string()
let _ = self.clipboard.write_text(selected_text) catch { _ => () }
}
state.last_was_yank = false
return Handled
}
if key_bindings.cut_selection.matches(info) {
if self.pane_state.selection is Some(sel) {
let (start, end) = sel.range()
let text = line_from_buffers(state.left, state.right)
let selected_text = text.sub(start~, end~).to_string()
let _ = self.clipboard.write_text(selected_text) catch { _ => () }
self.kill_ring.add(selected_text)
self.delete_selection(state.left, state.right)
self.track_undo(state.left, state.right)
state.request_render()
}
state.last_was_yank = false
return Handled
}
NotHandled
}
///|
fn Prompt::run_kill_ring_handler(
self : Prompt,
state : InputState,
key_bindings : KeyBindings,
info : @console.ConsoleKeyInfo,
) -> KeyProcessingResult {
if key_bindings.kill_line_tail.matches(info) {
if state.right.length() > 0 {
let text = String::from_array(state.right.rev())
self.kill_ring.add(text)
state.right.clear()
self.track_undo(state.left, state.right)
state.request_render()
}
state.last_was_yank = false
return Handled
}
if key_bindings.kill_line_head.matches(info) {
if state.left.length() > 0 {
let text = String::from_array(state.left)
self.kill_ring.add(text)
state.left.clear()
self.track_undo(state.left, state.right)
state.request_render()
}
state.last_was_yank = false
return Handled
}
if key_bindings.yank.matches(info) {
if self.kill_ring.yank() is Some(text) {
self.delete_selection(state.left, state.right)
state.left.push_iter(text.iter())
self.track_undo(state.left, state.right)
state.request_render()
state.last_was_yank = true
}
return Handled
}
if key_bindings.yank_pop.matches(info) && state.last_was_yank {
if self.undo_manager.undo() is Some(record) {
self.apply_undo_record(state.left, state.right, record)
if self.kill_ring.yank_pop() is Some(text) {
state.left.push_iter(text.iter())
self.track_undo(state.left, state.right)
}
state.request_render()
}
return Handled
}
NotHandled
}