This is the 5th post of my post series on nifty Nvim/Vim techniques that will make my editing experience easier.
As my config becomes longer and longer, I decided to split it into several Vim
scripts. I can then source those files in my init.vim. Initially, I wrote
something like source xxxx.vim. To my surprise, Nvim complained that it could
not find those Vim script. After searching on the internet, I find that
source command works relatively to your current work directory. In order to
source certain Vim script in the same directory as init.vim, we have to use
their absolute paths. Here is what I come up with:
let g:nvim_config_root = stdpath('config')
let g:config_file_list = ['variables.vim',
\ 'options.vim',
\ 'autocommands.vim',
\ 'mappings.vim',
\ 'plugins.vim',
\ 'ui.vim'
\ ]
for f in g:config_file_list
execute 'source ' . g:nvim_config_root . '/' . f
endforIn the above settings, we use the stdpath() function to get the directory of nvim config directory, which is rather convenient and works across platforms. Then we loop the files we want to source and source them one by one.
Sometimes, we only want to search in a range of lines, i.e., search from line n
to line m. The syntax can be best explained by giving a concrete example.
Suppose we want to search for the word search from line 10 to line 20, we can
use the following search pattern:
/\%>10l\%<20lsearchThe start line is given by \%>10l and the end line is given by \%<20l. For
more info, see :h search-range and :h /\%l.
To highlight some patterns, we can use the :match command. For example, in
order to highlight trailing white spaces, we may use the following command:
:match WarningMsg /\s\+$/The 1st argument to :match is a valid highlight group1. In the 2nd
argument, the highlight pattern is inside //. For more info, see :h match-highlight.
The problem is that we can only highlight one pattern using this command. This
means that if we want to highlight another pattern with :match command, only
one pattern get highlighted. Vim provides additional :2match and :3match
command to some avail. So in total, you can highlight three different patterns
using this command.
Fortunately, Vim also provides the matchadd() function which works similarly
to :match, except that there is no limit on the number of patterns to match.
For example, to match both trailing white spaces and leading tab characters,
use the following setting:
call matchadd('Warnings', '\s\+$')
call matchadd('Warnings', '^\t\+')In the above settings, it is important that you quote the pattern to match with single quote. If you use double quotes, those backslashes will get translated so that the regex pattern will not right.
When Vim is sourcing a file, you can use <sfile> inside function expand()
to get the path of the script. To get other info about the sourced file, use
filename-modifiers (see :h filename-modifiers).
" absolute path of currently sourced file
echo expand('<sfile>:p')
" directory containing currently sourced file
echo expand('<sfile>:p:h')I do not like tabs in my source file so I have set up the following settings in my config:
set tabstop=4
set softtabstop=4
set expandtabs
set shiftwidth=4This setting works great when I am editing source code. However, for existing
code using tabs, Vim/Nvim will not convert tabs into spaces automatically.
Usually, I just replace tabs with four spaces manually: :s/\t/ /g. But it
is tedious to type all this.
There is a quicker way to turn tabs into spaces using the :retab command. It
will turn tabs into 4 spaces if you use the above settings.
You can show all the available highlight groups with :highlight command. ↩︎
This is the 5th post of my post series on nifty Nvim/Vim techniques that will make my editing experience easier.
As my config becomes longer and longer, I decided to split it into several Vim
scripts. I can then source those files in my init.vim. Initially, I wrote
something like source xxxx.vim. To my surprise, Nvim complained that it could
not find those Vim script. After searching on the internet, I find that
source command works relatively to your current work directory. In order to
source certain Vim script in the same directory as init.vim, we have to use
their absolute paths. Here is what I come up with:
let g:nvim_config_root = stdpath('config')
let g:config_file_list = ['variables.vim',
\ 'options.vim',
\ 'autocommands.vim',
\ 'mappings.vim',
\ 'plugins.vim',
\ 'ui.vim'
\ ]
for f in g:config_file_list
execute 'source ' . g:nvim_config_root . '/' . f
endforIn the above settings, we use the stdpath() function to get the directory of nvim config directory, which is rather convenient and works across platforms. Then we loop the files we want to source and source them one by one.
Sometimes, we only want to search in a range of lines, i.e., search from line n
to line m. The syntax can be best explained by giving a concrete example.
Suppose we want to search for the word search from line 10 to line 20, we can
use the following search pattern:
/\%>10l\%<20lsearchThe start line is given by \%>10l and the end line is given by \%<20l. For
more info, see :h search-range and :h /\%l.
To highlight some patterns, we can use the :match command. For example, in
order to highlight trailing white spaces, we may use the following command:
:match WarningMsg /\s\+$/The 1st argument to :match is a valid highlight group1. In the 2nd
argument, the highlight pattern is inside //. For more info, see :h match-highlight.
The problem is that we can only highlight one pattern using this command. This
means that if we want to highlight another pattern with :match command, only
one pattern get highlighted. Vim provides additional :2match and :3match
command to some avail. So in total, you can highlight three different patterns
using this command.
Fortunately, Vim also provides the matchadd() function which works similarly
to :match, except that there is no limit on the number of patterns to match.
For example, to match both trailing white spaces and leading tab characters,
use the following setting:
call matchadd('Warnings', '\s\+$')
call matchadd('Warnings', '^\t\+')In the above settings, it is important that you quote the pattern to match with single quote. If you use double quotes, those backslashes will get translated so that the regex pattern will not right.
When Vim is sourcing a file, you can use <sfile> inside function expand()
to get the path of the script. To get other info about the sourced file, use
filename-modifiers (see :h filename-modifiers).
" absolute path of currently sourced file
echo expand('<sfile>:p')
" directory containing currently sourced file
echo expand('<sfile>:p:h')I do not like tabs in my source file so I have set up the following settings in my config:
set tabstop=4
set softtabstop=4
set expandtabs
set shiftwidth=4This setting works great when I am editing source code. However, for existing
code using tabs, Vim/Nvim will not convert tabs into spaces automatically.
Usually, I just replace tabs with four spaces manually: :s/\t/ /g. But it
is tedious to type all this.
There is a quicker way to turn tabs into spaces using the :retab command. It
will turn tabs into 4 spaces if you use the above settings.
You can show all the available highlight groups with :highlight command. ↩︎