Am 28.11.2020 um 01:05 schrieb Charles Campbell:
I'm having a bit of a problem with map(). I've had problems with map()
before, and consequently I really really hate to use it.
Here goes:

1: construct a comment:

    "   Testing: one two | three four | five | six |
    "            seven | eight |;

2. grab characters:

    fo<ctrl-v>j$"ay

3. convert to list:

    let list= split(@a,'\s*|\s*;\=',' ')

" convert newlines, then split ...
let list1 = split(tr(@a, "\n", " "), '\s*|\s*;\=')

4. Now, try to use map():

    call map(list,"substitute(v:val,'<&>','','ge')")

" (using copy() below is for easier debugging ...)

" you somehow did not check the substitute() arguments ...
let list2a = map(copy(list1), "substitute(v:val, '.*', '<&>', 'g')")

" the same, but avoiding inner quotes with lambda:
let list2b = map(copy(list1), {_, s -> substitute(s, '.*', '<&>', 'g')})
"                              ^
"                              |
"        Note: do not forget THIS goiter argument

" Or what I actually do: define convenience functions, like this one:

" Msubstitute({lod}, {pat}, {repl}, {flags}[, ...])
"
"   "map substitute": call substitute(Item, {pat}, {repl}, {flags}) for each
"   {lod} Item.
"
"   {lod}       (list or dict)
"   [...]       values `a:1', `a:2', ... accessible in a {repl} expression
"

func! Msubstitute(_lod_, pat, repl, flags, ...)
    return map(a:_lod_, 'substitute(v:val, a:pat, a:repl, a:flags)')
endfunc

" then you can use:
let list2c = Msubstitute(copy(list1), '.*', '<&>', 'g')

   Intent: to put <...> around every argument. Now, this isn't really
   my final intent for this, but if I could get that substitute to
   work, it'd be a nice start. Please note, the request is on how to
   get a substitute() to work with map(), not to put angle brackets
   around every list element, for which :help map() already has an
   example.

5. Bonus request: my construction above carefully gets a newline into
   the list. Using :echo string(list):

    ['one two', 'three four', 'five', 'six', '
    seven', 'eight', '                    ']

   I cannot seem to get rid of the newline, but its probably due to my
   lack of success with substitute().

I've spent about three hours on this so far, with multiple attempts,
all unsuccessful. Perhaps an extra example in help map() illustrating
how to do this would be of use?

Thank you,
Chip Campbell

--
Andy

--
--
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_use/5FC67956.7000104%40yahoo.de.

Reply via email to