pynvim icon indicating copy to clipboard operation
pynvim copied to clipboard

vim.windows should only return windows in current tabpage

Open SirVer opened this issue 11 months ago • 1 comments

To reproduce, open vim and create a second tab, then print the list of all vim.windows.

$ vim # or nvvim
:tabedit
:python3 print(list(vim.windows))

Under Vim this only returns the windows in the currently visible buffer, i.e. [<window 0>]. Under Neovim this returns all windows in all buffers, i.e. [<Window(handle=1000)>, <Window(handle=1001)>]. This is inconsistent behavior to Vim.

This yields problems when you for example iterate through all windows and try to do actions within them, like so:

    def _close_all():
        for idx,win in enumerate(vim.windows, 1):
            vim.command("%iwincmd w" % idx)
            if "nofile" in vim.eval("&buftype"):
                vim.command(":bwipeout")
                return _close_all()

I also realize that Vim is explicit about its behaviour and pynvim is not implementing it correctly. This is from :help python:

<	Note: vim.windows object always accesses current tab page.
	|python-tabpage|.windows objects are bound to parent |python-tabpage|
	object and always use windows from that tab page (or throw vim.error
	in case tab page was deleted). You can keep a reference to both
	without keeping a reference to vim module object or |python-tabpage|,
	they will not lose their properties in this case.

SirVer avatar Mar 15 '25 15:03 SirVer

Kind of strange that vim.windows is just an alias to vim.tabpages[0].windows

Should be an easy fix, here: https://github.com/neovim/pynvim/blob/dc030e6ea6c0134d0ebac7386abfe15e050c1201/pynvim/api/nvim.py#L132

justinmk avatar Mar 15 '25 18:03 justinmk