Sublime Forum

Move cursor to top/middle/bottom of visible lines

#1

Hi,
I made a simple Plugin that moves the cursor to the top, middle or bottom of the screen (like VI H / M / L):

**Update: ** Added two Functions for moving the cursor up/down by x lines (see key bindings).

import sublime, sublime_plugin

class Move_caret_topCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        screenful = self.view.visible_region()

        col = self.view.rowcol(self.view.sel()[0].begin())[1]
        row = self.view.rowcol(screenful.a)[0] + 1
        target = self.view.text_point(row, col)

        self.view.sel().clear()
        self.view.sel().add(sublime.Region(target))

class Move_caret_middleCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        screenful = self.view.visible_region()

        col = self.view.rowcol(self.view.sel()[0].begin())[1]
        row_a = self.view.rowcol(screenful.a)[0]
        row_b = self.view.rowcol(screenful.b)[0]

        middle_row = (row_a + row_b) / 2
        target = self.view.text_point(middle_row, col)

        self.view.sel().clear()
        self.view.sel().add(sublime.Region(target))

class Move_caret_bottomCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        screenful = self.view.visible_region()

        col = self.view.rowcol(self.view.sel()[0].begin())[1]
        row = self.view.rowcol(screenful.b)[0] - 1
        target = self.view.text_point(row, col)

        self.view.sel().clear()
        self.view.sel().add(sublime.Region(target))

class Move_caret_forwardCommand(sublime_plugin.TextCommand):
    def run(self, edit, nlines):
        screenful = self.view.visible_region()

        (row,col) = self.view.rowcol(self.view.sel()[0].begin())
        target = self.view.text_point(row+nlines, col)

        self.view.sel().clear()
        self.view.sel().add(sublime.Region(target))
        self.view.show(target)

class Move_caret_backCommand(sublime_plugin.TextCommand):
    def run(self, edit, nlines):
        screenful = self.view.visible_region()

        (row,col) = self.view.rowcol(self.view.sel()[0].begin())
        target = self.view.text_point(row-nlines, col)

        self.view.sel().clear()
        self.view.sel().add(sublime.Region(target))
        self.view.show(target)

My Windows key bindings:

{ "keys": "alt+up"], "command": "move_caret_top" },
{ "keys": "alt+left"], "command": "move_caret_back", "args": { "nlines": 10}  },
{ "keys": "alt+right"], "command": "move_caret_forward", "args": { "nlines": 10} },
{ "keys": "alt+down"], "command": "move_caret_bottom"},

Note: The code is just a stripped down version of the commands found in the Vintage package (vintage_motions.py). To install, just save the code as a new Plugin (Tools->New Plugin…).

Regards, Thorsten.

1 Like

Command move_caret_forward has stopped working
Faster arrow key speed? keyboard scrolling
Command move_caret_forward has stopped working
#2

Works fantastic! Thanks!

0 Likes

#3

In my computer, your veru useful plugin moves the cursor not to the top of the screen but to the second line. It’s a minor inconvenience but…
I have a big display (48 lines). Any suggestion?

0 Likes

#4

[quote=“pedrober”]In my computer, your veru useful plugin moves the cursor not to the top of the screen but to the second line. It’s a minor inconvenience but…
I have a big display (48 lines). Any suggestion?[/quote]

Hi! You can remove “+ 1” in “Move_caret_topCommand” and “- 1” in “Move_caret_bottomCommand”. However, sometimes the cursor will be slightly out of view, if the first/last line is not completely visible.

Thorsten.

0 Likes

#5

Perfect solution. Thank you very much.

0 Likes

#6

How do you set shift+alt+left to select the text of the lines you move over?

1 Like

#7

Where do I place the python file in order to use it in my sublime text on mac ox x?

0 Likes

#8

I copy and pasted this into a jump_caret.py in my user directory, and then tried mapping keyboard commands to the command “move_caret_middle”. It does not seem to be working…

0 Likes

#9

Cause the OP is missing the opening [ on each keybind.
do it like:
{ "keys": ["alt+left"], "command": "move_caret_back", "args": { "nlines": 5} },

0 Likes