Tact Language Server
Developed by TON Studio, powered by the community.
Features • Installation • Community • Troubleshooting

This language server/extension provides support for the Tact programming language.
Tact is a next-generation programming language for building secure, scalable, and maintainable smart contracts on TON blockchain.
Features
Quick start
The easiest way to get started with Tact is to use VS Code or editors based on it:
- Install the Tact language extension
in VS Code
or in VS Code-based editors
- That's it!

Installation
VS Code / VSCodium / Cursor / Windsurf
- Get the latest
.vsix file from releases from
VS Code marketplace
or from Open VSX Registry
- In VS Code:
- Open the Command Palette (
Ctrl+Shift+P or Cmd+Shift+P )
- Type "Install from VSIX"
- Select the downloaded
.vsix file
- Reload VS Code
Other Editors
- Get the latest archive from releases:
tact-language-server-*.tar.gz for Linux/macOS
tact-language-server-*.zip for Windows
- Extract it to a convenient location
- Configure your editor to use the language server (see editor-specific instructions below)
Building from Source
If you want to build the language server yourself:
git clone https://github.com/tact-lang/tact-language-server
cd tact-language-server
yarn install
yarn build
To obtain the .vsix package with the VS Code extension, additionally run:
yarn package
Then run either of those to install the extension from the .vsix package:
# VSCode, replace VERSION with the actual version from package.json
code --install-extension vscode-tact-VERSION.vsix
# VSCodium, replace VERSION with the actual version from package.json
codium --install-extension vscode-tact-VERSION.vsix
Editor Setup
Sublime Text
Install LSP package:
- Open Command Palette (
Ctrl+Shift+P or Cmd+Shift+P )
- Select "Package Control: Install Package"
- Search for and select "LSP"
Install the Tact package via Package Control for syntax highlighting
Add the following configuration to your LSP settings (Preferences > Package Settings > LSP > Settings ):
{
"clients": {
"tact": {
"enabled": true,
"command": ["node", "path/to/language-server/dist/server.js", "--stdio"],
"selector": "source.tact"
}
},
"inhibit_snippet_completions": true
}
Create a new file with the .tact extension to verify the setup
Neovim
Prerequisites:
Setup steps:
Add tact.lua to your lua/lspconfig/server_configurations directory with the following content:
local util = require 'lspconfig.util'
return {
default_config = {
cmd = { 'node', '/absolute/path/to/language-server/dist/server.js', '--stdio' },
filetypes = { 'tact' },
root_dir = util.root_pattern('package.json', '.git'),
},
docs = {
description = [[
Tact Language Server
https://github.com/tact-lang/tact-language-server
]],
default_config = {
root_dir = [[root_pattern("package.json", ".git")]],
},
},
}
Add the following to your init.lua :
require'lspconfig'.tact.setup {}
Vim
Prerequisites:
Recommended, but not required:
Setup steps:
Install the tact.vim if it hasn't already been installed. Prefer using a non-builtin plugin manager to get new updates easily.
Install the vim-lsp plugin if it isn't already installed. For that, use vim-plug or the built-in package manager of Vim 8+, see :help packages .
If it wasn't installed before, you'll need to set up basic keybindings with the language client. Add the following to your ~/.vimrc (or ~/_vimrc if you're on Windows), or modify your preferences:
function! s:on_lsp_buffer_enabled() abort
setlocal omnifunc=lsp#complete
setlocal signcolumn=yes
if exists('+tagfunc') | setlocal tagfunc=lsp#tagfunc | endif
nmap <buffer> gd <plug>(lsp-definition)
nmap <buffer> gs <plug>(lsp-document-symbol-search)
nmap <buffer> gS <plug>(lsp-workspace-symbol-search)
nmap <buffer> gr <plug>(lsp-references)
nmap <buffer> gi <plug>(lsp-implementation)
nmap <buffer> gt <plug>(lsp-type-definition)
nmap <buffer> <leader>rn <plug>(lsp-rename)
nmap <buffer> [g <plug>(lsp-previous-diagnostic)
nmap <buffer> ]g <plug>(lsp-next-diagnostic)
nmap <buffer> K <plug>(lsp-hover)
nnoremap <buffer> <expr><c-f> lsp#scroll(+4)
nnoremap <buffer> <expr><c-d> lsp#scroll(-4)
let g:lsp_format_sync_timeout = 1000
autocmd! BufWritePre *.rs,*.go call execute('LspDocumentFormatSync')
" Refer to the doc to add more commands:
" https://github.com/prabirshrestha/vim-lsp#supported-commands
endfunction
augroup lsp_install
au!
" call s:on_lsp_buffer_enabled only for languages that have the server registered.
autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
augroup END
Add the following to your ~/.vimrc (or ~/_vimrc if you're on Windows):
if executable('node')
au User lsp_setup call lsp#register_server({
\ 'name': 'tact',
\ 'cmd': {server_info->['node', '/absolute/path/to/language-server/dist/server.js', '--stdio']},
\ 'allowlist': ['tact'],
\ })
endif
Helix
Make sure you have Helix installed and configured
Add the following configuration to your ~/.config/helix/languages.toml :
[[language]]
name = "tact"
language-servers = ["tact-language-server"]
[language-server.tact-language-server]
command = "node"
args = ["path/to/language-server/dist/server.js", "--stdio"]
Replace path/to/language-server with the actual path where you cloned the repository
Restart Helix for changes to take effect
Troubleshooting
See TROUBLESHOOTING.md.
License
MIT
| |