Skip to content

altermo/nwm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 

Repository files navigation

NXWM

Neovim X11 Window Manager allows you to use x11 windows as if they were buffers. When entering a x-window-buffer, you'll need to start insert-mode to focus the x-window (unless some configurations are set to do this automatically).

Requirements

  • libx11
  • glibc (or most other standard C libraries)
  • Terminal supporting TIOCGWINSZ
    • Recommended terminal is kitty
    • Run :lua= require'nxwm'.term_supported() to check
      • NOTE: some terminals may support TIOCGWINSZ while still not working (like neovim-qt)

Installation

Use whichever package manager you like.
It is recommended to lock/pin the plugin to one version/branch because of changes.

  • lazy
{'altermo/nwm',branch='x11'},
  • packer
use {'altermo/nwm',branch='x11'},

Configuration

Using require("nxwm").setup({}) is not required, it is only there if you want to change the default config.

{
    --What happens when a new x-window is created
    on_win_open=function (buf,xwin)
        vim.cmd.vsplit()
        vim.api.nvim_set_current_buf(buf)
    end,
    --Configuration to pass to window
    --`conf` is global config
    on_win_get_conf=function (conf,xwin) return conf end,
    --How to handle when multiple windows in the same tabpage has the x-window-buffer open
    on_multiple_win_open=function (vwins,buf,xwin)
        for k,vwin in ipairs(vwins) do
            if k~=1 then
                local scratchbuf=vim.api.nvim_create_buf(false,true)
                vim.bo[scratchbuf].bufhidden='wipe'
                vim.api.nvim_win_set_buf(vwin,scratchbuf)
            end
        end
    end,
    --Whether to be more verbose
    verbal=false,
    --Map to unfocus a window (multiple key mappings is not (yet) supported)
    unfocus_map='<A-F4>',
    --Create your own mappings
    --IMPORTANT: the x-window needs to be focused for such mappings to work
    maps={
        --{'<C-A-del>',function () vim.cmd'quitall!' end},
        --Or you could also have lhs as a table
        --{{mods={'control','mod1'},key='Delete'},function () vim.cmd'quitall!' end},
    },
    --Window-opt: auto focus x-window when entering x-window-buffer
    autofocus=false,
    --Window-opt: try-delete x-window if no vim-window shows buffer (similar to `bufhidden=wipe`)
    delhidden=true,
    --Window-opt: when click on x-window, goto that buffer (may not focus x-window)
    clickgoto=true,
    --Window-opt: offset the window this many x pixels (useful if terminal has padding)
    xoffset=0,
    --Window-opt: offset the window this many y pixels (useful if terminal has padding)
    yoffset=0,
}

Usage

Start (from wayland window manager)

  1. Install Xwayland.
  2. Run Xwayland :99.
  3. Run DISPLAY=:99 WAYLAND_DISPLAY= {NXWM} in a terminal where {NXWM} is path to a terminal which runs Neovim and starts NXWM.
    NOTE: the terminal should have it's start in the top left, have zero padding, have no title bar...
    NOTE2: some applications (like kitty with default config) tries (and fails) to spawn in wayland even when WAYLAND_DISPLAY is empty...
    Examples of how to start for specific terminals:
    • kitty: DISPLAY=:99 WAYLAND_DISPLAY= kitty -c NONE -o placement_strategy=top-left -o linux_display_server=x11 -e nvim -c 'lua require("nxwm").start()'
    • alacritty: DISPLAY=:99 WAYLAND_DISPLAY= alacritty --config-file /dev/null -e nvim -c 'lua require("nxwm").start()'
    • wezterm: DISPLAY=:99 WAYLAND_DISPLAY= wezterm -n --config enable_tab_bar=false --config window_padding='{left=0,right=0,top=0,bottom=0}' start nvim -c 'lua require"nxwm".start()'

Start (from Xephyr in x11)

  • Install Xephyr.
  • Run Xephyr -ac -br -noreset :99.
    • You may add -screen 800x600 to set the Xephyr window size.
  • Start your terminal emulator, passing DISPLAY=:99 to start it in the Xephyr session.
    • Wezterm example: DISPLAY=:99 wezterm -n --config enable_tab_bar=false --config window_padding='{left=0,right=0,top=0,bottom=0}' start nvim -c 'lua require"nxwm".start()'

Start (from tty)

  1. Install sx.
  2. Run sx {NXWM} in a tty where {NXWM} is path to a terminal which runs Neovim and starts NXWM.
    NOTE: the terminal should have it's start in the top left, have zero padding, have no title bar...
    Examples of how to start for specific terminals:
    • kitty: sx kitty -c NONE -o placement_strategy=top-left -e nvim -c 'lua require("nxwm").start()'
    • alacritty: sx alacritty --config-file /dev/null -e nvim -c 'lua require("nxwm").start()'
    • wezterm: sx wezterm -n --config enable_tab_bar=false --config window_padding='{left=0,right=0,top=0,bottom=0}' start nvim -c 'lua require"nxwm".start()'

Use

Open up a terminal (with :term) and run your wanted GUI. NOTE: x-windows aren't auto focused by default, so start insert (by pressing i or similar) and then you'll focus the window. To unfocus an x-window, either click into another buffer, or press alt-F4(unless the default config has been changed).

Donate

If you want to donate then you need to find the correct link (hint: No Break Here):