fixing emacs multiselect cut/copy/paste

This commit is contained in:
Robert Krahn 2013-05-26 17:14:06 -07:00
commit a7cccae039
2 changed files with 46 additions and 34 deletions

View file

@ -367,28 +367,32 @@ exports.handler.addCommands({
selectRectangularRegion: function(editor) { selectRectangularRegion: function(editor) {
editor.multiSelect.toggleBlockSelection(); editor.multiSelect.toggleBlockSelection();
}, },
setMark: function(editor) { setMark: {
// Emulate emacs highlighting behaviour in transient-mark-mode. exec: function(editor) {
// Sets mark-mode and clears current selection. // Emulate emacs highlighting behaviour in transient-mark-mode.
// When mark is set, keyboard cursor movement commands become // Sets mark-mode and clears current selection.
// selection modification commands. That is, // When mark is set, keyboard cursor movement commands become
// "goto" commands become "select" commands. // selection modification commands. That is,
// Any insertion or mouse click resets mark-mode. // "goto" commands become "select" commands.
// setMark twice in a row at the same place resets markmode // Any insertion or mouse click resets mark-mode.
var markMode = editor.emacsMarkMode(); // setMark twice in a row at the same place resets markmode
if (markMode) { var markMode = editor.emacsMarkMode();
var cp = editor.getCursorPosition(); if (markMode) {
if (editor.selection.isEmpty() && var cp = editor.getCursorPosition();
markMode.row == cp.row && markMode.column == cp.column) { if (editor.selection.isEmpty() &&
editor.setEmacsMarkMode(null); markMode.row == cp.row && markMode.column == cp.column) {
// console.log("Mark mode off"); editor.setEmacsMarkMode(null);
return; // console.log("Mark mode off");
return;
}
} }
} // turn on mark mode
// turn on mark mode markMode = editor.getCursorPosition();
markMode = editor.getCursorPosition(); editor.setEmacsMarkMode(markMode);
editor.setEmacsMarkMode(markMode); editor.selection.setSelectionAnchor(markMode.row, markMode.column);
editor.selection.setSelectionAnchor(markMode.row, markMode.column); },
readonly: true,
multiSelectAction: "forEach"
}, },
exchangePointAndMark: { exchangePointAndMark: {
exec: function(editor) { exec: function(editor) {
@ -396,7 +400,7 @@ exports.handler.addCommands({
editor.selection.setSelectionRange(range, !editor.selection.isBackwards()); editor.selection.setSelectionRange(range, !editor.selection.isBackwards());
}, },
readonly: true, readonly: true,
multiselectAction: "forEach" multiSelectAction: "forEach"
}, },
killWord: { killWord: {
exec: function(editor, dir) { exec: function(editor, dir) {
@ -413,7 +417,7 @@ exports.handler.addCommands({
editor.session.remove(range); editor.session.remove(range);
editor.clearSelection(); editor.clearSelection();
}, },
multiselectAction: "forEach" multiSelectAction: "forEach"
}, },
killLine: function(editor) { killLine: function(editor) {
editor.setEmacsMarkMode(null); editor.setEmacsMarkMode(null);
@ -438,7 +442,7 @@ exports.handler.addCommands({
editor.clearSelection(); editor.clearSelection();
}, },
yank: function(editor) { yank: function(editor) {
editor.onPaste(exports.killRing.get()); editor.onPaste(exports.killRing.get() || '');
editor.keyBinding.$data.lastCommand = "yank"; editor.keyBinding.$data.lastCommand = "yank";
}, },
yankRotate: function(editor) { yankRotate: function(editor) {
@ -448,12 +452,19 @@ exports.handler.addCommands({
editor.onPaste(exports.killRing.rotate()); editor.onPaste(exports.killRing.rotate());
editor.keyBinding.$data.lastCommand = "yank"; editor.keyBinding.$data.lastCommand = "yank";
}, },
killRegion: function(editor) { killRegion: {
exports.killRing.add(editor.getCopyText()); exec: function(editor) {
editor.commands.byName.cut.exec(editor); exports.killRing.add(editor.getCopyText());
editor.commands.byName.cut.exec(editor);
},
readonly: true,
multiSelectAction: "forEach"
}, },
killRingSave: function(editor) { killRingSave: {
exports.killRing.add(editor.getCopyText()); exec: function(editor) {
exports.killRing.add(editor.getCopyText());
},
readonly: true
}, },
keyboardQuit: function(editor) { keyboardQuit: function(editor) {
editor.selection.clearSelection(); editor.selection.clearSelection();
@ -478,8 +489,9 @@ exports.killRing = {
if (this.$data.length > 30) if (this.$data.length > 30)
this.$data.shift(); this.$data.shift();
}, },
get: function() { get: function(n) {
return this.$data[this.$data.length - 1] || ""; n = n || 1;
return this.$data.slice(this.$data.length-n, this.$data.length).reverse().join('\n');
}, },
pop: function() { pop: function() {
if (this.$data.length > 1) if (this.$data.length > 1)

View file

@ -521,7 +521,7 @@ var Editor = require("./editor").Editor;
this.getCopyText = function() { this.getCopyText = function() {
var text = ""; var text = "";
if (this.inMultiSelectMode) { if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {
var ranges = this.multiSelect.rangeList.ranges; var ranges = this.multiSelect.rangeList.ranges;
var buf = []; var buf = [];
for (var i = 0; i < ranges.length; i++) { for (var i = 0; i < ranges.length; i++) {
@ -550,10 +550,10 @@ var Editor = require("./editor").Editor;
var lines = text.split(/\r\n|\r|\n/); var lines = text.split(/\r\n|\r|\n/);
var ranges = this.selection.rangeList.ranges; var ranges = this.selection.rangeList.ranges;
if (lines.length > ranges.length || (lines.length <= 2 && !lines[1])) if (lines.length > ranges.length || lines.length < 2 || !lines[1])
return this.commands.exec("insertstring", this, text); return this.commands.exec("insertstring", this, text);
for (var i = ranges.length; i--; ) { for (var i = ranges.length; i--;) {
var range = ranges[i]; var range = ranges[i];
if (!range.isEmpty()) if (!range.isEmpty())
this.session.remove(range); this.session.remove(range);