Saturday, October 11, 2014

Re: How to use <script> attribute in map command?

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

On October 12, 2014 1:30:38 AM GMT+03:00, Yegappan Lakshmanan <yegappanl@gmail.com> wrote:
>Hi,
>
>>> >>>>
>>> >>>> On Friday, October 10, 2014 12:04:17 PM UTC+2, jiaxing_wang
>wrote:
>>> >>>>> This wiki page:
>>> >>>>>
>>> >>>>>
>http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-_Tutorial_(Part_3)
>>> >>>>>
>>> >>>>>
>>> >>>>>
>>> >>>>>
>>> >>>>> says with the following maps in a script file:
>>> >>>>>
>>> >>>>>
>>> >>>>> nnoremap \x /Topic
>>> >>>>> nmap <script> ,f \x<CR>
>>> >>>>>
>>> >>>>>
>>> >>>>> "In the second map command, ',f' is mapped to invoke \x which
>is replaced with '/Topic'.
>>> >>>>>
>>> >>>>> If the user or some other plugin has defined a mapping for
>'\x', then it is not used by ',f'."
>>> >>>>>
>>> >>>>>
>>> >>>>>
>>> >>>>> But I tried and find '\x' is not remapped to '/Topic' as the
>wiki says, so what does <script>
>>> >>>>>
>>> >>>>> really mean and how to use it?
>>> >>>> Unfortunately the wiki example is wrong.
>>> >>>>
>>> >>>> Here's a short script that uses a mapping with <script>.
>>> >>>>
>>> >>>> function! s:SayHelloToUser() abort
>>> >>>> echo printf("Hello %s!", $USER)
>>> >>>> endfunction
>>> >>>>
>>> >>>> nmap <script> <Plug>SayHello :<C-U>call
><SID>SayHelloToUser()<CR>
>>> >>>>
>>> >>>> The <Plug> mapping is the hook that a user can map to, eg by
>defining
>>> >>>>
>>> >>>> nmap <Leader>h <Plug>SayHello
>>> >>>>
>>> >>>> In the <Plug> mapping, <script> ensures that the right-hand
>side of the
>>> >>>> mapping will never be affected by user-defined mappings.
>>> >>>>
>>> >>>> For example, if <script> were missing and somebody had defined
>a
>>> >>>> command-line mode mapping for the character sequence 'cal',
>then the
>>> >>>> mapping will likely fail because 'cal' is mapped to whatever
>the user
>>> >>>> mapped it to. <script> protects from such disruptions.
>>> >>> My example is a bit poor though, since in this case you might as
>well
>>> >>> just use :nnoremap to be safe from side-effects. But I hope I
>got the
>>> >>> point across.
>>> >>>
>>> >> Still don't understand the difference from :nnoremap, :-(
>>> >> what's more, the :h :map-<script> seems to mean the same as the
>wiki:
>>> >>
>>> >> *:map-<script>* *:map-script*
>>> >> If the first argument to one of these commands is "<script>" and
>it is used to
>>> >> define a new mapping or abbreviation, the mapping will only remap
>characters
>>> >> in the {rhs} using mappings that were defined local to a script,
>starting with
>>> >> "<SID>". This can be used to avoid that mappings from outside a
>script
>>> >> interfere (e.g., when CTRL-V is remapped in mswin.vim), but do
>use other
>>> >> mappings defined in the script.
>>> >> Note: ":map <script>" and ":noremap <script>" do the same thing.
>The
>>> >> "<script>" overrules the command name. Using ":noremap <script>"
>is
>>> >> preferred, because it's clearer that remapping is (mostly)
>disabled.
>>> >>
>>> >> thanks.
>>> > Ok, let's reuse my example and add an intermediate mapping.
>>> >
>>> > nnoremap <SID>SayHelloRedirect :<C-U>call
><SID>SayHelloToUser()<CR>
>>> > nmap <script> <Plug>SayHello <SID>SayHelloRedirect
>>> >
>>> > In this case :nmap <script> (or :nnoremap <script>) allow the
><Plug>
>>> > mapping to be remapped to the intermediate mapping. This would not
>work
>>> > with plain :nnoremap because it prevents all remapping.
>>> But with <SID> used before SayHelloRedirect,
>>> nmap <Plug>SayHello <SID>SayHelloRedirect
>>> does the same thing, it will not be interfered by somebody mapping
>'SayHelloRedirect',
>>> so what interference is <script> used to prevent?
>>>
>>> forgive my paranoia ;-)
>>> >
>>> > Personally I never use <script> and I agree with ZyX that it is
>quite
>>> > useless.
>>> >
>>> > You can find some discussion in the user manual, try this command:
>>> >
>>> > :h usr_41|/PIECES
>>
>> You're exactly right. <SID> is protection enough and that's why I
>don't
>> see the point of using <script>.
>>
>
>To understand the need for the <script> attribute, try using the
>following two maps:
>
>nnoremap <SID>\x /Topic
>nnoremap ,f <SID>\x
>
>In the above case, the {rhs} is not remapped.
>
>nnoremap <SID>\x /Topic
>nnoremap <script> ,f <SID>\x
>
>In the above case, the {rhs} is remapped (due to the use of <script>).

