vim-godot icon indicating copy to clipboard operation
vim-godot copied to clipboard

Use vim and godot engine to make games

= Godot + Vim :experimental: :icons: font :autofit-option: :!source-linenums-option: :imagesdir: images

== Intro

Godot engine has rock solid built-in editor but I still feel more comfortable within my (g)(n)vim environment.

This plugin provides:

  • GDScript and GSL syntax highlighing
  • Folding
  • Run commands: ** Run current scene: :GodotRunCurrent ** Run last scene: :GodotRunLast ** Select and run a scene with standard vim tab completion (default is a main scene): :GodotRun ** Select and run a scene with a FZF (if installed): :GodotRunFZF

All commands are local to buffer -- available only in gdscript or gsl buffers.

For IDE-like completion I suggest to try https://github.com/ycm-core/YouCompleteMe[YouCompleteMe] or https://github.com/neoclide/coc.nvim[coc.nvim] plugin. (Both do a really great job providing gdscript completion for me).

https://www.youtube.com/watch?v=ALXN4HJ5bsg

== Select And Run Scene

  • Use :GodotRun <TAB> to select a scene and run it. :GodotRun<CR> will run main scene.
  • Use :GodotRunFZF<CR> to select a scene using FZF (if installed) and run it.

Note that commands assume godot executable is on your PATH, i.e. you can run godot from your terminal. If this is not the case, specify it in your settings:

.For windows [source,vim]

" windows example let g:godot_executable = 'C:/Path/To/Godot/godot.exe'

.For OSX [source,vim]

" OSX example let g:godot_executable = '/Applications/Godot.app'

image::https://user-images.githubusercontent.com/234774/80359547-a5fc6c00-8886-11ea-9cdd-bc027d46db4c.gif[]

NOTE: To run game or a scene in "async way" install either https://github.com/tpope/vim-dispatch[vim-dispatch] or https://github.com/skywind3000/asyncrun.vim[asyncrun.vim].

== Settings

No default mappings are provided.

