-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 On 23-Mar-2018 17:28 +0100, 'Andy Wokula' via vim_dev wrote: > Am 13.04.2011 um 17:07 schrieb Andy Wokula: >> Am 09.04.2011 20:27, schrieb Ingo Karkat: >>> On 09-Apr-2011 14:54, Andy Wokula wrote: >>>> For example, I have a command :InFunc . It's quite a trivial >>>> command, it takes an argument Ex-command and executes it within a >>>> function. Purpose is to automatically restore the highlighting state >>>> and the last search pattern. >>>> :h function-search-undo >>>> >>>> Thus, mostly the Ex-command will be :global or :substitute . >>>> >>>> Problem: :global has the default range "1,$" whereas :substitute has >>>> the default range ".". For :InFunc, I'm urged to specify a default >>>> range (e.g. either -range (current line) or -range=% (whole buffer)). >>>> I don't want that, instead I want the default range of the argument >>>> command to be in effect. But at the moment, it's not possible to >>>> check for an empty range. >>>> >>>> >>>> " What I use now: >>>> :[range]InFunc {cmd} " execute :[range]{cmd}, for :subst >>>> :[range]InFunc! {cmd} " execute :{cmd}, for :global >>>> >>>> com! -bang -range -nargs=+ InFunc<line1>,<line2>call >>>> InFunc(<bang>0,<q-args>) >>>> >>>> func! InFunc(bang, cmd) range >>>> if a:bang >>>> exec a:cmd >>>> else >>>> exec a:firstline.",".a:lastline. a:cmd >>>> endif >>>> endfunc >>>> >>>> >>>> " I'd like to write the above this way: >>>> >>>> com! -range=NoDefault -nargs=+ InFunc<range>call InFunc(<q-args>) >>>> >>>> func! InFunc(cmd) range >>>> exec a:range. a:cmd >>>> endfunc >>>> >>>> >>>> Oops, we would also need a new variable a:range ! >>>> >>>> Maybe, actually,<range> and a:range are not needed, I just want to >>>> be able to check for an empty range: >>>> >>>> >>>> com! -range -nargs=+ InFunc<line1>,<line2>call InFunc(<q-args>) >>>> >>>> func! InFunc(cmd) range >>>> if range_is_empty() >>>> exec a:cmd >>>> else >>>> exec a:firstline.",".a:lastline. a:cmd >>>> endif >>>> endfunc >>>> >>>> >>>> This would just a require a new function range_is_empty(). >>> >>> Unless there are additional use cases where this could be useful, my >>> first hunch is that it's not worth the effort. >> >> It's more about consistency: >> >> When you define a mapping, you can check if a count was given or not >> (check v:count >= 1). >> >> When you define a command with -range, you cannot check if a range was >> given or not. > > TIL it is indeed possible to check if a range was given or not: > > :com! -range Crwg :echo (<count>==-1 ? 'No range was given' : 'The given > range is <line1>,<line2>') > > Works with Vim 7.0 onwards.
How did you dig up that old thread?! (But thanks for following up!) I've found out about that, too: To distinguish between no given range (then defaulting to something like the last modified range) and a range, use -range=-1 and check <count>: :command! -range=-1 Test echomsg <count> == -1 ? "'[,']" : <line1> . ',' . <line2> This emulates -range=% but allows :0Test (passed via first argument boolean flag), too: :command! -range=-1 Test call Test((<count> == 0), (<count> == -1 && <line2> == 1 ? '1,' . line('$') : '<line1>,<line2>')) - -- regards, ingo -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQEcBAEBCAAGBQJatURcAAoJEA7ziXlAzQ/vsH4H/3mMbpNKoZJbgYEUmlIJAvv+ 7zUphcl6TnyslZwrtz3BSDP4vcQpkFBvsMxwkjRd5z/i3+CtHC8w2v4AfgQr/SdH fSdMipYM7JeqddWnaD37GlWyIm+gFoaPpuOuPdybnkXGYLs9A6YFZXX1+59OYXR8 QEuahc8/3M4ye9I6PVzqW/IHtMDYRSMPrxRQegZkn29F/mLjftmRh7u2W8c85zJ0 0QlaYpGvO3JqOxzMZSNOtvDWRGelscZPclE4wBuwdjtrCogtZy790ET6JJyUjFYw Lj7/U2ydwa6UEr6RQRBSG0xmUbBiqLoQZYTLk6d9q/Ipvt9kplj3FqZlVJ9zoXc= =e/Dn -----END PGP SIGNATURE----- -- -- You received this message from the "vim_dev" 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_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.