Awesome
FVim<img src="https://github.com/yatli/fvim/raw/master/Assets/fvim.png" width="40" height="40">
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
Category | PUM text | FVim | NERD equivalent |
---|---|---|---|
Text | t | | |
Method | : | | |
Function | f | | |
Constructor | c | | |
Field | . | ﰠ | |
Variable | v | | |
Class | C | ﴯ | |
Interface | I | | |
Module | M | | |
Property | p | ﰠ | |
Unit | U | 塞 | |
Value | l | | |
Enum | E | | |
Keyword | k | | |
Snippet | s | | |
Color | K | | |
File | F | | |
Reference | r | | |
Folder | d | | |
EnumMember | m | | |
Constant | 0 | | |
Struct | S | פּ | |
Event | e | | |
Operator | o | | |
TypeParameter | T | T |
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.