Vim: Calculating age in substitution
Let's say you have:
source: https://sanctum.geek.nz/arabesque/advanced-vim-macros/
Stallman Richard GNU 1953 USA
Wall Larry Perl 1954 USA
Moolenar Bram Vim 1961 Netherlands
Tridgell Andrew Samba 1967 Australia
Matsumoto Yukihiro Ruby 1965 Japan
Ritchie Dennis C 1941 USA
Thompson Ken Unix 1943 USA
and you want to calculate how old each of these guys above
is right now:
My solution with no macros:
:%s,\d\+,\=strftime("%Y")-submatch(0)
Stallman Richard GNU 66 USA
Wall Larry Perl 65 USA
Moolenar Bram Vim 58 Netherlands
Tridgell Andrew Samba 52 Australia
Matsumoto Yukihiro Ruby 54 Japan
Ritchie Dennis C 78 USA
Thompson Ken Unix 76 USA
Tip 1: Use Regular Expressions to match the numbers
\d\+
means: find a digit or more. That regex matches exactly our fourth column
Tip 2: Exchange Delimiter
In my case typing comma is much easier than typing slash, so I have exchanged the substitution delimiter.
Tip 3: Not always we need the global substitution
In our case we just need the substitution once, so we omitted the final coma plus 'g'
Tip 4: Use expression register in substitution
In order to use expression register in substitution just type \=
Tip 5: To get current year
We are using strftime("%Y")
Tip 6: Submatch(0)
It matches the pattern we just referred on the search part of the substitution
For more information use the vim help system:
:h regex
:h \=
:h submatch
:h strftime
Top comments (2)
I never knew about submatches like that. Thanks!
The mentioned reference teaches us how to solve the same issue using macros: sanctum.geek.nz/arabesque/advanced...