{"id":13471346,"url":"https://github.com/yatli/fvim","last_synced_at":"2025-05-14T16:15:06.772Z","repository":{"id":37251530,"uuid":"184076781","full_name":"yatli/fvim","owner":"yatli","description":"Cross platform Neovim front-end UI, built with F# + Avalonia","archived":false,"fork":false,"pushed_at":"2024-10-17T19:35:26.000Z","size":36552,"stargazers_count":1360,"open_issues_count":69,"forks_count":30,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-04-12T22:17:25.268Z","etag":null,"topics":["avalonia","dotnet","editor","fsharp","gui","neovim","neovim-guis","nvim","text-editor","ui","vim","xaml"],"latest_commit_sha":null,"homepage":"","language":"F#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yatli.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-04-29T13:30:37.000Z","updated_at":"2025-04-10T03:42:16.000Z","dependencies_parsed_at":"2022-08-22T11:40:28.515Z","dependency_job_id":"c2727797-b3c3-4419-bb79-ccc93479ca1d","html_url":"https://github.com/yatli/fvim","commit_stats":{"total_commits":698,"total_committers":14,"mean_commits":"49.857142857142854","dds":"0.045845272206303744","last_synced_commit":"ee4316c505072cd22ec41f62f1b3081399bf308a"},"previous_names":[],"tags_count":159,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yatli%2Ffvim","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yatli%2Ffvim/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yatli%2Ffvim/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yatli%2Ffvim/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yatli","download_url":"https://codeload.github.com/yatli/fvim/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248637786,"owners_count":21137538,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["avalonia","dotnet","editor","fsharp","gui","neovim","neovim-guis","nvim","text-editor","ui","vim","xaml"],"created_at":"2024-07-31T16:00:43.355Z","updated_at":"2025-04-12T22:18:45.826Z","avatar_url":"https://github.com/yatli.png","language":"F#","funding_links":[],"categories":["F# #","F#","Samples and Projects"],"sub_categories":["Software Development"],"readme":"# FVim\u003cimg src=\"https://github.com/yatli/fvim/raw/master/Assets/fvim.png\" width=\"40\" height=\"40\"\u003e [![Build Status](https://dev.azure.com/v-yadli/fvim/_apis/build/status/yatli.fvim?branchName=master)](https://dev.azure.com/v-yadli/fvim/_build/latest?definitionId=2\u0026branchName=master)\n\n\nCross platform Neovim front-end UI, built with [F#](https://fsharp.org/) + [Avalonia](http://avaloniaui.net/).\n\n![Screenshot](https://github.com/yatli/fvim/raw/master/images/screenshot.png)\n\n\n### Installation\n[Download](https://github.com/yatli/fvim/releases) the latest release package for your system, extract and run `FVim`!\n\n- For Windows 7 / Vista / 8.1 / Server 2008 R2 / Server 2012 R2, use the `win7-x64` package.\n    - Follow [these additional steps to install compatibility patches](https://docs.microsoft.com/en-us/dotnet/core/install/windows?tabs=netcore31\u0026pivots=os-windows#additional-deps).\n    - The link to the KB update is no longer functioning. [The issue is tracked here](https://github.com/dotnet/docs/issues/20459).\n- For Windows 10, use the `win-x64` package -- this version has faster startup.\n- For macOS, it's packaged as an app bundle -- unzip and drag it to your applications folder.\n- For Linux:\n    - Debian based distributions: `dpkg -i fvim_package_name.deb`\n    - Arch Linux:  [Install via AUR](https://aur.archlinux.org/packages/fvim/)\n    - RPM-based distributions: `rpm -ivh fvim_package_name.rpm`\n    - Fedora: `dnf install fvim_package_name.rpm`\n    - Compile from Source (having dotnet-sdk-6.0.x installed):\n        ```\n            git clone https://github.com/yatli/fvim \u0026\u0026 cd fvim \u0026\u0026 dotnet publish -f net6.0 -c Release -r linux-x64 --self-contained\n        ```\n\n### Features\n\n- Theming done the (Neo)Vim way\n  - Cursor color/blink\n  - Background image/composition\n  - Custom UI elements are themed with `colorscheme` settings\n  - And more!\n- Font handling\n  - Proper font rendering -- respects font style, baseline, [ligatures](https://github.com/tonsky/FiraCode) etc.\n  - Built-in support for Nerd font -- no need to patch your fonts!\n  - East Asia wide glyph display with font fallback options\n  - Fine-grained font tweaking knobs for personal font rendering\n  - Emojis!\n- GUI framework\n  - HiDPI support -- try dragging it across two screens with different DPIs ;)\n  - High performance rendering, low latency (60FPS on 4K display with reasonable font size!)\n  - GPU acceleration\n  - Multi-grid support -- try `Ctrl-w ge` to detach a window into a separate OS window!\n  - Input method support built from scratch\n  - Rich information scrollbar (currently read-only)\n  - [Extend with UI Server Protocol](https://github.com/yatli/gui-widgets.nvim) -- UI widgets as NeoVim plugins\n- Remoting\n  - Use a Windows FVim frontend with a WSL neovim: `fvim --wsl`\n  - Use custom neovim binary: `fvim --nvim ~/bin/nvim.appimage`\n  - Use the front end with a remote neovim: `fvim --ssh user@host`\n  - Connect to a remote NeoVim backend: `fvim --connect localhost:9527`\n  - tmux-like session server: `fvim --fvr attach --ssh user@host`\n  - As a terminal emulator: `fvim --terminal`\n\nTry these bindings (note, fvim-specific settings only work in `ginit.vim`, not `init.vim`!):\n```vimL\nif exists('g:fvim_loaded')\n    \" good old 'set guifont' compatibility with HiDPI hints...\n    if g:fvim_os == 'windows' || g:fvim_render_scale \u003e 1.0\n      set guifont=Iosevka\\ Slab:h14\n    else\n      set guifont=Iosevka\\ Slab:h28\n    endif\n      \n    \" Ctrl-ScrollWheel for zooming in/out\n    nnoremap \u003csilent\u003e \u003cC-ScrollWheelUp\u003e :set guifont=+\u003cCR\u003e\n    nnoremap \u003csilent\u003e \u003cC-ScrollWheelDown\u003e :set guifont=-\u003cCR\u003e\n    nnoremap \u003cA-CR\u003e :FVimToggleFullScreen\u003cCR\u003e\nendif\n```\n\nSome fancy cursor effects:\n```vimL\nif exists('g:fvim_loaded')\n    FVimCursorSmoothMove v:true\n    FVimCursorSmoothBlink v:true\nendif\n```\n![fluent_cursor](https://raw.githubusercontent.com/yatli/fvim/master/images/fluent_cursor.gif)\n\nDetaching a window into an external OS window with `Ctrl-w ge`:\n![ext_win](https://raw.githubusercontent.com/yatli/fvim/master/images/ext_win.gif)\nDetach as many and span them over your monitors!\n\nCustom popup menu entry icons (see below for how to configure):\n![image](https://user-images.githubusercontent.com/20684720/159672096-2630cbda-243d-46c3-b8f7-6d0a4743dffe.png)\n\n\n### Building from source\nWe're now targeting `net6.0` so make sure to install the latest preview SDK from the [.NET site](https://dotnet.microsoft.com/download/dotnet/6.0).\nWe're actively tracking the head of `Avalonia`, and fetch the nightly packages from myget (see `NuGet.config`).\n\nThen, simply:\n\n```\ngit clone https://github.com/yatli/fvim\ncd fvim\ndotnet build -c Release\ndotnet run -c Release\n```\n### FVim-specific commands\n\nThe following new commands are available:\n```vimL\n\" Toggle between normal and fullscreen\nFVimToggleFullScreen\n\n\" Cursor tweaks\nFVimCursorSmoothMove v:true\nFVimCursorSmoothBlink v:true\n\n\" Background composition\nFVimBackgroundComposition 'acrylic'   \" 'none', 'transparent', 'blur' or 'acrylic'\nFVimBackgroundOpacity 0.85            \" value between 0 and 1, default bg opacity.\nFVimBackgroundAltOpacity 0.85         \" value between 0 and 1, non-default bg opacity.\nFVimBackgroundImage 'C:/foobar.png'   \" background image\nFVimBackgroundImageVAlign 'center'    \" vertial position, 'top', 'center' or 'bottom'\nFVimBackgroundImageHAlign 'center'    \" horizontal position, 'left', 'center' or 'right'\nFVimBackgroundImageStretch 'fill'     \" 'none', 'fill', 'uniform', 'uniformfill'\nFVimBackgroundImageOpacity 0.85       \" value between 0 and 1, bg image opacity\n\n\" Title bar tweaks\nFVimCustomTitleBar v:true             \" themed with colorscheme\n\n\" Debug UI overlay\nFVimDrawFPS v:true\n\n\" Font tweaks\nFVimFontAntialias v:true\nFVimFontAutohint v:true\nFVimFontHintLevel 'full'\nFVimFontLigature v:true\nFVimFontLineHeight '+1.0' \" can be 'default', '14.0', '-1.0' etc.\nFVimFontSubpixel v:true\nFVimFontNoBuiltinSymbols v:true \" Disable built-in Nerd font symbols\n\n\" Try to snap the fonts to the pixels, reduces blur\n\" in some situations (e.g. 100% DPI).\nFVimFontAutoSnap v:true\n\n\" Font weight tuning, possible valuaes are 100..900\nFVimFontNormalWeight 400\nFVimFontBoldWeight 700\n\n\" Font debugging -- draw bounds around each glyph\nFVimFontDrawBounds v:true\n\n\" UI options (all default to v:false)\nFVimUIPopupMenu v:true      \" external popup menu\nFVimUIWildMenu v:false      \" external wildmenu -- work in progress\n\n\" Keyboard mapping options\nFVimKeyDisableShiftSpace v:true \" disable unsupported sequence \u003cS-Space\u003e\nFVimKeyAutoIme v:true           \" Automatic input method engagement in Insert mode\nFVimKeyAltGr v:true             \" Recognize AltGr. Side effect is that \u003cC-A-Key\u003e is then impossible\n\n\" Default options (workspace-agnostic)\nFVimDefaultWindowWidth 1600     \" Default window size in a new workspace\nFVimDefaultWindowHeight 900\n\n\" Detach from a remote session without killing the server\n\" If this command is executed on a standalone instance,\n\" the embedded process will be terminated anyway.\nFVimDetach\n\n\" =========== BREAKING CHANGES -- the following commands are disabled ============\n\" FVimUIMultiGrid v:true     -- per-window grid system -- done and enabled by default\n\" FVimUITabLine v:false      -- external tabline -- not implemented\n\" FVimUICmdLine v:false      -- external cmdline -- not implemented\n\" FVimUIMessages v:false     -- external messages -- not implemented\n\" FVimUITermColors v:false   -- not implemented\n\" FVimUIHlState v:false      -- not implemented\n\n```\n\n### Startup options\n\n```\nUsage: FVim [FVim-args] [NeoVim-args]\n\nFVim-args:\n\n    =========================== Client options ===================================\n\n    --ssh user@host             Start NeoVim remotely over ssh\n    --wsl                       Start NeoVim in WSL\n    --nvim path-to-program      Use an alternative nvim program\n\n    --nvr target                Connect to a remote NeoVim backend. The target\n                                can be an IP endpoint (127.0.0.1:9527), or a\n                                Unix socket address (/tmp/path/to/socket), or a\n                                Windows named pipe (PipeName).\n\n    --setup                     Registers FVim as a text editor, and updates\n                                file association and icons. Requires UAC\n                                elevation on Windows.\n    --uninstall                 Unregisters FVim as a text editor, and removes\n                                file association and icons. Requires UAC\n                                elevation on Windows.\n\n    =========================== FVim Remoting ====================================\n                                \n    --daemon                    Start a FVR multiplexer server.\n                                Can be used with --nvim for alternative program.\n\n    --pipe name                 Override the named pipe address of the daemon.\n                                When this option is not given, defaults to\n                                '/tmp/fvr-main'\n\n    --fvr id [FILES...]         Connects to a FVR server.\n    --fvr a[ttach] [FILES...]    - id: an integer session id to connect\n    --fvr n[ew] [args...]        - attach: attach to the first available session \n                                 - new: create a new session with args passed to\n                                   NeoVim.\n                                Can be used with --ssh or --wsl for connecting a\n                                remote server. If neither is specified, connects\n                                to the local server.\n                                Can be used with --pipe to override the server \n                                address.\n\n    =========================== Debug options ====================================\n\n    --trace-to-stdout           Trace to stdout.\n    --trace-to-file             Trace to a file.\n    --trace-patterns            Filter trace output by a list of keyword strings\n\n    =========================== Terminal emulator ================================\n\n    --terminal                  Start as a terminal emulator.\n    --terminal-cmd              Command to run instead of the default shell.\n\n\nThe FVim arguments will be consumed and filtered before the rest are passed to NeoVim.\n```\n\n### Custom PUM icons\n\n| Category      | PUM text | FVim                                                                                                | NERD equivalent |\n|---------------|----------|-----------------------------------------------------------------------------------------------------|-----------------|\n| Text          | t        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Text_16x.png)                |                |\n| Method        | :        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Method_16x.png)              |                |\n| Function      | f        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Method_16x.png)              |                |\n| Constructor   | c        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/NewClass_16x.png)            |                |\n| Field         | .        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Field_16x.png)               | ﰠ               |\n| Variable      | v        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/LocalVariable_16x.png)       |                |\n| Class         | C        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Class_16x.png)               | ﴯ               |\n| Interface     | I        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Interface_16x.png)           |                |\n| Module        | M        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Module_16x.png)              |                |\n| Property      | p        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Property_16x.png)            | ﰠ               |\n| Unit          | U        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Dimension_16x.png)           | 塞              |\n| Value         | l        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Literal_16x.png)             |                |\n| Enum          | E        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Enumerator_16x.png)          |                |\n| Keyword       | k        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/IntelliSenseKeyword_16x.png) |                |\n| Snippet       | s        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Snippet_16x.png)             |                |\n| Color         | K        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/ColorPalette_16x.png)        |                |\n| File          | F        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/TextFile_16x.png)            |                |\n| Reference     | r        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Reference_16x.png)           |                |\n| Folder        | d        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Folder_16x.png)              |                |\n| EnumMember    | m        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/EnumItem_16x.png)            |                |\n| Constant      | 0        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Constant_16x.png)            |                |\n| Struct        | S        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Structure_16x.png)           | פּ               |\n| Event         | e        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Event_16x.png)               |                |\n| Operator      | o        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Operator_16x.png)            |                |\n| TypeParameter | T        | ![Symbol](https://github.com/yatli/fvim/raw/master/Assets/intellisense/Type_16x.png)                | T               |\n\n\nSo 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.\n\n### Goals\n\n- Keep up with the latest NeoVim features\n- Ergonomics improvements via GUI/native OS integration\n- Drive the flexible and accessible UI extension method \"UI Server Protocol\"\n  - The idea is to establish a standard protocol for UI extensions, so that the nice \n    GUI additions are not limited to one specific front-end. Think of a front end as\n    a UI server handling UI Server Protocol requests issued from front-end-agnostic \n    plugins. It's like Language Server Protocol, but for UI.\n\n### Non-Goals\n\n- Electron ecosystem integration :p\n- No walled garden. Everything should be accessible from the NeoVim core, which means:\n  - No project explorers -- use a NeoVim plugin\n  - No custom tab lines / document wells -- use a NeoVim plugin\n  - No side-by-side markdown viewer, unless it's a NeoVim plugin, implemented via the\n    UI-Protocol extensions.\n\n### Fellow Front-Ends (to name a few)\n\n- [Neovide](https://github.com/neovide/neovide)\n- [goneovim](https://github.com/akiyosi/goneovim)\n- [Gnvim](https://github.com/vhakulinen/gnvim)\n- [Uivonim](https://github.com/smolck/uivonim)\n- [firenvim](https://github.com/glacambre/firenvim)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyatli%2Ffvim","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyatli%2Ffvim","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyatli%2Ffvim/lists"}