Skip to content

Instantly share code, notes, and snippets.

@Naatan
Created March 6, 2015 15:54
Show Gist options
  • Save Naatan/b5a951f47c7b45459292 to your computer and use it in GitHub Desktop.
Save Naatan/b5a951f47c7b45459292 to your computer and use it in GitHub Desktop.
Komodo Macro: Quick Find / Highlight
/**
* Original macro: http://community.activestate.com/forum/macro-quick-find-highlight
* Forked to fix API's for Komodo 7 and beyond
*
* Copyright (c) 2009 Stan Angeloff http://blog.angeloff.name
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
if (typeof (extensions) === 'undefined')
window.extensions = {};
(function() {
const Cc = Components.classes;
const Ci = Components.interfaces;
// Get a reference to the script namespace
var $self = extensions.findWordUnderCursor ||
(extensions.findWordUnderCursor = { events: {} });
// Clean-up after previous execution
if ($self.onViewClosed)
window.removeEventListener('view_closed', $self.onViewClosed, false);
if ($self.onViewOpened)
window.removeEventListener('view_opened', $self.onViewOpened, false);
if ($self.destroyAll)
$self.destroyAll();
$self.isSupportedView = function(view) {
return (view && view.getAttribute('type') === 'editor');
};
$self.onViewOpened = function(e) {
var view = e.originalTarget;
if ($self.isSupportedView(view))
$self.apply(view);
};
$self.onViewClosed = function(e) {
var view = e.originalTarget;
if ($self.isSupportedView(view))
$self.destroy(view);
};
$self.destroy = function(view) {
if (view.uid in $self.events) {
view.removeEventListener('mouseup', $self.events[view.uid], false);
delete $self.events[view.uid];
}
};
$self.apply = function(view) {
var fn = function(e) {
if (e.which === 1 &&
e.altKey &&
! (e.ctrlKey || e.metaKey || e.shiftKey) &&
! (view.scimoz._startDragDrop || view.scimoz._inDragDrop)) {
e.stopPropagation();
e.preventDefault();
$self.jumpToSearch(view);
}
};
view.addEventListener('mouseup', fn, false);
$self.events[view.uid] = fn;
};
window.addEventListener('view_opened', $self.onViewOpened, false);
window.addEventListener('view_closed', $self.onViewClosed, false);
$self.forEach = function(fn) {
var viewsByType = ko.views.manager.topView.getViewsByType(true, 'editor'),
view;
for (var i = 0; i < viewsByType.length; i ++) {
view = viewsByType[i];
if ($self.isSupportedView(view))
fn.apply($self, [view]);
}
};
$self.applyToAll = function() { $self.forEach($self.apply); };
$self.destroyAll = function() { $self.forEach($self.destroy); };
$self.jumpToSearch = function(view) {
var findSvc = Cc['@activestate.com/koFindService;1'].getService(Ci.koIFindService);
var backupPatternType = findSvc.options.patternType;
backupCaseSensitivity = findSvc.options.caseSensitivity;
backupSearchBackward = findSvc.options.searchBackward;
backupMatchWord = findSvc.options.matchWord;
try {
view.scimoz.beginUndoAction();
var searchQuery = null;
if (view.scimoz.anchor === view.scimoz.currentPos) {
var editorPosition = view.scimoz.currentPos,
rangeStart, rangeEnd,
searchRegExp = /^[\w\-\_\.\$]*$/;
for (rangeStart = editorPosition;
rangeStart > 0 &&
searchRegExp.test(view.scimoz.getTextRange(rangeStart - 1, editorPosition));
rangeStart --);
for (rangeEnd = editorPosition;
rangeEnd < view.scimoz.length &&
searchRegExp.test(view.scimoz.getTextRange(rangeStart, rangeEnd + 1));
rangeEnd ++);
if (rangeStart < editorPosition ||
rangeEnd > editorPosition) {
var rangeText = view.scimoz.getTextRange(rangeStart, rangeEnd);
rangeText = rangeText.replace(/^[\-\_\.]+|[\-\_\.]+$/g, '');
if (searchRegExp.test(rangeText)) {
searchQuery = rangeText;
view.scimoz.anchor = view.scimoz.currentPos = rangeStart;
}
}
} else {
searchQuery = view.scimoz.selText;
view.scimoz.anchor = view.scimoz.currentPos = Math.min(view.scimoz.anchor, view.scimoz.currentPos);
}
if (searchQuery && searchQuery.length) {
var context = Cc['@activestate.com/koFindContext;1'].createInstance(Ci.koIFindContext);
context.type = Ci.koIFindContext.FCT_CURRENT_DOC;
findSvc.options.patternType = Ci.koIFindOptions.FOT_SIMPLE;
findSvc.options.caseSensitivity = Ci.koIFindOptions.FOC_INSENSITIVE;
findSvc.options.searchBackward = false;
findSvc.options.matchWord = false;
var wasVisible = ko.uilayout.outputPaneShown();
ko.find.findAll(window, context, searchQuery);
ko.find.findNext(window, context, searchQuery, 'find', true, false);
if ( ! wasVisible && ko.uilayout.outputPaneShown())
ko.uilayout.toggleSplitter('cmd_viewBottomPane');
StatusBar_AddMessage('Find Word under Cursor: ' + searchQuery, 'findwordundercursor', 2500, true);
} else
StatusBar_AddMessage('Find Word under Cursor: did not match a word', 'findwordundercursor', 1500, true);
} catch (exception) {
ko.dialogs.alert('Whoops! Find Word under Cursor encountered an exception:', exception);
throw exception;
} finally {
view.scimoz.endUndoAction();
findSvc.options.patternType = backupPatternType;
findSvc.options.caseSensitivity = backupCaseSensitivity;
findSvc.options.searchBackward = backupSearchBackward;
findSvc.options.matchWord = backupMatchWord;
}
};
$self.applyToAll();
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment