E77: Too many files

14 views
Skip to first unread message

Manfred Lotz

unread,
Dec 18, 2020, 4:17:15 AM12/18/20
to vim...@googlegroups.com
I have a simple scratch buffer functionity in scratch.vim like follows

if exists('g:loaded_scratch')
finish
endif
let g:loaded_scratch = 1

let g:scratchbuf_no = 1

function! ScratchEdit(cmd)
exe a:cmd '[Scratch' . g:scratchbuf_no . ']'
let g:scratchbuf_no += 1

setlocal buflisted
setlocal noswapfile
setlocal buftype=nofile
setlocal bufhidden=hide
setlocal foldcolumn=0
setlocal nonumber
endfunction

command! -bar -nargs=* Scratch call ScratchEdit('edit')

(if above could/should be improved any advice is welcome)


Sometimes when issueing :Scratch I get

E77: Too many files

Then after some minutes when switching buffers (but not having closed
any buffer) I can do :Scratch without any errors.

Any ideas how to find out what the cause is?

--
Thanks, Manfred

Jürgen Krämer

unread,
Dec 18, 2020, 5:01:54 AM12/18/20
to vim...@googlegroups.com
Hi,
your constructed file name "[ScratchNNN]" is also a valid wildcard. If a
file named 'S' or 'c' or 'a' or so on, Vim will load this file into a
buffer.

My guess is that while the scratchbuf_no increases there will be both a
one-letter file name and a one-digit file name that Vim wants to load or
two one-digit file names. But because you use ":edit" to create the
scratch buffer and ":edit" only allows one single file name you get the
E77 error message.

If it happens again execute ":echo g:scratchbuf_no" and check what files
exist in your current directory.

Regards,
Jürgen

Gary Johnson

unread,
Dec 18, 2020, 5:06:59 AM12/18/20
to vim...@googlegroups.com
The problem is that your edit command,

exe a:cmd '[Scratch' . g:scratchbuf_no . ']'

expands to this, when g:scratchbuf_no is 1, for example:

edit [Scratch1]

Vim looks for a file matching the glob "[Scratch1]", which is
a single character in the set "S c r a t c h 1". If the glob
doesn't match any files, the buffer name "[Scratch1]" is used. If
the glob matches one file, that file is opened. If you happen to
have more than one file with a single-character name from that set,
then that glob will match more that one file and you will get E77.

You can fix that problem by escaping the brackets like this:

exe a:cmd '\[Scratch' . g:scratchbuf_no . '\]'

Some years ago I wrote a similar function to create a scratchpad
buffer with a name enclosed in brackets with results similar to
yours. I was very confused until the "Aha!" moment.

Regards,
Gary

Manfred Lotz

unread,
Dec 18, 2020, 1:25:00 PM12/18/20
to vim...@googlegroups.com
Thanks a lot (also to Jürgen)
Your explanations hit the nail on the head.

I tested it by creating two files S and r and E77 showed up! Your
suggestion (no surprise) fixed it.

Thanks again.


--
Best, Manfred

Reply all
Reply to author
Forward
0 new messages