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

View file

@ -521,7 +521,7 @@ var Editor = require("./editor").Editor;
this.getCopyText = function() {
var text = "";
if (this.inMultiSelectMode) {
if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {
var ranges = this.multiSelect.rangeList.ranges;
var buf = [];
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 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);
for (var i = ranges.length; i--; ) {
for (var i = ranges.length; i--;) {
var range = ranges[i];
if (!range.isEmpty())
this.session.remove(range);