From 393e42b439a3762d5d203d6084c51c1c4d611f2f Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 8 Sep 2012 16:26:42 +0400 Subject: [PATCH] emacs recenter-top-bottom --- lib/ace/keyboard/emacs.js | 17 ++++++++++++++++- lib/ace/virtual_renderer.js | 4 +++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/ace/keyboard/emacs.js b/lib/ace/keyboard/emacs.js index 5fa7a315..9e3b5d89 100644 --- a/lib/ace/keyboard/emacs.js +++ b/lib/ace/keyboard/emacs.js @@ -212,7 +212,8 @@ exports.emacsKeys = { "S-C-Home" : "selecttostart", "S-C-End" : "selecttoend", - "C-l|M-s" : "centerselection", + "C-l" : "recenterTopBottom", + "M-s" : "centerselection", "M-g": "gotoline", "C-x C-p": "selectall", @@ -270,6 +271,20 @@ exports.emacsKeys = { exports.handler.bindKeys(exports.emacsKeys); exports.handler.addCommands({ + recenterTopBottom: function(editor) { + var renderer = editor.renderer; + var pos = renderer.$cursorLayer.getPixelPosition(); + var h = renderer.$size.scrollerHeight - renderer.lineHeight; + var scrollTop = renderer.scrollTop; + if (Math.abs(pos.top - scrollTop) < 2) { + scrollTop = pos.top - h; + } else if (Math.abs(pos.top - scrollTop - h * 0.5) < 2) { + scrollTop = pos.top; + } else { + scrollTop = pos.top - h * 0.5; + } + editor.session.setScrollTop(scrollTop); + }, selectRectangularRegion: function(editor) { editor.multiSelect.toggleBlockSelection(); }, diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index a97860d1..5ec1ffc5 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -1038,9 +1038,11 @@ var VirtualRenderer = function(container, theme) { cursor = {row: cursor, column: 0}; var pos = this.$cursorLayer.getPixelPosition(cursor); - var offset = pos.top - this.$size.scrollerHeight * (alignment || 0); + var h = this.$size.scrollerHeight - this.lineHeight; + var offset = pos.top - h * (alignment || 0); this.session.setScrollTop(offset); + return offset; }; this.STEPS = 8;