mirror of
https://github.com/mhinz/vim-galore.git
synced 2025-02-24 01:59:28 +08:00
Basics: ranges
This commit is contained in:
parent
6bc3959b7b
commit
2db7a8bf45
@ -16,6 +16,7 @@ All notable changes to this project will be documented in this file.
|
|||||||
- Basics: [Sessions?](README.md#sessions)
|
- Basics: [Sessions?](README.md#sessions)
|
||||||
- Basics: [Folding?](README.md#folding)
|
- Basics: [Folding?](README.md#folding)
|
||||||
- Basics: [Macros?](README.md#macros)
|
- Basics: [Macros?](README.md#macros)
|
||||||
|
- Basics: [Ranges?](README.md#ranges)
|
||||||
- Commands: [:redir](README.md#redir)
|
- Commands: [:redir](README.md#redir)
|
||||||
- Tips: [Saner command-line history](README.md#saner-command-line-history)
|
- Tips: [Saner command-line history](README.md#saner-command-line-history)
|
||||||
- Tips: [Reload a file on saving](README.md#reload-a-file-on-saving)
|
- Tips: [Reload a file on saving](README.md#reload-a-file-on-saving)
|
||||||
|
70
README.md
70
README.md
@ -22,6 +22,7 @@ added every day. Things about to be added can be found here:
|
|||||||
- [Mappings?](#mappings)
|
- [Mappings?](#mappings)
|
||||||
- [Mapleader?](#mapleader)
|
- [Mapleader?](#mapleader)
|
||||||
- [Registers?](#registers)
|
- [Registers?](#registers)
|
||||||
|
- [Ranges?](#ranges)
|
||||||
- [Marks?](#marks)
|
- [Marks?](#marks)
|
||||||
- [Motions? Operators? Text objects?](#motions-operators-text-objects)
|
- [Motions? Operators? Text objects?](#motions-operators-text-objects)
|
||||||
- [Autocmds?](#autocmds)
|
- [Autocmds?](#autocmds)
|
||||||
@ -412,6 +413,75 @@ checking `:reg`, so you can see what's actually happening.
|
|||||||
**Fun fact**: In Emacs "yanking" stands for pasting (or _reinserting previously
|
**Fun fact**: In Emacs "yanking" stands for pasting (or _reinserting previously
|
||||||
killed text_) not copying.
|
killed text_) not copying.
|
||||||
|
|
||||||
|
#### Ranges?
|
||||||
|
|
||||||
|
Ranges are pretty easy to understand, but many Vimmers don't know about their
|
||||||
|
full potential.
|
||||||
|
|
||||||
|
- Many commands take ranges.
|
||||||
|
- An address denotes a certain line.
|
||||||
|
- A range is either a single address or a pair of addresses separated by either
|
||||||
|
`,` or `;`.
|
||||||
|
- Ranges tell commands which lines to act on.
|
||||||
|
- Most commands act only on the current line by default.
|
||||||
|
- Only `:write` and `:global` act on all lines by default.
|
||||||
|
|
||||||
|
The usage of ranges is pretty intuitive, so here are some examples (using `:d`
|
||||||
|
as short form of `:delete`):
|
||||||
|
|
||||||
|
| Command | Lines acted on |
|
||||||
|
|---------|----------------|
|
||||||
|
| `:d` | Current line. |
|
||||||
|
| `:.d` | Current line. |
|
||||||
|
| `:1d` | First line. |
|
||||||
|
| `:$d` | Last line. |
|
||||||
|
| `:1,$d` | All lines. |
|
||||||
|
| `:%d` | All lines (syntactic sugar for `1,$`). |
|
||||||
|
| `:.,5d` | Current line to line 5. |
|
||||||
|
| `:,5d` | Also current line to line 5. |
|
||||||
|
| `:,+3d` | Current line and the next 3 lines. |
|
||||||
|
| `:1,+3d` | First line to current line + 3. |
|
||||||
|
| `:,-3d` | Current line and the last 3 lines. (Vim will prompt you, since this is a reversed range.) |
|
||||||
|
| `:3,'xdelete` | Lines 3 to the line marked by [mark](#marks) x. |
|
||||||
|
| `:/^foo/,$delete` | From the next line that starts with "foo" to the end. |
|
||||||
|
| `:/^foo/+1,$delete` | From the line after the line that starts with "foo" to the end. |
|
||||||
|
|
||||||
|
Note that instead of `,`, `;` can be used as a separator. The difference is that
|
||||||
|
in the case of `from,to`, the _to_ is relative to the current line, but when
|
||||||
|
using `from;to`, the _to_ is relative to the address of _from_! Assuming you're
|
||||||
|
on line 5, `:1,+1d` would delete lines 1 to 6, whereas `:1;+1d` would only
|
||||||
|
delete lines 1 and 2.
|
||||||
|
|
||||||
|
The `/` address can be preceded with another address. This allows you to _stack_
|
||||||
|
patterns, e.g.:
|
||||||
|
|
||||||
|
```viml
|
||||||
|
:/foo//bar//quux/d
|
||||||
|
```
|
||||||
|
|
||||||
|
This would delete the first line containing "quux" after the first line
|
||||||
|
containing "bar" after the first line containing "foo" after the current line.
|
||||||
|
|
||||||
|
Somtimes Vim automatically prepends the command-line with a range. E.g. start a
|
||||||
|
visual line selection with `V`, select some lines and type `:`. The command-line
|
||||||
|
will be populated with the range `'<,'>`, which means the following command will
|
||||||
|
use the previously selected lines as a range. (This is also why you sometimes
|
||||||
|
see mappings like `:vnoremap foo :<c-u>command`. Here `<c-u>` is used to remove
|
||||||
|
the range, because Vim will throw an error when giving a range to a command that
|
||||||
|
doesn't support it.)
|
||||||
|
|
||||||
|
Another example is using `!!` in normal mode. This will populate the
|
||||||
|
command-line with `:.!`. If followed by an external program, that program's
|
||||||
|
output would replace the current line. So you could replace the current
|
||||||
|
paragraph with the output of ls by using `:?^$?+1,/^$/-1!ls`. Fancy!
|
||||||
|
|
||||||
|
Related help:
|
||||||
|
|
||||||
|
```
|
||||||
|
:h cmdline-ranges
|
||||||
|
:h 10.3
|
||||||
|
```
|
||||||
|
|
||||||
#### Marks?
|
#### Marks?
|
||||||
|
|
||||||
You use marks to remember a position, that is line number and column, in a file.
|
You use marks to remember a position, that is line number and column, in a file.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user