Good practice is to put your personal filetype specific settings into after directory: ~/.vim/after/ftplugin/gdscript.vim (or ~/vimfiles/after/ftplugin/gdscript.vim if you're on windows).

[source,vim]

" to use folding provided by plugin setlocal foldmethod=expr setlocal tabstop=4 nnoremap <F4> :GodotRunLast<CR> nnoremap <F5> :GodotRun<CR> nnoremap <F6> :GodotRunCurrent<CR> nnoremap <F7> :GodotRunFZF<CR>

Or you can use autocommand in your .vimrc (example):

[source,vim]

func! GodotSettings() abort setlocal foldmethod=expr setlocal tabstop=4 nnoremap <F4> :GodotRunLast<CR> nnoremap <F5> :GodotRun<CR> nnoremap <F6> :GodotRunCurrent<CR> nnoremap <F7> :GodotRunFZF<CR> endfunc augroup godot | au! au FileType gdscript call GodotSettings() augroup end

== Installation

Using plugin manager:: Follow your plugin manager documentation, for example, link:https://github.com/junegunn/vim-plug[vim-plug] does it this way: + [source,vim]

" Specify a directory for plugins call plug#begin('~/.vim/plugged')

Plug 'habamax/vim-godot'

" ... other plugins ...

" Initialize plugin system call plug#end()

Manual with git:: Clone this repo to your vim/nvim packages directory: + .Vim on Linux or OSX [source,sh]

git clone https://github.com/habamax/vim-godot ~/.vim/pack/plugins/start/vim-godot

.Neovim on Linux or OSX [source,sh]

git clone https://github.com/habamax/vim-godot ~/.config/nvim/pack/plugins/start/vim-godot

.Vim on Windows [source,sh]

git clone https://github.com/habamax/vim-godot C:/Users/USERNAME/vimfiles/pack/plugins/start/vim-godot <.>

.Neovim on Windows [source,sh]

git clone https://github.com/habamax/vim-godot C:/Users/USERNAME/AppData/Local/nvim/pack/plugins/start/vim-godot <.>

<.> Change USERNAME to your user name

Manual:: * Download zip archive (available in menu:Code[Download ZIP]) * Unpack it to appropriate folder defined in Manual with git * Make sure that contents of the archive is in .../start/vim-godot directory: ** autoload ** ftdetect ** ftplugin ** ... etc

== Setting up YouCompleteMe for Godot 3.2.2+

. Install and set up YCM according to https://github.com/ycm-core/YouCompleteMe#installation[it's documentation]. (i.e. install with package manager then run ./install.py).

. Make sure general completion works for you.

. Follow https://github.com/ycm-core/lsp-examples[instructions for enabling godot].

Or you can just add this to your vimrc:

[source, vim]

if !has_key( g:, 'ycm_language_server' ) let g:ycm_language_server = [] endif

let g:ycm_language_server += [ \ { \ 'name': 'godot', \ 'filetypes': [ 'gdscript' ], \ 'project_root_files': [ 'project.godot' ], \ 'port': 6008 \ } \ ]

NOTE: This is not a comprehensive YouCompleteMe setup guide. It just works for me and hopefully would work for you.

== Setting up coc.nvim for Godot 3.2.2+

. Install https://github.com/neoclide/coc.nvim[coc.nvim], make sure it does general completion for you. . Open :CocConfig and add following lines: + [source,json]

{ "languageserver": { "godot": { "host": "127.0.0.1", "filetypes": ["gdscript"], "port": 6008 } } }

. Save and restart

NOTE: This is not a comprehensive coc.nvim setup guide. It just works for me and hopefully would work for you.

== Setting up ale for Godot 3.2.2+

. Install https://github.com/dense-analysis/ale[ale], make sure it does general completion for you and register the Godot LSP server as follows in your vimrc: + [source,vim]

" Enable ALE auto completion globally let g:ale_completion_enabled = 1

" Allow ALE to autoimport completion entries from LSP servers let g:ale_completion_autoimport = 1

" Register LSP server for Godot: call ale#linter#Define('gdscript', { \ 'name': 'godot', \ 'lsp': 'socket', \ 'address': '127.0.0.1:6008', \ 'project_root': 'project.godot', })

. Save and restart

NOTE: This is not a comprehensive ALE setup guide. Make sure to adjust it to your needs.

== Setting up ctags

Put the following contents:

[source]

--langdef=GDScript --langmap=GDScript:.gd --regex-GDScript=/^func[ \t]+([a-zA-Z0-9_]+)/\1/f,function,function definitions/ --regex-GDScript=/^(onready[ \t]+)?var[ \t]+([a-zA-Z0-9_]+)/\2/v,variable,variable definitions/ --regex-GDScript=/^(export[ \t](.)?[ \t]+)?var[ \t]+([a-zA-Z0-9_]+)/\3/v,variable,variable definitions/

  • ~/.ctags.d/gdscript.ctags if you use https://ctags.io/[universal ctags] or
  • ~/.ctags if you use http://ctags.sourceforge.net/[exuberant ctags]

To use it together with tagbar, put following into your vimrc or init.vim: [source]

let g:tagbar_type_gdscript = { 'ctagstype' :'gdscript', 'kinds':[ 'v:variables', 'f:functions', ] }

== Setting up Neovim native lsp with nvim-cmp Install the following plugins

[source,vim]

Plug 'neovim/nvim-lspconfig' "A good completion plugin Plug 'hrsh7th/cmp-nvim-lsp' Plug 'hrsh7th/cmp-buffer' Plug 'hrsh7th/nvim-cmp'

put this in your init.vim to set up the gdscript server and connecting cmp to it (the mappings are the official cmp mappings you can remove or change them)

[source,vim]

set completeopt=menu,menuone,noselect

lua << EOF require'lspconfig'.gdscript.setup{capabilities = require('cmp_nvim_lsp').update_capabilities(vim.lsp.protocol.make_client_capabilities())}

local cmp = require'cmp'

cmp.setup({ mapping = { ['<C-d>'] = cmp.mapping.scroll_docs(-4), ['<C-f>'] = cmp.mapping.scroll_docs(4), ['<C-Space>'] = cmp.mapping.complete(), ['<C-e>'] = cmp.mapping.close(), ['<CR>'] = cmp.mapping.confirm({ select = true }), },

sources = { { name = 'nvim_lsp' }, { name = 'buffer' }, } }) EOF

== Setup vim as an external editor for Godot

Note I didn't try it myself, but @macmv https://github.com/habamax/vim-godot/issues/29[had provided] some info about it.

Open menu Editor/Editor Settings/ then navigate to General/External/:

  • Tick Use external editor
  • Add vim to Exec Path
  • Add --servername godot --remote-send "<C-\><C-N>:n {file}<CR>{line}G{col}|" to Exec Flags

== Setup Neovim as an external editor for Godot

All of the clientserver features were removed in Neovim so you have to install a python script to use them

https://github.com/mhinz/neovim-remote

now navigate to the root of your godot project (where the project.godot is residing) and start a new Neovim like this

[source]

nvim --listen godothost .

Open menu Editor/Editor Settings/ then navigate to General/External/:

  • Tick Use external editor
  • Add nvr to Exec Path
  • Add --servername godothost --remote-send "<C-\><C-N>:n {file}<CR>:call cursor({line},{col})<CR>" to Exec Flags

now when you click on a script in godot it will open it in a new buffer in Neovim.