Consistency in global operations in vim

sed, vim

Solution

I guess you are confused with `:g[lobal]`, `:s[ubstitute]` and `:[range]delete`

let's make some example:

`g` is a flag of `:s`:

- `:s/foo/bar/` : replace only the first `foo` with `bar` in current line

- `:s/foo/bar/g` : replace all `foo` with `bar` in current line

- `%:s/foo/bar/` : for each line in the whole file, replace only the first `foo` with `bar`

- `%:s/foo/bar/g` : replace all `foo` with `bar` in whole file (all lines)

`:g` as `:global` command: `:g` can do with any commands, not only `d`

- `:g/foo/d` : delete all matched lines default range is `%`

- `:%g/foo/d` : same as above

- `:1,30g/foo/d`: from line 1-30, remove all lines contain `foo`

- `:g/foo/normal >>`: indent all lines, which match `foo` (not only work with `d`)

- `:g/foo/y A`: yank all matched (`/foo/`) lines to register `a` (not only work with `d`)

`:d` command: (`:[range]d[elete]`)

- `:/foo/d` : `/foo/` here is a range. delete next matched line

- `:%d` : delete all lines (empty the file)

- `:%/foo/d` : this won't work. because you have two ranges (% and /foo/)

- `:/foo/dg` : this won't work either. no `dg` command

- `:g/foo/d` : this works, same as above(the `:g` section), but it is from `:global` command

I hope you get a bit clear. (or more confused? I hope not.. ^_^)

you may want to take a look followings

:h :s
:h :g
:h :d
:h range

Problem

Consider these two vim commands - `:% s/one/two/g` - `:% g/found/d` I am wondering why the `g` signaling global replacement and delete respectively needs to be put in the end in substitution and at the beginning in delete. Do these follow a pattern that I am missing, or is this a vim corner case?

Original source