What is the recommended way to get the buffer number of a file
starting from the filename?

    This is what the help has to say about bufnr():

: bufnr({expr} [, {create}])
:               The result is the number of a buffer, as it is displayed by
:               the ":ls" command.  For the use of {expr}, see |bufname()|
:               above.

    The help for bufname() explains:

:               If {expr} is a String, it is used as a |file-pattern| to match
:               with the buffer names.  This is always done like 'magic' is
:               set and 'cpoptions' is empty.  When there is more than one
:               match an empty string is returned.
:               "" or "%" can be used for the current buffer, "#" for the
:               alternate buffer.
:               A full match is preferred, otherwise a match at the start, end
:               or middle of the buffer name is accepted.  If you only want a
:               full match then put "^" at the start and "$" at the end of the
:               pattern.
:               Listed buffers are found first.  If there is a single match
:               with a listed buffer, that one is returned.  Next unlisted
:               buffers are searched for.

    And then the help for file-pattern:


:                                                       *file-pattern*
: The pattern is interpreted like mostly used in file names:
:       *       matches any sequence of characters; Unusual: includes path
:               separators
:       ?       matches any single character
:       \?      matches a '?'
:       .       matches a '.'
:       ~       matches a '~'
:       ,       separates patterns
:       \,      matches a ','
:       { }     like \( \) in a |pattern|
:       ,       inside { }: like \| in a |pattern|
:       \}      literal }
:       \{      literal {
:       \\\{n,m\}  like \{n,m} in a |pattern|
:       \       special meaning like in a |pattern|
:       [ch]    matches 'c' or 'h'
:       [^ch]   match any character but 'c' and 'h'
: 
: Note that for all systems the '/' character is used for path separator (even
: MS-DOS and OS/2).  This was done because the backslash is difficult to use
: in a pattern and to make the autocommands portable across different systems.

    Based on the above (and taking a peek at the sources), I came up
with this attempt:

        function! Name2Buf(fname) abort
            if exists('+shellslash')
                let old_shellslash = &shellslash
                let &shellslash = 1
                let buf = bufnr(escape( fnamemodify(a:fname, ':p'), '\*?,{}[' ))
                let &shellslash = old_shellslash
            else
                let buf = bufnr(escape( fnamemodify(a:fname, ':p'), '\*?,{}[' ))
            endif

            return buf
        endfunction

    It mostly works, until I try it on a file named a,b\{2,3\}.txt:

        :echo expand('%:p')
        /home/lcd047/tmp/a,b\{3.4}.txt

        :Name2Buf(expand('%:p'))
        -1

    However the naive bufnr(expand('%:p')) works, but it shouldn't,
because of the two commas ",":

        echomsg bufnr(expand('%:p'))
        1

    So, what _is_ the right way to do this?

    /lcd

-- 
-- 
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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui