F# support for Vim/Neovim
Part of the Ionide plugin suite.
-
A fork of fsharp/vim-fsharp.
-
Uses LSP-mode of FsAutoComplete as a backend.
-
Powered by autozimu/LanguageClient-neovim.
Consider this to be beta since it's lacking features compared to Ionide-VSCode and not as battle-tested as that.
That being said, we maintainers use this plugin daily so it will someday become feature-rich and stable for sure.
Feel free to request features and/or file bug reports!
-
Neovim or Vim 8.0+
- Python support is not required as of now. This may or may not change in the future.
-
- Required to run FsAutoComplete.
- Very useful for command-line development.
-
- Required to communicate with FsAutoComplete.
-
fzf (optional)
- Optional dependency of LanguageClient-neovim.
- Multi-entry selection UI.
- Syntax highlighting
- Auto completions
- Error highlighting, error list, and quick fixes based on errors
- Tooltips
- Go to Definition
- Find all references
- Highlighting usages
- Rename
- Show symbols in file
- Find symbol in workspace
- Show signature in status line
- Integration with F# Interactive
- Integration with FSharpLint (additional hints and quick fixes)
- Integration with Fantomas (the best formatter available for F#)
1. Install LanguageClient-neovim
Refer to their INSTALL.md.
Note: There is an ongoing (but not critical) issue with the latest LC-neovim (#22) and if you want to avoid it you should install the tag 0.1.155.
Plug 'autozimu/LanguageClient-neovim', {
\ 'branch': 'next',
\ 'tag': '0.1.155',
\ 'do': 'bash install.sh',
\ }
Plug 'ionide/Ionide-vim', {
\ 'do': 'make fsautocomplete',
\}
call dein#add('ionide/Ionide-vim', {
\ 'build': 'make fsautocomplete',
\ })
Clone Ionide-vim to some runtimepath and run make fsautocomplete
.
Run install.ps1
instead of make fsautocomplete
.
For example, if you are using vim-plug, you can use the following:
Plug 'ionide/Ionide-vim', {
\ 'do': 'powershell -ExecutionPolicy Unrestricted .\install.ps1',
\}
Opening either *.fs
, *.fsi
or *.fsx
files should trigger syntax highlighting and other depending runtime files as well.
Refer to LanguageClient-neovim for features provided via Language Server Protocol.
To be added as requested for F#-specific features.
- Searches a workspace (
sln
orfsproj
) and then load it. - Equivalent to
FSharp.workspaceMode = sln
in Ionide-VSCode. - Automatically called when you open F# files. Can be disabled in settings.
- The deep level of directory hierarchy to search can also be configured in settings.
- Loads specified projects (
sln
orfsproj
).
- Reloads all the projects currently loaded.
- Automatically called when you save
.fsproj
files. Can be disabled in settings.
- Updates FSAC configuration.
- See FsAutoComplete Settings for details.
- Downloads the latest build of FsAutoComplete to be used with Ionide-vim.
- This does not work on Windows yet. We will fix this but in the meantime you can use
install.ps1 update
.
Ionide-vim has an integration with F# Interactive.
FSI is displayed using the builtin :terminal
feature introduced in Vim 8 / Neovim and can be used like in VSCode.
- Shows a F# Interactive window.
- Evaluates given expression in FSI.
- Sends the content of current file to FSI.
- Resets the current FSI session.
- When in normal mode, sends the current line to FSI.
- When in visual mode, sends the selection to FSI.
- Sending code to FSI opens FSI window but the cursor does not focus to it. Unlike Neovim, Vim doesn't support asynchronous buffer updating so you have to input something (e.g. moving cursor) to see the result. You can change this behavior in settings.
- Toggles FSI window. FSI windows shown in different tabpages share the same FSI session.
- When opened, the cursor automatically focuses to the FSI window (unlike in
Alt-Enter
by default).
You can customize the location of FSI, key mappings, etc. See the documentation below.
Refer to LanguageClient-neovim's recommended settings for features provided via Language Server Protocol.
To be added as requested for F#-specific features.
- Ionide-vim uses
snake_case
for the setting names.- For FSAC settings only,
CamelCase
can also be used (as it gets serialized to a F# record). - If both
snake_case
andCamelCase
are specified, thesnake_case
one will be preferred.
- For FSAC settings only,
- You can change the values at runtime and then notify the changes to FSAC by
:FSharpUpdateServerConfig
. - Some of the settings may not work in Ionide-vim as it is lacking the corresponding feature of Ionide-VSCode.
- If not specified, the recommended default values described on the FSAC's documentation will be used.
- If you are using a JSON configuration file though
g:LanguageClient_settingsPath
, the recommended default values will override the settings loaded from it. - You can disable this by
let g:fsharp#use_recommended_server_config = 0
.
- If you are using a JSON configuration file though
See the documentation of FSAC for the complete list of available settings. Frequently used ones are:
let g:fsharp#automatic_workspace_init = 1 " 0 to disable.
let g:fsharp#workspace_mode_peek_deep_level = 2
let g:fsharp#exclude_project_directories = ['paket-files']
You may want to bind LanguageClient#textDocument_codeAction()
to some shortcut key. Refer to their docs.
" 0 to disable.
let g:fsharp#linter = 1
let g:fsharp#unused_opens_analyzer = 1
let g:fsharp#unused_declarations_analyzer = 1
let g:fsharp#automatic_reload_workspace = 1 " 0 to disable.
let g:fsharp#show_signature_on_cursor_move = 1 " 0 to disable.
If you want to use a .NET Framework FSI instead of .NET Core one, set g:fsharp#use_sdk_scripts
to 0
.
See: ionide/FsAutoComplete#466 (comment)
let g:fsharp#fsi_command = "fsharpi"
let g:fsharp#use_sdk_scripts = 0 " for net462 FSI
Sets additional arguments of the FSI instance Ionide-vim spawns and changes the behavior of FSAC accordingly when editing fsx files.
let g:fsharp#fsi_extra_parameters = ['--langversion:preview']
It must create a new empty window and then focus to it.
See :help opening-window
for details.
let g:fsharp#fsi_window_command = "botright vnew"
If you are using Vim, you might want to enable this to see the result without inputting something.
let g:fsharp#fsi_focus_on_send = 1 " 0 to not to focus.
vscode
: Default. Same as in Ionide-VSCode (Alt-Enter
to send,Alt-@
to toggle terminal).<M-CR>
in Neovim /<ESC><CR>
in Vim: Sends line/selection to FSI.<M-@>
in Neovim /<ESC>@
in Vim: Toggles FSI window.
vim-fsharp
: Same as in fsharp/vim-fsharp. Note that<leader>
is mapped to backslash by default. See:help mapleader
.<leader>i
: Sends line/selecion to FSI.<leader>e
: Toggles FSI window.
custom
: You must set bothg:fsharp#fsi_keymap_send
andg:fsharp#fsi_keymap_toggle
by yourself.g:fsharp#fsi_keymap_send
: Sends line/selection to FSI.g:fsharp#fsi_keymap_toggle
: Toggles FSI window.
none
: Disables mapping.
" custom mapping example
let g:fsharp#fsi_keymap = "custom"
let g:fsharp#fsi_keymap_send = "<C-e>"
let g:fsharp#fsi_keymap_toggle = "<C-@>"
Linting (other than the basic ones described above) and formatting is powered by independent tools, FSharpLint and Fantomas respectively.
Both uses their own JSON file for configuration and Ionide-vim does not control them. See their docs about configuration: FSharpLint and Fantomas.
If you are using neovim 0.4.0 or later, floating windows will be used for tooltips and you might find it convenient to make them appear if the cursor does not move for several seconds.
if has('nvim') && exists('*nvim_open_win')
augroup FSharpShowTooltip
autocmd!
autocmd CursorHold *.fs,*.fsi,*.fsx call fsharp#showTooltip()
augroup END
endif
Note that you can set the delay time to show the tooltip by set updatetime=<ms>
. The default delay is 4 seconds, which you may find too slow.
- The primary maintainer for this repository is @cannorin.