(Move categories to tip template) |
m (should be 2 choices) Tag: Visual edit |
||
(4 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
− | {{review}} |
||
{{TipImported |
{{TipImported |
||
|id=650 |
|id=650 |
||
Line 9: | Line 8: | ||
|version=6.0 |
|version=6.0 |
||
|rating=5/5 |
|rating=5/5 |
||
− | |category1= |
+ | |category1=Abbreviations |
− | |category2= |
+ | |category2=Map |
}} |
}} |
||
− | You can define an abbreviation in such a way that it will ask whether to expand it or not. The trick is to define it as an |
+ | You can define an abbreviation in such a way that it will ask whether to expand it or not. The trick is to define it as an expression, then have that expression ask for confirmation: |
− | |||
− | Here is how to define it: |
||
− | |||
− | <pre> |
||
− | function! AskExpand(abbr,expansion) |
||
− | let answer=confirm("Expand '".a:abbr."' [y] ", "&Yes\n&No") |
||
− | if answer==2 |
||
− | exec "normal! a".a:abbr |
||
− | else |
||
− | exec "normal! a".a:expansion |
||
− | endif |
||
− | endfunction |
||
− | |||
− | imap ABC <esc>:call AskExpand("ABC","...expansion for ABC ...")<cr>a |
||
− | imap XYZ <esc>:call AskExpand("XYZ","...expansion for XYZ ...")<cr>a |
||
− | </pre> |
||
− | |||
⚫ | |||
− | It would be great if you could have the default prompt Yes or No for each abbreviation. It could be added as a parameter to the AskExpand. |
||
− | |||
− | <pre> |
||
− | "defprompt: 2 => Yes, 1=> NO |
||
− | function! MyAskExpand(abbr,expansion,defprompt) |
||
− | if a:defprompt==2 |
||
− | let answer=confirm("Expand '".a:abbr."' [y] ", "&Yes\n&No") |
||
− | if answer==2 |
||
− | exec "normal! a".a:abbr |
||
− | else |
||
− | exec "normal! a".a:expansion |
||
− | endif |
||
− | else |
||
− | let answer=confirm("Expand '".a:abbr."' [n] ", "&No\n&Yes") |
||
− | if answer==1 |
||
− | exec "normal! a".a:abbr |
||
− | else |
||
− | exec "normal! a".a:expansion |
||
− | endif |
||
− | endif |
||
− | endfunction |
||
− | |||
− | "imap XYZ <esc>:call myAskExpand("XYZ","...expansion for XYZ ...")<cr>a |
||
− | imap abc <esc>:call MyAskExpand("abc",'buginf("\n:KV:%s ",__FUNCTION__ );',2)<cr>a "default is YES |
||
− | imap xyz <esc>:call MyAskExpand("xyz",'/* VITTAL_DEBUG */',1)<cr>a "default is NO. |
||
− | </pre> |
||
− | |||
− | The above function does not need to be that complex: <tt>confirm()</tt> takes a third argument for the default choice. See my next comment. |
||
− | |||
− | ---- |
||
− | We can use <tt>:iab</tt> with no problem. The syntax is just slightly different. i.e.: |
||
<pre> |
<pre> |
||
function! s:Ask(abbr,expansion,defprompt) |
function! s:Ask(abbr,expansion,defprompt) |
||
− | let answer=confirm("Expand '".a:abbr."'?", "&Yes\n&No", a:defprompt) |
+ | let answer = confirm("Expand '" . a:abbr . "'?", "&Yes\n&No", a:defprompt) |
" testing against 1 and not 2, I correctly take care of <abort> |
" testing against 1 and not 2, I correctly take care of <abort> |
||
− | return answer==1 ? a:expansion : a:abbr |
+ | return answer == 1 ? a:expansion : a:abbr |
endfunction |
endfunction |
||
− | + | iabbrev <expr> for <SID>Ask('for', "for () {\n}", 2) |
|
</pre> |
</pre> |
||
+ | ==References== |
||
− | This is the kind of technique I propose in {{script|id=50|text=a Vim library}}, and that by extension, I use in my {{script|id=336|text=C&C++ ftplugin suite}} -- except none of the abbreviations ask question, they are context sensitive. |
||
+ | *{{help|:iabbrev}} |
||
+ | *{{help|:map-expression}} |
||
⚫ | |||
− | ---- |
Latest revision as of 07:04, 26 December 2019
Tip 650 Printable Monobook Previous Next
created February 4, 2004 · complexity basic · author Yakov Lerner · version 6.0
You can define an abbreviation in such a way that it will ask whether to expand it or not. The trick is to define it as an expression, then have that expression ask for confirmation:
function! s:Ask(abbr,expansion,defprompt) let answer = confirm("Expand '" . a:abbr . "'?", "&Yes\n&No", a:defprompt) " testing against 1 and not 2, I correctly take care of <abort> return answer == 1 ? a:expansion : a:abbr endfunction iabbrev <expr> for <SID>Ask('for', "for () {\n}", 2)