FVim
Cross platform Neovim front-end UI, built with F# + Avalonia.
Installation
Download the latest release package for your system, extract and run FVim
!
- For Windows 7 / Vista / 8.1 / Server 2008 R2 / Server 2012 R2, use the
win7-x64
package.- Follow these additional steps to install compatibility patches.
- The link to the KB update is no longer functioning. The issue is tracked here.
- For Windows 10, use the
win-x64
package -- this version has faster startup. - For macOS, it's packaged as an app bundle -- unzip and drag it to your applications folder.
- For Linux:
- Debian based distributions:
dpkg -i fvim_package_name.deb
- Arch Linux: Install via AUR
- RPM-based distributions:
rpm -ivh fvim_package_name.rpm
- Fedora:
dnf install fvim_package_name.rpm
- Compile from Source (having dotnet-sdk-6.0.x installed):
git clone https://github.com/yatli/fvim && cd fvim && dotnet publish -f net6.0 -c Release -r linux-x64 --self-contained
- Debian based distributions:
Features
- Theming done the (Neo)Vim way
- Cursor color/blink
- Background image/composition
- Custom UI elements are themed with
colorscheme
settings - And more!
- Font handling
- Proper font rendering -- respects font style, baseline, ligatures etc.
- Built-in support for Nerd font -- no need to patch your fonts!
- East Asia wide glyph display with font fallback options
- Fine-grained font tweaking knobs for personal font rendering
- Emojis!
- GUI framework
- HiDPI support -- try dragging it across two screens with different DPIs ;)
- High performance rendering, low latency (60FPS on 4K display with reasonable font size!)
- GPU acceleration
- Multi-grid support -- try
Ctrl-w ge
to detach a window into a separate OS window! - Input method support built from scratch
- Rich information scrollbar (currently read-only)
- Extend with UI Server Protocol -- UI widgets as NeoVim plugins
- Remoting
- Use a Windows FVim frontend with a WSL neovim:
fvim --wsl
- Use custom neovim binary:
fvim --nvim ~/bin/nvim.appimage
- Use the front end with a remote neovim:
fvim --ssh user@host
- Connect to a remote NeoVim backend:
fvim --connect localhost:9527
- tmux-like session server:
fvim --fvr attach --ssh user@host
- As a terminal emulator:
fvim --terminal
- Use a Windows FVim frontend with a WSL neovim:
Try these bindings (note, fvim-specific settings only work in ginit.vim
, not init.vim
!):
if exists('g:fvim_loaded')
" good old 'set guifont' compatibility with HiDPI hints...
if g:fvim_os == 'windows' || g:fvim_render_scale > 1.0
set guifont=Iosevka\ Slab:h14
else
set guifont=Iosevka\ Slab:h28
endif
" Ctrl-ScrollWheel for zooming in/out
nnoremap <silent> <C-ScrollWheelUp> :set guifont=+<CR>
nnoremap <silent> <C-ScrollWheelDown> :set guifont=-<CR>
nnoremap <A-CR> :FVimToggleFullScreen<CR>
endif
Some fancy cursor effects:
if exists('g:fvim_loaded')
FVimCursorSmoothMove v:true
FVimCursorSmoothBlink v:true
endif
Detaching a window into an external OS window with Ctrl-w ge
:
Detach as many and span them over your monitors!
Custom popup menu entry icons (see below for how to configure):
Building from source
We're now targeting net6.0
so make sure to install the latest preview SDK from the .NET site.
We're actively tracking the head of Avalonia
, and fetch the nightly packages from myget (see NuGet.config
).
Then, simply:
git clone https://github.com/yatli/fvim
cd fvim
dotnet build -c Release
dotnet run -c Release
FVim-specific commands
The following new commands are available:
" Toggle between normal and fullscreen
FVimToggleFullScreen
" Cursor tweaks
FVimCursorSmoothMove v:true
FVimCursorSmoothBlink v:true
" Background composition
FVimBackgroundComposition 'acrylic' " 'none', 'transparent', 'blur' or 'acrylic'
FVimBackgroundOpacity 0.85 " value between 0 and 1, default bg opacity.
FVimBackgroundAltOpacity 0.85 " value between 0 and 1, non-default bg opacity.
FVimBackgroundImage 'C:/foobar.png' " background image
FVimBackgroundImageVAlign 'center' " vertial position, 'top', 'center' or 'bottom'
FVimBackgroundImageHAlign 'center' " horizontal position, 'left', 'center' or 'right'
FVimBackgroundImageStretch 'fill' " 'none', 'fill', 'uniform', 'uniformfill'
FVimBackgroundImageOpacity 0.85 " value between 0 and 1, bg image opacity
" Title bar tweaks
FVimCustomTitleBar v:true " themed with colorscheme
" Debug UI overlay
FVimDrawFPS v:true
" Font tweaks
FVimFontAntialias v:true
FVimFontAutohint v:true
FVimFontHintLevel 'full'
FVimFontLigature v:true
FVimFontLineHeight '+1.0' " can be 'default', '14.0', '-1.0' etc.
FVimFontSubpixel v:true
FVimFontNoBuiltinSymbols v:true " Disable built-in Nerd font symbols
" Try to snap the fonts to the pixels, reduces blur
" in some situations (e.g. 100% DPI).
FVimFontAutoSnap v:true
" Font weight tuning, possible valuaes are 100..900
FVimFontNormalWeight 400
FVimFontBoldWeight 700
" Font debugging -- draw bounds around each glyph
FVimFontDrawBounds v:true
" UI options (all default to v:false)
FVimUIPopupMenu v:true " external popup menu
FVimUIWildMenu v:false " external wildmenu -- work in progress
" Keyboard mapping options
FVimKeyDisableShiftSpace v:true " disable unsupported sequence <S-Space>
FVimKeyAutoIme v:true " Automatic input method engagement in Insert mode
FVimKeyAltGr v:true " Recognize AltGr. Side effect is that <C-A-Key> is then impossible
" Default options (workspace-agnostic)
FVimDefaultWindowWidth 1600 " Default window size in a new workspace
FVimDefaultWindowHeight 900
" Detach from a remote session without killing the server
" If this command is executed on a standalone instance,
" the embedded process will be terminated anyway.
FVimDetach
" =========== BREAKING CHANGES -- the following commands are disabled ============
" FVimUIMultiGrid v:true -- per-window grid system -- done and enabled by default
" FVimUITabLine v:false -- external tabline -- not implemented
" FVimUICmdLine v:false -- external cmdline -- not implemented
" FVimUIMessages v:false -- external messages -- not implemented
" FVimUITermColors v:false -- not implemented
" FVimUIHlState v:false -- not implemented
Startup options
Usage: FVim [FVim-args] [NeoVim-args]
FVim-args:
=========================== Client options ===================================
--ssh user@host Start NeoVim remotely over ssh
--wsl Start NeoVim in WSL
--nvim path-to-program Use an alternative nvim program
--nvr target Connect to a remote NeoVim backend. The target
can be an IP endpoint (127.0.0.1:9527), or a
Unix socket address (/tmp/path/to/socket), or a
Windows named pipe (PipeName).
--setup Registers FVim as a text editor, and updates
file association and icons. Requires UAC
elevation on Windows.
--uninstall Unregisters FVim as a text editor, and removes
file association and icons. Requires UAC
elevation on Windows.
=========================== FVim Remoting ====================================
--daemon Start a FVR multiplexer server.
Can be used with --nvim for alternative program.
--pipe name Override the named pipe address of the daemon.
When this option is not given, defaults to
'/tmp/fvr-main'
--fvr id [FILES...] Connects to a FVR server.
--fvr a[ttach] [FILES...] - id: an integer session id to connect
--fvr n[ew] [args...] - attach: attach to the first available session
- new: create a new session with args passed to
NeoVim.
Can be used with --ssh or --wsl for connecting a
remote server. If neither is specified, connects
to the local server.
Can be used with --pipe to override the server
address.
=========================== Debug options ====================================
--trace-to-stdout Trace to stdout.
--trace-to-file Trace to a file.
--trace-patterns Filter trace output by a list of keyword strings
=========================== Terminal emulator ================================
--terminal Start as a terminal emulator.
--terminal-cmd Command to run instead of the default shell.
The FVim arguments will be consumed and filtered before the rest are passed to NeoVim.
Custom PUM icons
So instead of populating your symbol dictionary with the NERD-specific characters, use textual characters. FVim will pick them up and display graphical icons stored in Assets/intellisense
instead.
Goals
- Keep up with the latest NeoVim features
- Ergonomics improvements via GUI/native OS integration
- Drive the flexible and accessible UI extension method "UI Server Protocol"
- The idea is to establish a standard protocol for UI extensions, so that the nice GUI additions are not limited to one specific front-end. Think of a front end as a UI server handling UI Server Protocol requests issued from front-end-agnostic plugins. It's like Language Server Protocol, but for UI.
Non-Goals
- Electron ecosystem integration :p
- No walled garden. Everything should be accessible from the NeoVim core, which means:
- No project explorers -- use a NeoVim plugin
- No custom tab lines / document wells -- use a NeoVim plugin
- No side-by-side markdown viewer, unless it's a NeoVim plugin, implemented via the UI-Protocol extensions.