Saturday, January 25, 2020

Re: Conditional configuration based upon filenames

On 2020-01-25, cjsmall wrote:
> I want to do some conditional setup and key assignments based upon the
> name of the file currently being edited.  Here is what I've got so far as the
> .vimrc file in the target directory:
>
> so /u/jeff/lib/vi/vimrc.html
> so /u/jeff/lib/vi/vimrc.tab4
> " =============================================
> :if (@% == ".vimrc")
>     " Alt-F1: Insert contents from hidden file .vim_01
>     nnoremap  <Esc>[29;3~ :read .vim_01<CR>
>     inoremap  <Esc>[29;3~ <ESC>:read .vim_01<CR>
> :elseif (@% == "editor.html")
>     " Alt-F1: Insert contents from hidden file .edit_01
>     nnoremap  <Esc>[29;3~ :read .edit_01<CR>
>     inoremap  <Esc>[29;3~ <ESC>:read .edit_01<CR>
> :elseif (@% == "gimp.html")
>     " Alt-F1: Insert contents from hidden file .gimp_01
>     nnoremap  <Esc>[29;3~ :read .gimp_01<CR>
>     inoremap  <Esc>[29;3~ <ESC>:read .gimp_01<CR>
>     "
>     " Alt-F2: Insert contents from hidden file .gimp_02
>     nnoremap  <Esc>[1;3Q :read .gimp_02<CR>
>     inoremap  <Esc>[1;3Q <ESC>:read .gimp_02<CR>
>     "
>     " Alt-F3: Insert contents from hidden file .gimp_03
>     nnoremap  <Esc>[1;3R :read .gimp_03<CR>
>     inoremap  <Esc>[1;3R <ESC>:read .gimp_03<CR>
> :endif
> " =============================================
>
> This allows me to remap my Alt-function keys on a file-by-file basis to
> insert snippets of file-dependent code.  This works fine when editing
> a single file, for example:
>
> vim gimp.html
>
> but it does not work when multiple files are specified as in:
>
> vim editor.html gimp.html
>
> The conditional assignments are made upon entering  the first file,
> but do not automatically update when moving on to the second file.
>
> Three questions:
>
> 1) How can I make this update automatically as I switch between files?

You can use autocommands, for example:

" Alt-F1: Insert contents from hidden file .vim_01
au BufNewFile,BufRead .vimrc nnoremap <buffer> <Esc>[29;3~ :read .vim_01<CR>
au BufNewFile,BufRead .vimrc inoremap <buffer> <Esc>[29;3~ <ESC>:read .vim_01<CR>

Note the use of <buffer> which restricts the mapping to the buffer
that was current when the mapping was defined.

See

:help autocommands
:help 40.3
:help :map-<buffer>

> 2) I could do this by forcing every file to resource the .vimrc file upon
> entry.  However, the vim: modeline only works for set options.  Is there
> a similar method of executing a command (e.g., :source .vimrc) upon
> entering a file?

You can use an autocommand to source a file as well, but I wouldn't
source your .vimrc. That generally causes headaches and there are
better solutions.

> 3) Some files have symbolic links and may be accessed through
> alternate names.  Is there a variable that vim has that can produce
> the "real" filename?

Take a look at

:help resolve()

> Assuming that cannot be done, how do I write a vim logical OR
> conditional; something like:
>
> :if ((condition 1) || (condition 2))
>
> I know this must be in the :help documentation, but so far I haven't
> stumbled upon it.

Expressions are documented in eval.txt. For a logical or, see

:help expr-||

HTH,
Gary

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/vim_use/20200125233009.GC23965%40phoenix.

No comments: