Thursday, July 14, 2016

Re: vim function argument

2016-07-14 13:06 GMT+03:00 Yang Luo <youngluoyang@gmail.com>:
>
> I complete the function as follow, now I want to add radix option, but I don't know how to get width. Can you help me complement it
>
> function InsertNumber(start, end,...) " step,is_column_first_0_padding,radix(b,d,o,x)
> let l:i = a:start
> let l:curr_line = 0
> if a:0 == 0 " a:0 extra argument numbers
> let l:step = 1
> else
> let l:step = a:1 " the first extra argument
> endif

let l:step = get(a:000, 0, 1)

Other arguments are to be handled in a similar fashion.

> if a:0 == 2
> let l:is_padding = 0
> else
> let l:is_padding = 1 "default padding
> endif
> if a:0 == 3
> let l:radix = a:3
> else
> let l:radix = ""
> endif

let l:radix = get(a:000, 2, 'd')

(needed for the below suggestion).

> if l:radix == "b"
> elseif l:radix == "o"
> elseif l:radix == "x"
> else
> let l:width = float2nr(trunc(log10(a:end))) + 1

let l:width = len(a:end)

For other radix variants you will have to use printf indeed.

I could even suggest

let l:format = '%0*' . l:radix
let l:width = len(printf('%' . l:radix, a:end))

(note: no if's at all).

> let l:format = '%0'.l:width.'d'

let l:format = '%0*d'

> endif
> while l:i <= a:end
> if l:step <= 0
> echo "Error: step cannot <= 0."
> break
> endif

This is wrong place to check, l:step does not change, but you check it
constantly. Move all arguments checks just below the place where you
define arguments.

> if l:is_padding == 1
> call append(curr_line, printf(l:format, l:i))

call append(curr_line, printf(l:format, l:width, l:i))

> else
> call append(curr_line, l:i)
> endif
> let l:i += l:step
> let l:curr_line += 1
> endwhile
> endfunction
>
> --
> --
> 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.

--
--
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: