Skip to content

Commit abc89ae

Browse files
authored
Support Ctrl-A, Ctrl-W and Ctrl-U (#258)
1 parent ae89b27 commit abc89ae

File tree

1 file changed

+91
-22
lines changed

1 file changed

+91
-22
lines changed

lib/web_console/templates/console.js.erb

Lines changed: 91 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -654,57 +654,85 @@ REPLConsole.prototype.onKeyDown = function(ev) {
654654
}
655655

656656
switch (ev.keyCode) {
657-
case 69:
658-
// Ctrl-E
657+
case 65: // Ctrl-A
658+
if (ev.ctrlKey) {
659+
this.setInput(this._input, 0);
660+
ev.preventDefault();
661+
}
662+
break;
663+
664+
case 69: // Ctrl-E
659665
if (ev.ctrlKey) {
660666
this.onTabKey();
661667
ev.preventDefault();
662668
}
663669
break;
664-
case 9:
665-
// Tab
670+
671+
case 87: // Ctrl-W
672+
if (ev.ctrlKey) {
673+
this.deleteWord();
674+
ev.preventDefault();
675+
}
676+
break;
677+
678+
case 85: // Ctrl-U
679+
if (ev.ctrlKey) {
680+
this.deleteLine();
681+
ev.preventDefault();
682+
}
683+
break;
684+
685+
case 69: // Ctrl-E
686+
if (ev.ctrlKey) {
687+
this.onTabKey();
688+
ev.preventDefault();
689+
}
690+
break;
691+
692+
case 80: // Ctrl-P
693+
if (! ev.ctrlKey) break;
694+
695+
case 78: // Ctrl-N
696+
if (! ev.ctrlKey) break;
697+
698+
case 9: // Tab
666699
this.onTabKey();
667700
ev.preventDefault();
668701
break;
669-
case 13:
670-
// Enter key
702+
703+
case 13: // Enter key
671704
this.onEnterKey();
672705
ev.preventDefault();
673706
break;
674-
case 80:
675-
// Ctrl-P
676-
if (! ev.ctrlKey) break;
677-
case 38:
678-
// Up arrow
707+
708+
case 38: // Up arrow
679709
this.onNavigateHistory(-1);
680710
ev.preventDefault();
681711
break;
682-
case 78:
683-
// Ctrl-N
684-
if (! ev.ctrlKey) break;
685-
case 40:
686-
// Down arrow
712+
713+
case 40: // Down arrow
687714
this.onNavigateHistory(1);
688715
ev.preventDefault();
689716
break;
690-
case 37:
691-
// Left arrow
717+
718+
case 37: // Left arrow
692719
var caretPos = this._caretPos > 0 ? this._caretPos - 1 : this._caretPos;
693720
this.setInput(this._input, caretPos);
694721
ev.preventDefault();
695722
break;
696-
case 39:
697-
// Right arrow
723+
724+
case 39: // Right arrow
698725
var length = this._input.length;
699726
var caretPos = this._caretPos < length ? this._caretPos + 1 : this._caretPos;
700727
this.setInput(this._input, caretPos);
701728
ev.preventDefault();
702729
break;
703-
case 8:
704-
// Delete
730+
731+
case 8: // Delete
705732
this.deleteAtCurrent();
706733
ev.preventDefault();
707734
break;
735+
708736
default:
709737
break;
710738
}
@@ -757,6 +785,47 @@ REPLConsole.prototype.deleteAtCurrent = function() {
757785
}
758786
};
759787

788+
/**
789+
* Deletes the current line.
790+
*/
791+
REPLConsole.prototype.deleteLine = function() {
792+
if (this._caretPos > 0) {
793+
this.setInput("", 0);
794+
795+
if (!this._input) {
796+
this.autocomplete && this.autocomplete.cancel();
797+
this.autocomplete = false;
798+
}
799+
}
800+
};
801+
802+
/**
803+
* Deletes the current word.
804+
*/
805+
REPLConsole.prototype.deleteWord = function() {
806+
if (this._caretPos > 0) {
807+
var i = 1, current = this._caretPos;
808+
while (this._input[current - i++] == " ");
809+
810+
var deleteIndex = 0;
811+
for (; current - i > 0; i++) {
812+
if (this._input[current - i] == " ") {
813+
deleteIndex = current - i;
814+
break;
815+
}
816+
}
817+
818+
var before = this._input.substring(0, deleteIndex);
819+
var after = this._input.substring(current, this._input.length);
820+
this.setInput(before + after, deleteIndex);
821+
822+
if (!this._input) {
823+
this.autocomplete && this.autocomplete.cancel();
824+
this.autocomplete = false;
825+
}
826+
}
827+
};
828+
760829
/**
761830
* Insert a character at the current position.
762831
*/

0 commit comments

Comments
 (0)