Merge pull request #1411 from ajaxorg/emmet

Emmet bugfix
This commit is contained in:
Lennart Kats 2013-05-07 04:52:38 -07:00
commit 4eff803f31
8 changed files with 125 additions and 44 deletions

File diff suppressed because one or more lines are too long

View file

@ -318,10 +318,15 @@ function runEmmetCommand(editor) {
editorProxy.setupContext(editor); editorProxy.setupContext(editor);
if (editorProxy.getSyntax() == "php") if (editorProxy.getSyntax() == "php")
return false; 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 { try {
var result = actions.run(this.name, editorProxy); var result = actions.run(this.action, editorProxy);
} catch(e) { } catch(e) {
editor._signal("changeStatus", typeof e == "string" ? e : e.message); editor._signal("changeStatus", typeof e == "string" ? e : e.message);
console.log(e); console.log(e);
@ -331,9 +336,11 @@ function runEmmetCommand(editor) {
for (var command in keymap) { for (var command in keymap) {
exports.commands.addCommand({ exports.commands.addCommand({
name: command, name: "emmet:" + command,
action: command,
bindKey: keymap[command], bindKey: keymap[command],
exec: runEmmetCommand exec: runEmmetCommand,
multiSelectAction: "forEach"
}); });
} }

View file

@ -60,8 +60,9 @@ define(function(require, exports, module) {
var kb = getEditorKeybordShortcuts(editor); var kb = getEditorKeybordShortcuts(editor);
var el = document.createElement('div'); var el = document.createElement('div');
var commands = kb.reduce(function(previous, current) { var commands = kb.reduce(function(previous, current) {
return previous + '<div class="ace_optionsMenuEntry"><b>' + current.command + '</b> : ' + return previous + '<div class="ace_optionsMenuEntry"><span class="ace_optionsMenuCommand">'
current.key + '</div>'; + current.command + '</span> : '
+ '<span class="ace_optionsMenuKey">' + current.key + '</span></div>';
}, ''); }, '');
el.id = 'kbshortcutmenu'; el.id = 'kbshortcutmenu';

View file

@ -44,6 +44,8 @@
define(function(require, exports, module) { define(function(require, exports, module) {
"use strict"; "use strict";
var keys = require("../../lib/keys");
/** /**
* Gets a map of keyboard shortcuts to command names for the current platform. * Gets a map of keyboard shortcuts to command names for the current platform.
* @author <a href="mailto:matthewkastor@gmail.com"> * @author <a href="mailto:matthewkastor@gmail.com">
@ -60,27 +62,39 @@ define(function(require, exports, module) {
* // {'command' : aCommand, 'key' : 'Control-d'} * // {'command' : aCommand, 'key' : 'Control-d'}
* // ] * // ]
*/ */
module.exports.getEditorKeybordShortcuts = function getEditorKeybordShortcuts (editor) { module.exports.getEditorKeybordShortcuts = function(editor) {
var commands = editor.commands.byName; var KEY_MODS = keys.KEY_MODS;
var commandName; var keybindings = [];
var key; var commandMap = {};
var platform = editor.commands.platform; editor.keyBinding.$handlers.forEach(function(handler) {
var kb = []; var ckb = handler.commmandKeyBinding;
for (commandName in commands) { for (var i in ckb) {
try { var modifier = parseInt(i);
key = commands[commandName].bindKey[platform]; if (modifier == -1) {
if (key) { modifier = "";
kb.push({ } else if(isNaN(modifier)) {
'command' : commandName, modifier = i;
'key' : key } 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;
}; };
}); });

View file

@ -38,3 +38,11 @@
.ace_closeButton{ .ace_closeButton{
background: rgba(245, 146, 146, 0.9); background: rgba(245, 146, 146, 0.9);
} }
.ace_optionsMenuKey {
color: darkslateblue;
font-weight: bold;
}
.ace_optionsMenuCommand {
color: darkcyan;
font-weight: normal;
}

View file

@ -85,12 +85,37 @@ EventEmitter.once = function(eventName, callback) {
EventEmitter.setDefaultHandler = 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]) if (handlers[eventName]) {
throw new Error("The default handler for '" + eventName + "' is already set"); 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];
this._defaultHandlers[eventName] = callback; 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 = EventEmitter.on =

View file

@ -420,7 +420,7 @@ var Editor = require("./editor").Editor;
this.setStyle("ace_multiselect"); this.setStyle("ace_multiselect");
this.keyBinding.addKeyboardHandler(commands.keyboardHandler); this.keyBinding.addKeyboardHandler(commands.keyboardHandler);
this.commands.on("exec", this.$onMultiSelectExec); this.commands.setDefaultHandler("exec", this.$onMultiSelectExec);
this.renderer.updateCursor(); this.renderer.updateCursor();
this.renderer.updateBackMarkers(); this.renderer.updateBackMarkers();
@ -434,7 +434,7 @@ var Editor = require("./editor").Editor;
this.unsetStyle("ace_multiselect"); this.unsetStyle("ace_multiselect");
this.keyBinding.removeKeyboardHandler(commands.keyboardHandler); this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);
this.commands.removeEventListener("exec", this.$onMultiSelectExec); this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec);
this.renderer.updateCursor(); this.renderer.updateCursor();
this.renderer.updateBackMarkers(); this.renderer.updateBackMarkers();
}; };
@ -445,20 +445,20 @@ var Editor = require("./editor").Editor;
if (!editor.multiSelect) if (!editor.multiSelect)
return; return;
if (!command.multiSelectAction) { if (!command.multiSelectAction) {
command.exec(editor, e.args || {}); var result = command.exec(editor, e.args || {});
editor.multiSelect.addRange(editor.multiSelect.toOrientedRange()); editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());
editor.multiSelect.mergeOverlappingRanges(); editor.multiSelect.mergeOverlappingRanges();
} else if (command.multiSelectAction == "forEach") { } else if (command.multiSelectAction == "forEach") {
editor.forEachSelection(command, e.args); result = editor.forEachSelection(command, e.args);
} else if (command.multiSelectAction == "forEachLine") { } else if (command.multiSelectAction == "forEachLine") {
editor.forEachSelection(command, e.args, true); result = editor.forEachSelection(command, e.args, true);
} else if (command.multiSelectAction == "single") { } else if (command.multiSelectAction == "single") {
editor.exitMultiSelectMode(); editor.exitMultiSelectMode();
command.exec(editor, e.args || {}); result = command.exec(editor, e.args || {});
} else { } else {
command.multiSelectAction(editor, e.args || {}); result = command.multiSelectAction(editor, e.args || {});
} }
e.preventDefault(); return result;
}; };
/** /**
@ -474,6 +474,7 @@ var Editor = require("./editor").Editor;
var session = this.session; var session = this.session;
var selection = this.selection; var selection = this.selection;
var rangeList = selection.rangeList; var rangeList = selection.rangeList;
var result;
var reg = selection._eventRegistry; var reg = selection._eventRegistry;
selection._eventRegistry = {}; selection._eventRegistry = {};
@ -487,7 +488,9 @@ var Editor = require("./editor").Editor;
} }
tmpSel.fromOrientedRange(rangeList.ranges[i]); tmpSel.fromOrientedRange(rangeList.ranges[i]);
this.selection = session.selection = tmpSel; 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.toOrientedRange(rangeList.ranges[i]);
} }
tmpSel.detach(); tmpSel.detach();
@ -499,6 +502,7 @@ var Editor = require("./editor").Editor;
this.onCursorChange(); this.onCursorChange();
this.onSelectionChange(); this.onSelectionChange();
return result;
}; };
/** /**

View file

@ -760,8 +760,7 @@ var TabstopManager = function(editor) {
"Esc": function(ed) { "Esc": function(ed) {
ed.tabstopManager.detach(); ed.tabstopManager.detach();
}, },
// todo multiselectExec doesn't handle command return values "Return": function(ed) {
"!Return": function(ed) {
//ed.tabstopManager.tabNext(1); //ed.tabstopManager.tabNext(1);
return false; return false;
} }