Reputation: 1481
Let's say I have a file with N lines. I'm at line X and I'd like to move to line Y, where both X and Y are visible on screen. I can do that by typing :Y<cr>
, but if Y>99 that's a lot of typing. I can also do abs(Y-X)[kj] (move up or down by abs(Y-X)), but for big X,Y computing this difference mentally isn't so easy.
Is there a way to exploit the fact, that both X,Y are visible on screen and move between X and Y fast?
Upvotes: 3
Views: 1195
Reputation: 393064
Dropping my dime in the pond:
I find that traversing code is exceptionally easy with text objects. I rarely do use jk/JK for larger jumps any more. Instead I navigate for whitespace lines using { and }
Since on any one screen there are usually only so-many whitespace delineations (and they are very easily visually recognized and counted), I find that e.g.
lands me on the intended line a lot more often than, e.g., a guesstimated
To top it all, many 'brace-full' programming languages have opening braces at the start of functions. These can be reached with [[ resp. ]]. So sometimes it is just a matter of doing, e.g.
(meaning: go to start of previous function, after the first contiguous block of lines)
Upvotes: 2
Reputation: 76715
Perhaps you can make use of H
, M
, or L
.
These keys jump the cursor to display lines:
H "Home" top of screen
M "Middle" middle of screen
L "Last" last line of screen
With a count, they offset: 4L
would go to the third line above the last (1L
is the same as just L
).
Personally, I make heavy use of the m
command to mark a line for navigation. From where I am now, hit mq
to mark the position with label q
; then navigate to another line, and ma
to mark it with label a
; and from then on I can hit 'q
to jump to position q
and 'a
to jump to position a
. (q
and a
are arbitrary; I use those mostly due to their position on a QWERTY keyboard.)
One you have the marks, you can use them for commands. To delete from the current position to the line marked with q
, you just use: d'q
There is a variant, where instead of single quote you use back quote. This takes you to the exact position on the line where you placed the mark; the single quote uses the start of the line.
Those marks work even for ex
(command line) commands. To limit search and replace to a specific set of lines, I mark the beginning and end lines respectively with labels b
and e
, and then do my search and replace like so:
:'b,'es/foo/bar/g
Upvotes: 2
Reputation: 10585
You can use H
, M
or L
to go the top, middle and bottom of the screen.
Upvotes: 3
Reputation: 8336
You can :set relativenumber
which does that Y-X computing for you (only in Vim >= 7.3).
Upvotes: 8
Reputation: 24741
The tougher vimmer you are becoming, the bigger amount of lines you can count at first glance. Don't know, maybe there are some clever techniques, but I just type something like 17k/23j and so on.
also, searching some word on the string you want to jump works.
also, zz
(center screen) is sometimes helpful in this cases.
Upvotes: 0
Reputation: 13417
My version of VIM lets you guestimate a number immediately before hitting J or K to go that many lines.
15K goes up 15 lines
Upvotes: 0