commit
4eff803f31
8 changed files with 125 additions and 44 deletions
27
index.html
27
index.html
File diff suppressed because one or more lines are too long
|
|
@ -318,10 +318,15 @@ function runEmmetCommand(editor) {
|
|||
editorProxy.setupContext(editor);
|
||||
if (editorProxy.getSyntax() == "php")
|
||||
return false;
|
||||
var actions = emmet.require("actions")
|
||||
var actions = emmet.require("actions");
|
||||
|
||||
if (this.action == "expand_abbreviation_with_tab") {
|
||||
if (!editor.selection.isEmpty())
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
var result = actions.run(this.name, editorProxy);
|
||||
var result = actions.run(this.action, editorProxy);
|
||||
} catch(e) {
|
||||
editor._signal("changeStatus", typeof e == "string" ? e : e.message);
|
||||
console.log(e);
|
||||
|
|
@ -331,9 +336,11 @@ function runEmmetCommand(editor) {
|
|||
|
||||
for (var command in keymap) {
|
||||
exports.commands.addCommand({
|
||||
name: command,
|
||||
name: "emmet:" + command,
|
||||
action: command,
|
||||
bindKey: keymap[command],
|
||||
exec: runEmmetCommand
|
||||
exec: runEmmetCommand,
|
||||
multiSelectAction: "forEach"
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -60,8 +60,9 @@ define(function(require, exports, module) {
|
|||
var kb = getEditorKeybordShortcuts(editor);
|
||||
var el = document.createElement('div');
|
||||
var commands = kb.reduce(function(previous, current) {
|
||||
return previous + '<div class="ace_optionsMenuEntry"><b>' + current.command + '</b> : ' +
|
||||
current.key + '</div>';
|
||||
return previous + '<div class="ace_optionsMenuEntry"><span class="ace_optionsMenuCommand">'
|
||||
+ current.command + '</span> : '
|
||||
+ '<span class="ace_optionsMenuKey">' + current.key + '</span></div>';
|
||||
}, '');
|
||||
|
||||
el.id = 'kbshortcutmenu';
|
||||
|
|
|
|||
|
|
@ -44,6 +44,8 @@
|
|||
|
||||
define(function(require, exports, module) {
|
||||
"use strict";
|
||||
var keys = require("../../lib/keys");
|
||||
|
||||
/**
|
||||
* Gets a map of keyboard shortcuts to command names for the current platform.
|
||||
* @author <a href="mailto:matthewkastor@gmail.com">
|
||||
|
|
@ -60,27 +62,39 @@ define(function(require, exports, module) {
|
|||
* // {'command' : aCommand, 'key' : 'Control-d'}
|
||||
* // ]
|
||||
*/
|
||||
module.exports.getEditorKeybordShortcuts = function getEditorKeybordShortcuts (editor) {
|
||||
var commands = editor.commands.byName;
|
||||
var commandName;
|
||||
var key;
|
||||
var platform = editor.commands.platform;
|
||||
var kb = [];
|
||||
for (commandName in commands) {
|
||||
try {
|
||||
key = commands[commandName].bindKey[platform];
|
||||
if (key) {
|
||||
kb.push({
|
||||
'command' : commandName,
|
||||
'key' : key
|
||||
});
|
||||
module.exports.getEditorKeybordShortcuts = function(editor) {
|
||||
var KEY_MODS = keys.KEY_MODS;
|
||||
var keybindings = [];
|
||||
var commandMap = {};
|
||||
editor.keyBinding.$handlers.forEach(function(handler) {
|
||||
var ckb = handler.commmandKeyBinding;
|
||||
for (var i in ckb) {
|
||||
var modifier = parseInt(i);
|
||||
if (modifier == -1) {
|
||||
modifier = "";
|
||||
} else if(isNaN(modifier)) {
|
||||
modifier = i;
|
||||
} else {
|
||||
modifier = "" +
|
||||
(modifier & KEY_MODS.command ? "Cmd-" : "") +
|
||||
(modifier & KEY_MODS.ctrl ? "Ctrl-" : "") +
|
||||
(modifier & KEY_MODS.alt ? "Alt-" : "") +
|
||||
(modifier & KEY_MODS.shift ? "Shift-" : "");
|
||||
}
|
||||
for (var key in ckb[i]) {
|
||||
var command = ckb[i][key]
|
||||
if (typeof command != "string")
|
||||
command = command.name
|
||||
if (commandMap[command]) {
|
||||
commandMap[command].key += "|" + modifier + key;
|
||||
} else {
|
||||
commandMap[command] = {key: modifier+key, command: command};
|
||||
keybindings.push(commandMap[command]);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
// errors on properties without bindKey we don't want them
|
||||
// so the errors don't need handling.
|
||||
}
|
||||
}
|
||||
return kb;
|
||||
});
|
||||
return keybindings;
|
||||
};
|
||||
|
||||
});
|
||||
|
|
@ -37,4 +37,12 @@
|
|||
}
|
||||
.ace_closeButton{
|
||||
background: rgba(245, 146, 146, 0.9);
|
||||
}
|
||||
.ace_optionsMenuKey {
|
||||
color: darkslateblue;
|
||||
font-weight: bold;
|
||||
}
|
||||
.ace_optionsMenuCommand {
|
||||
color: darkcyan;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
|
@ -85,12 +85,37 @@ EventEmitter.once = function(eventName, callback) {
|
|||
|
||||
|
||||
EventEmitter.setDefaultHandler = function(eventName, callback) {
|
||||
this._defaultHandlers = this._defaultHandlers || {};
|
||||
var handlers = this._defaultHandlers
|
||||
if (!handlers)
|
||||
handlers = this._defaultHandlers = {_disabled_: {}};
|
||||
|
||||
if (this._defaultHandlers[eventName])
|
||||
throw new Error("The default handler for '" + eventName + "' is already set");
|
||||
|
||||
this._defaultHandlers[eventName] = callback;
|
||||
if (handlers[eventName]) {
|
||||
var old = handlers[eventName];
|
||||
var disabled = handlers._disabled_[eventName];
|
||||
if (!disabled)
|
||||
handlers._disabled_[eventName] = disabled = [];
|
||||
disabled.push(old);
|
||||
var i = disabled.indexOf(callback);
|
||||
if (i != -1)
|
||||
disabled.splice(i, 1);
|
||||
}
|
||||
handlers[eventName] = callback;
|
||||
};
|
||||
EventEmitter.removeDefaultHandler = function(eventName, callback) {
|
||||
var handlers = this._defaultHandlers
|
||||
if (!handlers)
|
||||
return;
|
||||
var disabled = handlers._disabled_[eventName];
|
||||
|
||||
if (handlers[eventName] == callback) {
|
||||
var old = handlers[eventName];
|
||||
if (disabled)
|
||||
this.setDefaultHandler(eventName, disabled.pop());
|
||||
} else if (disabled) {
|
||||
var i = disabled.indexOf(callback);
|
||||
if (i != -1)
|
||||
disabled.splice(i, 1);
|
||||
}
|
||||
};
|
||||
|
||||
EventEmitter.on =
|
||||
|
|
|
|||
|
|
@ -420,7 +420,7 @@ var Editor = require("./editor").Editor;
|
|||
|
||||
this.setStyle("ace_multiselect");
|
||||
this.keyBinding.addKeyboardHandler(commands.keyboardHandler);
|
||||
this.commands.on("exec", this.$onMultiSelectExec);
|
||||
this.commands.setDefaultHandler("exec", this.$onMultiSelectExec);
|
||||
|
||||
this.renderer.updateCursor();
|
||||
this.renderer.updateBackMarkers();
|
||||
|
|
@ -434,7 +434,7 @@ var Editor = require("./editor").Editor;
|
|||
this.unsetStyle("ace_multiselect");
|
||||
this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);
|
||||
|
||||
this.commands.removeEventListener("exec", this.$onMultiSelectExec);
|
||||
this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec);
|
||||
this.renderer.updateCursor();
|
||||
this.renderer.updateBackMarkers();
|
||||
};
|
||||
|
|
@ -445,20 +445,20 @@ var Editor = require("./editor").Editor;
|
|||
if (!editor.multiSelect)
|
||||
return;
|
||||
if (!command.multiSelectAction) {
|
||||
command.exec(editor, e.args || {});
|
||||
var result = command.exec(editor, e.args || {});
|
||||
editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());
|
||||
editor.multiSelect.mergeOverlappingRanges();
|
||||
} else if (command.multiSelectAction == "forEach") {
|
||||
editor.forEachSelection(command, e.args);
|
||||
result = editor.forEachSelection(command, e.args);
|
||||
} else if (command.multiSelectAction == "forEachLine") {
|
||||
editor.forEachSelection(command, e.args, true);
|
||||
result = editor.forEachSelection(command, e.args, true);
|
||||
} else if (command.multiSelectAction == "single") {
|
||||
editor.exitMultiSelectMode();
|
||||
command.exec(editor, e.args || {});
|
||||
result = command.exec(editor, e.args || {});
|
||||
} else {
|
||||
command.multiSelectAction(editor, e.args || {});
|
||||
result = command.multiSelectAction(editor, e.args || {});
|
||||
}
|
||||
e.preventDefault();
|
||||
return result;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -474,7 +474,8 @@ var Editor = require("./editor").Editor;
|
|||
var session = this.session;
|
||||
var selection = this.selection;
|
||||
var rangeList = selection.rangeList;
|
||||
|
||||
var result;
|
||||
|
||||
var reg = selection._eventRegistry;
|
||||
selection._eventRegistry = {};
|
||||
|
||||
|
|
@ -487,7 +488,9 @@ var Editor = require("./editor").Editor;
|
|||
}
|
||||
tmpSel.fromOrientedRange(rangeList.ranges[i]);
|
||||
this.selection = session.selection = tmpSel;
|
||||
cmd.exec(this, args || {});
|
||||
var cmdResult = cmd.exec(this, args || {});
|
||||
if (!result == undefined)
|
||||
result = cmdResult;
|
||||
tmpSel.toOrientedRange(rangeList.ranges[i]);
|
||||
}
|
||||
tmpSel.detach();
|
||||
|
|
@ -499,6 +502,7 @@ var Editor = require("./editor").Editor;
|
|||
|
||||
this.onCursorChange();
|
||||
this.onSelectionChange();
|
||||
return result;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -760,8 +760,7 @@ var TabstopManager = function(editor) {
|
|||
"Esc": function(ed) {
|
||||
ed.tabstopManager.detach();
|
||||
},
|
||||
// todo multiselectExec doesn't handle command return values
|
||||
"!Return": function(ed) {
|
||||
"Return": function(ed) {
|
||||
//ed.tabstopManager.tabNext(1);
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue