On 9/14/09, Daniel Fetchinson <fetchin...@googlemail.com> wrote:
>>> >>> I'm regularly doing :split filename1 followed by :split filename2
>>> >>> followed by :split filename3 and was trying to do :split filename*
>>> >>> but
>>> >>> this didn't work. The goal would be to split the window in as many
>>> >>> pieces as the number of files that match filename* and have each of
>>> >>> the matching files in it's own split window.
>>> >>>
>>> >>> Basically I'm trying to automate :split filename1 :split filename2
>>> >>> :split filename3 etc etc.
>>> >>>
>>> >>> Is there a way to do this?
>>> >>
>>> >> You can do
>>> >>
>>> >>     :args filename*
>>> >>
>>> >> to set the argument list to that set of files, then
>>> >>
>>> >>     :all
>>> >>
>>> >> to open each file in the argument list in a new window.
>>> >
>>> > Wow, this is great, thanks! If I would have known this in the last 10
>>> > years..... :)
>>>
>>> This in itself is pretty cool, but now I'd like to make something even
>>> cooler by hooking up a custom function to do this. This is where I'm
>>> currently failing. What I'd like to see is when I type
>>>
>>> :msplit filename*
>>>
>>> then this should be equivalent to
>>>
>>> :args filename*
>>> :all
>>>
>>> where of course msplit stands for multiple split. I don't really know
>>> how vim functions work, so far I was always copy-pasting already
>>> working stuff and only modified them for myself. So based on this
>>> limited experience what I tried was
>>>
>>> function! Msplit( expr )
>>>     args a:expr
>>>     all
>>> endfunction
>>>
>>> but this (maybe trivially) doesn't work. What would be the way to do
>>> this?
>>
>> First of all, it would help to know precisely what you mean by
>> "doesn't work".  It would also help to know how you got from typing
>> ":msplit filename*" to calling Msplit().  Otherwise we're all left
>> guessing what you might have done and how it might have failed.
>
> Sorry, you are right, I was not clear. So when I define
>
> function! Msplit( expr )
>     args a:expr
>     all
> endfunction
>
> and then I do either of the following,
>
> (1)  :call Msplit( 'filename*' )
> (2)  :call Msplit( "filename*" )
> (3)  :call Msplit( filename* )
>
> (you can already see that I'm more or less guessing here) then what I get
> is,
>
> (1)  vim opens a new empty file called 'a:expr'
> (2)  same as (1)
> (3)  vim says 'Invalid expression' and 'Invalid arguments for function
> Msplit'
>
> So this is what I meant when I said it doesn't work.
>
>> That being said, here's my guess at what went wrong and a possible
>> solution.
>>
>> The string "filename*" is converted to a string of file names by the
>> process of filename expansion.  This works only in certain contexts.
>> I don't know what all those contexts are.  To make this work in a
>> function, I think you'd either have to use the glob() function in
>> your function to expand a:expr to a set of file names, or use a
>> :command that would expand "filename*" before passing all the
>> resulting names to Msplit().
>>
>> I think it would be easiest to just implement this as a command
>> without the use of a function, like this:
>>
>>     command! -nargs=+ Msplit args <args><bar>all
>
> This works wonderfully, thank you very much!
>
> I realize that I'm asking for too much, but just in case somebody
> finds this also useful, let me ask what makes :Msplit and :split
> different from the point of view of Tab-completion? When the command
> :split is followed by a string of characters (filenames) and one
> presses Tab, vim will autocomplete them based on existing file names.
> However in its current form :Msplit doesn't do this, I guess because
> nobody told it to do so :) Is there a way to tell vim "try to
> Tab-autocomplete the arguments of this command"?

Based on Hari's example I figured this autocompletion thingy out.
The version that I like the best so far is, based on Tim's and Hari's ideas,

command! -complete=file -nargs=+ Msplit for fname in
split(glob("<args>"),'\n')<bar> exec 'sp '.escape(fname, ' \\')<bar>
endfor

Thanks for everybody's help!

Cheers,
Daniel


-- 
Psss, psss, put it down! - http://www.cafepress.com/putitdown

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_use" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Reply via email to