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.