UNPKG

nikki

Version:

A browser-based IDE written in NodeJS. For Real.

236 lines (193 loc) 4.93 kB
/** * This module simply defines keyboard actions * to be performed on certain keyboard shortcuts. * * @type {exports} */ var state = require('./state'); var config = require('./config'); var keyboard = require('./keyboard'); var bar = require('./bar'); var search = require('./search'); var editor = require('./editor'); var socket = require('./socket'); var tabs = require('./tabs'); var config = require('./config'); var ui = require('./ui'); var fs = require('./fs'); var preview = require('./preview'); /** * Returns a keybord shortcut given its name. */ var shortcut = function(name) { var shortcut = config.get('editor.shortcuts.' + name); if (!shortcut) { bar.error("Configuration error: please map the '{s}' shortcut".replace('{s}', name)); } return shortcut; }; /** * Delete a file */ keyboard.on(shortcut('file_preview'), function() { preview.toggle(); }); /** * Delete a file */ keyboard.on(shortcut('directory_move_up'), function() { if (state.focus === 'fs') { fs.moveUp(); } }); /** * Delete a file */ keyboard.on(shortcut('question_confirm'), function() { var question = bar.question(); if (question) { var event = question.attr('event'); var subject = JSON.parse(question.attr('subject')); socket.emit(event, subject); bar.hide(); return false; } }); /** * Delete a file */ keyboard.on(shortcut('question_abort'), function() { var question = bar.question(); if (question) { bar.hide(); return false; } }); /** * Delete a file */ keyboard.on(shortcut('file_delete'), function() { var activeResource = $('.resource.active'); if (activeResource.length) { var resource = JSON.parse(activeResource.attr('data-resource')); bar.ask('Are you sure you want to delete ' + resource.path + '?', 'resource.delete', resource); } return false; }); /** * Open in github. * * Please note that this feature depends on the configuration. */ keyboard.on(shortcut('open_in_github'), function() { if (state.openFile && config.get('github.enabled')) { var url = 'https://github.com/'; var username = config.get('github.username'); var parts = state.openFile.path.replace(config.get('github.path'), ''); var repo = parts.split('/')[1]; var path = parts.split(repo)[1]; var url = url + username + '/' + repo + '/blob/master/' + path + '#L' + editor.getLine(); window.open(url, '_tab'); } return false; }); /** * Closes a tab. */ keyboard.on(shortcut('tab_close'), function() { tabs.closeActive(); return false; }); /** * Moves to the tab on the left. */ keyboard.on(shortcut('tab_move_left'), function() { tabs.moveLeft(); return false; }); /** * Moves to the tab on the right. */ keyboard.on(shortcut('tab_move_right'), function() { tabs.moveRight(); return false; }); /** * Save file */ keyboard.on(shortcut('file_save'), function() { if (state.focus === 'tab') { bar.alert('Saving...'); state.openFile.data = editor.getValue(); socket.emit('resource.save', state.openFile); } return false; }); /** * Switch focus */ keyboard.on(shortcut('focus_switch'), function() { var focus = 'tab'; if (state.focus === 'tab') { focus = 'fs'; } state.switchFocus(focus); }); /** * Local search */ keyboard.on(shortcut('find'), function() { search.toggle(); return false; }); /** * Local search */ keyboard.on(shortcut('grep'), function() { search.toggle('grep'); return false; }); /** * Down arrow */ keyboard.on(shortcut('file_move_down'), function() { if (state.focus === 'fs') { var resource = $('.resource.active'); var canGoDown = resource.next().hasClass('resource'); if (canGoDown) { resource.removeClass('active'); resource.next().addClass('active'); } else { bar.alert("Where ya goin?") } return false; } }); /** * Up arrow */ keyboard.on(shortcut('file_move_up'), function() { if (state.focus === 'fs') { var resource = $('.resource.active'); var canGoDown = resource.prev().hasClass('resource'); if (canGoDown) { resource.removeClass('active'); resource.prev().addClass('active'); } else { bar.alert("Where ya goin?") } return false; } }); /** * Open files / directories */ keyboard.on(shortcut('file_open'), function() { if (state.focus === 'fs') { var resource = $('.resource.active'); if (resource) { socket.emit('resource.open', JSON.parse(resource.attr('data-resource'))) } return false; } });