Nope. We do understand this, but your example is pointless because what you are achieving is just as well achieved with :map. Using script-specific prefix ensures that third-party mappings do not interfere. What I meant by functions is something like this:

noremap <SID>(FindTopic) /Topic
nnoremap <script> ,dt <SID>(FindTopic)dd
onoremap <script> ,t <SID>(FindTopic)
nnoremap <script> ,yt <SID>(FindTopic)yy

This way user may safely remap 'd' or 'y' and plugin still can reuse code.

>
>- Yegappan
>
>>
>> However, some people think differently. Try this command and you'll
>find
>> that there are many instances of <script> in the Vim runtime files:
>>
>> :vim /<script>/ $VIMRUNTIME/**/*.vim
>>
>> I see there's even one I'm responsible for, shame on me :)
>>

-----BEGIN PGP SIGNATURE-----
Version: APG v1.1.1

iQI1BAEBCgAfBQJUOcLMGBxaeVggPHp5eC52aW1AZ21haWwuY29tPgAKCRCf3UKj
HhHSvjxBEACFXMLwqu3dElEajlUW6wB0EZG2qtaHgKkuJYCBFz5nqsJ+7ILj0KK+
2hO7YqEmOUMV9Jrp0YL/uaMD0u0RqpQ/zmmszyTeyKZxeA5k7uFraKJLgTEysTl2
gjG6rYUG7lcWuIKrKKbrwmUxgLqJ/jsNZeTsbEPpCyoTTOq8lnk4MUlo1+VIgm5m
u+g7gtmjXyUZCDoM8PZXT7wVPKkNbD7tRuB70/1EFpGLrAAbx7PWrkxm4ClkXLrT
VU1uf+2Z26RFbuDXHXdE1xLHkILQhqS1//oLAZza0nzFYEQt35L4FGQBA1k85afF
/brWqG8gI149WnBTb66lf7dynEclEPKqhULPAFb5xd3AJg3gTmFPndQg9KSoRsLz
U6TyQ8+MoSqemUhqmtzLYu4iisT3+n9WjmjZj+NsMtND5u2mM06ZYUlHT610fY7F
IxmynOarDCXQy44VXUrvfOfhKX9reIwDxmSh9nhbt4LxE2vEeivmeibCKsBYAqf8
V8qi2GYhNYX5fU120Z0eVMvwlxMl5jjO7KHVebZ/h3hbdm5mimISm5JxSyOVdGyH
pGm22foB2GJpsnbH29oYsta/zUNtC/9xlAoD/3wehFF1WM/57MS3QOnsTTJ/zakE
A0ULf1eDM9isVLRVraObxK0sY3e4Pi9aIHF0XcWu3fzzAujCJCKKPQ==
=5U7q
-----END PGP SIGNATURE-----

--
--
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.
For more options, visit https://groups.google.com/d/optout.

No comments: