Sign in Join
Wiki copytemporary

CudaText plugins

Comments

You can add/remove code comments, via "Comments" plugin. Plugin is preinstalled in CudaText. It gives about 6 commands in menu "Plugins / Comments". Plugin supports only adding/removing of comments, not syntax highlighting for them (highlighting is lexer's work).

For example, Python lexer supports only line comment, and don't support stream comments. PowerShell lexer supports comments for full lines, while don't support comments for any range.

Comment chars are editable in SynWrite editor, in dialog "Lexer properties" (after you install the same lexer to SynWrite). In dialog tab "Commenting" you'll see input fields.

Command "Toggle stream comment" in plugin adds/removes comments of last 2 types: for range, for full lines (plugin chooses needed kind).

Where comment chars are stored:

Commenting options

Plugin "Comments" has several options, and it gives the dialog to change them: menu item "Options / Settings-plugins / Comments / Config".

(Line commands) Try to keep text position after (un)commenting

Affects all commands for line-comments.

With option on, plugin tries to insert comment chars into leading space-area of the line. For example, with C++ (line comment chars "//"), line with 4 leading spaces:

    code();

will be changed to line with 2 leading spaces:

  //code();

After uncommenting, line will be restored to original, with 4 leading spaces.

(Line "at non-space") If selected few lines, insert comment at maximal common indent

Affects commands:

With option on, this selected block of lines in C++:

      code1();
    code2();
        code3();

will be changed to:

    //  code1();
    //code2();
    //    code3();

With option off, block will be changed to:

      //code1();
    //code2();
        //code3();

(All) Move caret to next line

Affects commands for line-comments, when they are called without selection.

With option on, caret will be moved 1 line down. This allows to call the command many times repeatedly, to change many lines.

(Line commands) Skip blank lines

Affects commands for line-comments, when they are called without selection.

With option on, and the previous option "Move caret to next line" on, command will skip lines containing only space/tab chars.

"Toggle line comment" detects action by first non-blank line

Affects command "Toggle line comment".

With option on, command detects its action (to comment or to uncomment) by the first non-blank line of the selected multi-line block.

Here is selected block of code, selection is shown by square brackets, first selected line is blank line:

[
 
    //code1();
    code2();
    //code3();
    code4();
]

With option off, block will be changed it to:

[//
//
    //code1();
    //code2();
    //code3();
    //code4();
]

With option on, block will be changed to:

[
 
    code1();
    code2();
    code3();
    code4();
]

Macros

Macro is a sequence of CudaText actions, which can be saved to a file and invoked later by some command. To use macros, you must install plugin "Macros" from Addon Manager. It adds "Macros" menu to CudaText main menu bar. This menu gives items:

To record a macro:

During recording, CudaText shows reddish border around the editor field.

Macro saves action(s) performed inside its original editor ui-tab (but not other ui-tabs). Calling of additional dialogs (including plugin dialogs) will be recorded too. But macro doesn't save actions inside those dialogs.

To playback macro:

Macro example

For example, we have text line with HTML tags like this ("|" shows the caret):

....<tag>....|...........</tag>....

For example, we need a macro which selects text from lefter ">" char to righter "<" char (ie text inside HTML tag). This action can be done via "markers" commands in Command Palette: "drop marker at caret" and "select to last marker".

So, during macro recording, run these commands:

Project Manager

This plugin is preinstalled in CudaText. It shows panel "Project" in the sidebar (to show this panel, call plugin by any command, or call "File / Open folder..." menu item which opens any folder as a "project"). On the project panel, on its tree-view, you can add several "root nodes", each node must be existing file or folder. For folder nodes, plugin auto shows all nested folders. You cannot add nodes on other levels, sub-nodes are auto populated from root folder nodes.

Plugin has context menu on its panel, with items:

To manage the selected file/folder, use context menu items "Selected file"/"Selected directory". They give useful sub-items for file operations, like shown on the picture:

Any project can have main file, you can choose it in the context menu: "Selected file / Set as main file". Main file's path is used by plugin External Tools, when some tool is configured with macro {ProjMainFile}. This allows tools to run compilation of the main file.

Sometimes you may want to forget the "temporary" project which CudaText may create from Windows Explorer context menu. To do this, just call "Project file / New project" from the right-click menu over the project panel. This does not delete the file "settings/temporary.cuda-proj", but that file will be overwritten soon.

Project Manager options dialog

"Ignore files"
";"-separated shell wildcards, which are documented here. If file name (without path) matches any of these wildcards, it will not be listed in the treeview.

"Ignore folders"
";"-separated shell wildcards. If folder name matches any of these wildcards, it will not be listed in the treeview.

"Ignore all hidden files/folders"
Additionally don't list all hidden items. On Unix, hidden mean "beginning with dot". On Windows, hidden means having file-system "hidden" attribute.

"Open file after "Go to file" command"
If turned on, command "Project Manager: Go to file" will not only jump to chosen file in the treeview, but also open that file in editor.

"Use 'preview tab' on item clicking"
If option is on, single click on treeview file item, will open file in "preview tab". Preview tab is single such tab, it's shared by all files, it has italic+underlined tab title. If option is off, clicking file item will open normal tab, separate normal tabs per each file.

"Open files by double-click"
If turned on, only double-click in the treeview will open file for editing, but not the single click.

"On opening file in Git/SVN repo..."
On opening a file in CudaText, Project Manager will check if this file is in the Git/SVN repository (by presence of the folder ".git" or ".svn" near the file, or in upper level folders). If yes, Project Manager will create the project from that repository and open it. This gives some slowdown of course.

"Suggest to close tabs not belonging to project"
See #Sessions embedded to project.

And options for icons:

"File type icons"
Set of file/folder icons for treeview. You can install additional themes from Addons Manager, see category "filetypeicons" there. Example of such theme: "VSCode Material 24x24". This option shows themes, which are present in the folder "data/filetypeicons".

"Toolbar icons"
Set of icons for Project Manager toolbar buttons. You can install additional themes from Addon Manager, see the category "projtoolbaricons" there. This option shows themes, which are present in the folder "data/projtoolbaricons".

Preview tab

To see the "preview tab", call "File / Open folder" and choose a folder with some files. Folder will be opened in the side panel "Project". Make single click on a file in this project, it will open in the "preview tab". Single "preview tab" is shared by all clicked (in the project) files. It has italic font style of the caption (font style is customizable). When you begin to edit file in the "preview tab", tab becomes "normal" and looses its special status.

"Preview tab" is always created in the first tab-group, even if the focused editor is located in different tab-group. It was made on purpose, to avoid the situation when "preview tab" jumps from one tab-group to another.

Again, if you click different items in the Project Manager, and files are opened in the first tab-group, it's not a bug. If you need to open clicked files in different tab-groups, you can do it - by unchecking the option "Use preview tab on item clicking" in the Project Manager options.

"Preview tab" can be dragged to another tab-group, it should work there too.

Switch between projects

1) To switch to different project, Plugin Manager gives the context menu: "Project File / Recent projects / name.cuda-proj".

2) Another way is using the plugin "Favorites". It gives the dialog (can be called by a hotkey), with 2 tabs: "Files" and "Projects", so you can choose one of your favorite projects from a listbox.

3) There is also a way to quickly switch between projects:

4)

Sessions embedded to project

CudaText supports sessions which are not separate JSON files (*.cuda-session or .json) but are embedded into project file (.cuda-proj). Session is still having the same JSON format, but it's nested 2 levels into the project JSON file. Such embedded sessions are visible only to the Project Manager. When an embedded session is active, CudaText window title shows this in curly brackets: "{project_name:session_name}".

To control sessions, use the "gear" button on the Project Manager toolbar. Several menu items are there:

Project Manager has the option checkbox "Suggest to close tabs not belonging to project". When option is on, you will see such confirmation message box:

CudaText has opened 3 tab(s) not belonging to the project "name". Close them?
/path/to/file1
/path2/to/file2
*Untitled1

You will see this confirmation when doing:

You can disable that option (or press "Cancel" in the confirmation), to save even "not belonging" opened files to embedded session.

How to bind a hotkey to insert a snippet

You can create plugin to insert any text fragment by any hotkey. First, create the plugin which gives the command to insert your fragment. Next, find this plugin in the Command Palette, press F9 and assign a hotkey there.

Let's show how to make a primitive plugin which has 2 primitive commands:

Make a new plugin by calling menu item "Plugins / Make Plugin". Fieds of dialog:

My snippet>my_snippet
My edit>my_edit

This will generate new plugin with 2 methods in the file "init.py": my_snippet and my_edit. Code will be like this:

python
    def my_snippet(self):
        #
        #
        #
        msg_box(s, MB_OK)
     
    def my_edit(self):
        pass

At the top of the Python file, near "import" operators, add:

python
import cudatext_cmd as cmds

Now edit methods my_snippet / my_edit:

python
    def my_snippet(self):
        ''' Insert my snippet '''
        ed.cmd(cmds.cCommand_TextInsert, 'AA')
     
    def my_edit(self):
        ''' Surround line with brackets '''
        x, y, x1, y1 = ed.get_carets()[0]
        s = ed.get_text_line(y)
        s = '[' + s + ']'
        ed.set_text_line(y, s)
        msg_status('Edited!')

All done. Restart CudaText. You must have new menu items:

In the Command Palette, find these new commands, press F9 to set hotkey for them.

Snippets

To use snippets you need:

Each snippet has a name (shown in the dialog when Snippets plugin is called) and short id (letters, digits, '_', dot). You can type id in the editor and press the Tab key: snippet for this id will be inserted into text. You can also call the menu of snippets: menu item "Plugins / Snippets / Snippets menu...".

Only those snippets are enabled, which are suitable for the current lexer. Snippet's "lexer" property can be "C,C++,Objective C" - then snippet is enabled only when one of these 3 lexers is active. If snippet has empty "lexer" property, it is always enabled.

Dialog of Snippets plugin:

Texts of snippets usually have tab-stop(s), e.g. ${1:some_text}. Plugin Snippets finds tab-stops and places "markers" for them. After markers are placed, Tab-key works specially: it jumps to the next marker. See detailed information in the CudaText#Markers.

Plugin supports two snippets folder, but formats of data are the same, VSCode JSON format:

Snippets from VSCode

Since recent versions, Snippets plugin supports snippets from VSCode editor. It gives menu items in "Plugins / Snippets":

Plugin also gives the fully featured snippet editor dialog, in menu item "Add/edit snippets...".

You can create group of snippets (in the "Manage snippets" dialog) for all lexers. To do so, enter "*" value in the "Group's lexers" field of dialog.

Currently most of VSCode/TextMate "macros" are supported in snippets body, but not all. Refer to readme file of the plugin.

Snippets for HTML tags

CudaText has preinstalled 120+ snippets for HTML tags. (You still need to install Snippets plugin.) They are enabled with HTML lexer. Just type tag name without a bracket, press Tab, and snippet is inserted. E.g. "a"<Tab> will insert:

 <a href="http" title="Title" target="_blank"></a>

These snippets have markers, so Tab key jumps to the next marker. Last marker is usually placed after the entire tag, ie after ">" bracket.

Format of snippet files

Snippets tab-stops

Specify tab-stops in the snippet text like this:

This places markers (AKA tab-stops) in the editor, marker index NN should be from 0 to 40. After snippet insertion, tab-key goes to next marker(s) and deletes it.

Snippets macros

Special macros are handled by Snippets plugin in snippet text:

The following macros from Sublime Text editor are supported. They can be written as $NAME or as ${NAME}.

For inserting the current date and time:

Snippet Panel

Plugin "Snippet Panel" is preinstalled in CudaText. It gives an alternative way to use short text fragments (only simple ones) in editor. It adds button to sidebar, and command "Plugins / Snippet Panel". When called, plugin shows panel in the sidebar, with a drop-down list of folders, which contain several "snippets". You can double-click snippets to insert them into text (multi-carets are supported).

Preinstalled folders:

Plugin looks for its folders in two places:

Each snippet folder can contain one or more .txt files, in UTF-8 (no BOM) or UTF-16 (with BOM) encoding. Files have snippet per line, in the form "name=value" or simply "name" (if value missed, it equals to name). Each snippet can be simple short string, or string with ${sel} macro to replace selected text. This allows to quote currently selected text by calling snippets from "Quote selection" folder.

CudaLint

CudaLint plugin allows to check correctness of documents in many syntaxes. It was initially ported from SublimeLinter 2.x plugin for Sublime Text. Each lexer must be supported with additionally installed linter, for example:

You will find all linters in the Addon Manager: "Plugins / Addon Manager / Install". Linters are installable like other plugins but they don't add commands, they only add folders "[CudaText]/py/cuda_lint_*", which are automatically used by CudaLint. After you install a linter, see readme in its folder, maybe how-to-use info is written there.

Linters - usage

To run linting, use menu item "Plugins / CudaLint / Lint", or set hotkey to this command (in CudaText Command Palette, press F9). You will see statusbar message, which tells how many errors linter found. For each found error, you'll see yellow/red bookmark (you can use usual commands for these bookmarks). Plugin also shows list of errors in the "Validate" panel (to show Validate panel, click V icon on the CudaText sidebar).

Linting can also be run by events:

Events aren't used by default (to not slowdown usual work). To use events, you must enable them in config. Call config by menu item in "Options / Settings-plugins".

Linters - Node.js

Some linters require Node.js, so for those linters, you must install Node first. Those linters are sometimes shipped with Node modules preinstalled (in plugin folder) and sometimes you need to install Node modules via NPM. See linter's readme file for details.

Linters - authoring

To support more lexers, it's a good idea to port linter from SublimeLinter. To port a linter, most you need is:

Linters - per project

How to configure linters per project? In your project (Project Manager plugin), right-click root node of project treeview, call menu item "Project file / Project properties...". In this dialog, in the "Variablies" field, enter variable(s) like this:

linter_css=csslint

Variable prefix "linter_" required, after goes lower-case lexer name (CSS). Value of variable must be name of linter's folder (in "py" folder) without "cuda_lint_". So if linter's folder is py/cuda_lint_aaa, specify value "aaa".

In this example, CudaLint plugin allows, for mentioned lexer CSS, only linter "csslint", even if another CSS linter (e.g. "csstree") is installed and found first.

Linters - method split_match

Linters have RegEx property in class, which must find named groups:

Group "file" or "filename" is not used by CudaLint, but it may present for internal linter's handling, e.g. to ignore the line containing wrong filename.

Example from SublimeLinter's linter for "Luau":

python
class Luau(Linter):
    cmd = 'luau-analyze --formatter=gnu -'
    regex = r'^stdin:(?P<line>\d+)\.(?P<col>\d+)\-(?P<end_line>\d+)\.(?P<end_col>\d+): (?P<code>\w+): (?P<message>.+)'

Sometimes, finding "error"/"warning" named groups is hard, and class method "split_match" can help here. Example from SublimeLinter's linter for "Luau":

python
    def split_match(self, match):
        error = super().split_match(match)
        error['error_type'] = 'error' if error['code'].endswith('Error') else 'warning'
        return error

If CudaLint linter uses "split_match" it must be different. We cannot read error['code'] and cannot write error['error_type']. We must adapt code to this:

python
    def split_match(self, match):
        matches, line, col, error, warning, message, near = super().split_match(match)
        is_error = matches.group('code').endswith('Error')
        error = is_error
        warning = not is_error
        return matches, line, col, error, warning, message, ''

CudaLint needs 7 tuple items in split_match() result:

Example from CudaLint linter for Java. We override method because javac lints all referenced files, and we only want errors from the linted file.

python
    def split_match(self, match):
        if match:
            if match.group('file') != self.filename:
                match = None
        return super().split_match(match)

Example from CudaLint linter for Haml. We override method to set the line/col to 0 if a linter error occurs and there is no line number.

python
    def split_match(self, match):
        match, line, col, error, warning, message, near = super().split_match(match)
        if line is None:
            line = col = 0
        return match, line, col, error, warning, message, near

Example from CudaLint linter for AutoIt. Here we modify the message/error/warning.

python
    def split_match(self, match):
        split_match = super(AutoIt, self).split_match(match)
        match, line, col, error, warning, message, near = split_match
        message = '{} (Col {})'.format(message, col)

        if match and match.group('type') == 'error':
            error = 1
            message = 'Error: ' + message
        elif match and match.group('type') == 'warning':
            warning = 1
            message = 'Warning: ' + message

        return match, line, col, error, warning, message, ''

Example from CudaLint linter for JavaScript using ESLint. We override this method to silent warning by .eslintignore settings.

python
    def split_match(self, match):
        v1message = 'File ignored because of your .eslintignore file. Use --no-ignore to override.'
        v2message = 'File ignored because of a matching ignore pattern. Use --no-ignore to override.'

        match, line, col, error, warning, message, near = super().split_match(match)
        if message and (message == v1message or message == v2message):
            return match, None, None, None, None, '', None

        return match, line, col, error, warning, message, near

Example from CudaLint linter for PowerShell using PSScriptAnalyzer. We return the match with ` quotes transformed to '. We supress one message.

python
    def split_match(self, match):
        match, line, col, error, warning, message, near = super().split_match(match)

        if message == 'no PowerShell code found at all':
            match = None
        else:
            message = message.replace('`', '\'')

            # If the message contains a complaint about a function
            # and near looks like a function reference, remove the trailing
            # () so it can be found.
            if 'function \'' in message and near and near.endswith('()'):
                near = near[:-2]

        return match, line, col, error, warning, message, near

Example from CudaLint linter for Ruby. We override method because unrelated library files can throw errors, and we only want errors from the linted file.

python
    def split_match(self, match):
        if match:
            if match.group('file') != '-':
                match = None
        return super(Ruby,self).split_match(match)

Example from CudaLint linter for CSSLint. We override method so that general errors that do not have a line number can be placed at the beginning of the code.

python
    def split_match(self, match):
        match, line, col, error, warning, message, near = super().split_match(match)
        if line is None and message:
            line = 0
            col = 0
        return match, line, col, error, warning, message, near

Example from CudaLint linter for Haskell. We override method to ignore errors reported in imported files.

python
    def split_match(self, match):
        match, line, col, error, warning, message, near = super().split_match(match)
        match_filename = os.path.basename(match.groupdict()['filename'])
        if not match_filename.startswith('_CudaLint_'):
            return None, None, None, None, None, '', None
        return match, line, col, error, warning, message, near

CudaFormatter

CudaFormatter is plugin which uses 2nd-level plugins, "formatters", to change the source code. Each "formatter" supports one or more lexers, and provides one or more actions. For example, the Addon Manager contains two formatters for XML: XML IndentX and XML Pretty Print.

CudaFormatter is located in the "plugins" category of Addons Manager install list. 2nd-level "formatters" are located in the "formatter" category of Addons Manager install list.

For example, how to format code in XML?

Formatters may change the entire file text or only selected text. If selection is made, formatter changes only the selection, otherwise the entire text. And special formatters called "minifiers" puts the resulting text to a separate ui-tab.

CudaFormatter commands

Formatter (menu)
Runs formatter for current editor file. If several suitable formatters are found, menu-like dialog will suggest to choose one of them. If only single formatter is found, it will be run without confirmation.

Formatter per-lexer A...D
Runs formatter for current editor file, which has per-lexer label (A, B, C, D). Labels are configurable by another command. For example, for the label "B" you can have one formatter for C++, another formatter for HTML, and the 3rd one for CSS. All 3 formatters will be callable by the same command "Formatter per-lexer B".

Formatter cross-lexer 1...4
Runs formatter for current editor file, which has cross-lexer label (1, 2, 3, 4). For example, when you have a formatter XY assigned to the label "2", the command "Formatter cross-lexer: 2" always runs XY, ignoring the current lexer.

Minify to separate file
Finds the "minifier" formatter for the current lexer, and runs it. The resulting text is stored to separate file with name like "filename.min.css" (.css for CSS lexer). Command needs that some formatter for the current lexer is marked as "minifier" (in the formatter's install.inf file).

Configure on_save
Chooses which formatters are active on file saving. The first formatter, which is suitable for current lexer, and which has the flag "on_save" attached (via plugin configuration), will be used.

Configure per-lexer labels
Allows to assign per-lexer labels (A, B, C, D) to formatters. Labels allow to use commands "Formatter per-lexer A"..."Formatter per-lexer D", also via hotkeys.

Configure formatter
For those formatters which have configuration file, command will suggest to open global config file (in the folder "settings" of CudaText).

Configure formatter (local)
For those formatters which have configuration file, command will suggest to open "local" config (in the folder of current editor file). If local config not exists, plugin will suggest to create it from the global config.

How to run formatter ESLint on saving

You have package "formatter.JavaScript_JSON" installed and this package gives the formatter named "... ESLint" (for JavaScript lexer). How you can auto-run this formatter on saving?

Now for all documents with JavaScript (and "JavaScript Babel") lexer, file saving will call ESLint formatter. Note: ESLint handles only named files, and files which have ESLint configuration created in the file's folder. Document "(CudaText)/py/cuda_fmt_js/readme/readme.txt" tells more details.

How formatter can know filename

Some formatters need to know the processing filename and/or lexer. For example, ESLint formatter must know full filename, to make the temporary file there. How can formatter know it? Module "cuda_fmt" has submodule "fmtconfig", which has variables "ed_filename" and "ed_lexer". Python code:

from cuda_fmt import fmtconfig
fn = fmtconfig.ed_filename

External Tools

Introduction to External Tools

Plugin "External Tools" (ExtTools) can be installed from Addon Manager. It allows to run external programs, catch their output, and then it can:

Plugin adds "Tools" top menu (near "Plugins"), which has menu item "Config" to configure all tools (in the single dialog), and menu items to run all individual tools.

Some external tools configs are shown in the Wiki topics below. Enter these strings in the "Tool properties" dialog.

Plugin allows to customize hotkeys for all individual tools, or to use the single hotkey for different tools. The single hotkey is the hotkey of the plugin's command "Tools / Run main lexer tool". What is the "main lexer tool"? For example, you have 2 tools for lexer C++, and 3 tools for lexer HTML. You open the "Tool properties" dialog for some C++ tool, and press "Set main" button to mark that tool as "main" for C++. Then you open properties of some HTML tool, press "Set main" button to mark that tool as "main" for HTML. So now the "Tools / Run main lexer tool" can determine what is the main tool for C++ and HTML.

Notes:

Tool to compile by GCC

You can test how this tool works on any Linux, because GCC is preinstalled. Test the tool on C++ example, which is created from CudaText by menu "File / New from template / C++".

Properties:

Optionally, configure "Pattern", so double click in the Output panel will put caret to the source code. Example of GCC error line in the Output panel, it will be handled by double click: "new.cpp:10:3: error: 'zz' was not declared in this scope".

Tool to run C program

Tool is for Linux, so "File name" don't have an extension. For Windows, change "File name" field to "{FileNameNoExt}.exe".

Tool will catch the program output in the Output panel, program text input will not work.

Tool to run C program, on Windows, with input in terminal

Tool is for Windows, it allows to run compiled C/C++ program in new console window. Text input will work in this console.

Example C++ program:

c++
#include <stdio.h>
int main ()
{
  int c;
  puts ("Enter text. Include a dot ('.') in a sentence to exit:");
  do {
    c=getchar();
    putchar (c);
  } while (c != '.');
  return 0;
}

Tool props:

Tool to run C program, on Linux, with input in terminal

Tool is for Linux, it allows to run compiled C/C++ program in new terminal window. Text input will work in this terminal window.

Example C++ program:

c++
#include <stdio.h>
int main ()
{
  int c;
  puts ("Enter text. Include a dot ('.') in a sentence to exit:");
  do {
    c=getchar();
    putchar (c);
  } while (c != '.');
  return 0;
}

Tool props:

Tool to compile+run C program

In the External Tools dialog, press Join button, to join 2 tools created in above steps. Properties of joined tool:

Tool to run current Batch file

Tool properties:

Tool to compile by Free Pascal

This tool is for Free Pascal 3.x on Linux x64.

Properties:

Optionally, configure "Pattern", so double click in the Output panel will put caret to the source code. In the "Tool properties" dialog, press "Set" button near the "Pattern" and choose there ready preset for Free Pascal.

Tool to call file-compare utility

Tools, which call file-compare utility, to compare 2 files: active files in group-1 and group-2.

WinMerge, KDiff, Kompare

Meld

diff

Tool to run Python scripts

Tool to preview HTML file in Chrome

Tool to open PHP documentation with given topic

Tool to open PHP documentation, in .chm format, for the word under editor's caret. For Windows only. You need to install KeyHH from http://keyworks.helpmvp.com/ , it is stable tool mentioned on several sites. Program "keyhh.exe" will be in your system PATH.

Before making the tool, add "$" char to word chars for PHP lexer. To do it, call "Plugins / Options Editor", in the Options Editor dialog find option "word_chars" and set it to "$". You must save option to PHP lexer-specific config, so in the dialog you must check flag "For [x] Lexer", and choose lexer "PHP", and then write option value "$" and press Enter.

Download PHP documentation in .chm format from PHP.net, google for "php_manual_en chm", it is 16M file.

Tool properties:

Tool to open AutoIt documentation with given topic

Tool to open AutoIt documentation, in .chm format, for the word under editor's caret. For Windows only. You need to install KeyHH from http://keyworks.helpmvp.com/ , it is stable tool mentioned on several sites. Program "keyhh.exe" will be in your system PATH.

With AutoIt installed, you also have .chm documentation, its path is usually "C:\Program Files (x86)\AutoIt3\AutoIt.chm".

Tool properties:

Tool to open .chm documentation for all lexers

See above example about tool for PHP documentation. Create the similar tool

This tool needs renamed .chm files: for lexer AutoIt it needs "AutoIt.chm" and so on. It needs .chm files in a single folder relative to CudaText folder.

Tool for Google search

This is URL (special kind of tool). In the External Tools dialog, press the "URL" button, then press "Add" to add a new URL.

text
http://google.com/search?q={SelectedText|q}

Tool to open folder of current file in Windows Explorer

Tool properties:

Tool to go to current file in FreeCommander

Runner

Plugin Runner was written as an alternative to External Tools.

Many build-systems from Sublime Text 3 were packaged and put to add-on collection, search for add-on "Many Build Systems". Only few build-systems were packaged into own separate packages because they have big EXE/Binary files. Some ST3 plugins have build-systems paired with some Python code - they are not supported.

See the Runner documentation on GitHub.

Here is the GIF animation which shows reaction of Runner to PHP script running:

php
<?php
for($i=0; $i<10; $i++) {
    sleep(1);
    echo "$i is here\n";
}
?>

Runner limitation for input

If your Python script contains the input() function:

python
s=input('enter text: ')
print('entered:', s)

it will run with a runtime error like this:

enter text: Traceback (most recent call last):
  File "/home/user/a.py", line 3, in <module>
   s=input('enter text: ')
EOFError: EOF when reading a line

This is the limitation of the Runner plugin. To run your Python script in this case, you should call "ExTerminal" plugin (or "Terminal Plus" plugin), and enter there: "python3 myscript.py". And make sure, that ExTerminal prompt appeared in the proper folder, with your script.

Runner tool for C

Install the add-on "build-system: Many Build Systems from ST4". It supports C lexer using GCC compiler. It works on Linux/macOS out-of-the-box, on Windows you need the command "gcc" to be in the system PATH.

This build-system has 2 commands:

Example C file:

cpp
#include <stdio.h>
int main(){
  printf("Hello world");
  return 0;
}

Example output in the CudaText Output panel (Linux):

pascal
-- [10:34:08] Building: C via GCC: a.c
-- Command: gcc "/home/user/a.c" -o "/home/user/a" && "/home/user/a"
-- Working dir: /home/user
Hello world
-- Done (0.2s), return code: 0

Runner tool for C++

Install the add-on "build-system: C++ using G++". It supports C++ lexer using GNU C++ compiler. It works on Linux/macOS out-of-the-box, on Windows you need the command "g++" to be in the system PATH.

This build-system has 2 commands:

Example C++ file:

cpp
#include <iostream>

int main() {
    std::cout << "Hello World!";
    return 0;
}

Example output in the CudaText Output panel (Linux):

pascal
-- [16:41:55] Building: C++: new.cpp
-- Command: g++ -std=c++11 -Wall "/home/user/new.cpp" -o "/home/user/new" && "/home/user/new"
-- Working dir: /home/user
Hello World!
-- Done (0.8s), return code: 0

Runner tool for PHP

How to debug for example PHP file, with Runner. Create file "[CudaText]/data/buildsystems/php.sublime-build" with such text:

json
{
  "file_patterns": ["*.php"],
  "linux": {
    "cmd": ["php", "$file"]
  },
  "windows": {
    "cmd": ["C:\\PHP_folder\\php-win.exe", "$file"]
  }
}

Restart CudaText.

After opening a PHP file, call Runner main command "Build", that's it. It must show script output (in the Output panel) line-by-line, as it appears.

Example script to test:

php
<?php
for($i=0; $i<10; $i++) {
    sleep(1);
    echo "$i is here\n";
}
?>

Runner tool for Python

In Addons Mananger, install the add-on "buildsystem: Many Build Systems from ST4". It contains the Python build-system. It even contains 2 items in the build-system:

After opening a Python file, call Runner main command "Build", that's it. It must show script output (in the Output panel) line-by-line, as it appears.

Example script to test:

python
import time

for i in range(5):
    time.sleep(1)
    print(str(i) + " is here", flush=True)

Runner tool for Free Pascal

In Addons Manager, install the add-on "buildsystem: Free Pascal". It installs the file "[CudaText]/data/buildsystems/Free Pascal.sublime-build" with text like this:

json
{
  "file_patterns": ["*.pp", "*.pas"],
  "file_regex": "(.+?)\\((\\d+),(\\d+)\\)\\s(.+)$",
  "working_dir": "$file_path",
  "name": "Compile",
  "cmd": ["/home/user/fpcupdeluxe/fpcupdeluxe32/fpc/bin/x86_64-linux/fpc.sh", "$file_name"],
  "variants": [
    {
      "name": "Run",
      "cmd": ["./$file_base_name"]
    }
  ]
}

In this file, you need to adjust the path to "fpc.sh", according to your fpcupdeluxe folder. Restart CudaText.

After opening a Pascal file, call Runner main command "Build", that's it. The "Build" command example output:

pascal
-- [20:07:55] Building: Free Pascal: new.pas
-- Command: ['/home/user/fpcupdeluxe/fpcupdeluxe32/fpc/bin/x86_64-linux/fpc.sh', 'new.pas']
-- Working dir: /home/user
Free Pascal Compiler version 3.2.3-425-gebc55c0f4e-dirty [2021/09/09] for x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling new.pas
Linking new
3 lines compiled, 0.1 sec
-- Done (0.2s), return code: 0

The config above also gives the "Run" command for the compiled binary - in the menu of "Plugins / Runner / Build with...". The "Run" command example output:

pascal
-- [20:09:09] Building: Free Pascal: new.pas
-- Command: ['./new']
-- Working dir: /home/user
Hello world.
-- Done (-0.0s), return code: 0

Runner tool for Cobol

In Addons Manager, install the lexer "Cobol".

Let's make build-system for GnuCOBOL on Windows. Install GnuCOBOL, usually from this webpage, to "C:\GnuCOBOL". You must have file "C:\GnuCOBOL\bin\cobc.exe".

Create Batch script "c:\GnuCOBOL\bin\runcobol.cmd" with such content:

pascal
set Path=c:\gnucobol\bin
set COB_CONFIG_DIR=c:\gnucobol\config
set COB_COPY_DIR=c:\gnucobol\copy
set COB_INCLUDE_PATH=c:\gnucobol\include
set COB_LIB_PATH=c:\gnucobol\lib
cobc -x -std=mf %1

Create build-system file "[CudaText]\data\buildsystems\cobol.sublime-build":

json
{
  "file_patterns": ["*.cob", "*.cbl", "*.cpy"],
  "name": "Compile",
  "cmd": ["cmd.exe", "/c", "c:\\GnuCOBOL\\bin\\runcobol.cmd", "$file"],
  "working_dir": "$file_path",
  "file_regex": "^([^:]+):([0-9]+):",
  "variants": [
    {
      "name": "Run",
      "cmd": ["$file_path/$file_base_name.exe"]
    }
  ]  
}

Note: the build-system gives usual command "Build" and additional command "Run" to execute the .exe file, and "Run" has forward slash (Unix slash): "$file_path/$file_base_name.exe". Forward slash is required here, because with backslash Runner will fail to run the .exe (it will not expand the macro $file_base_name).

Now running the "Plugins / Runner / Build" can give text in the "Output panel" like this:

pascal
-- [07:49:02] Building: cobol: test.cbl
-- Command: ['cmd.exe', '/c', 'c:\\GnuCOBOL\\bin\\runcobol.cmd', 'C:\\Work\\test.cbl']
-- Working dir: C:\Work
pascal
C:\Work>set Path=c:\gnucobol\bin 
C:\Work>set COB_CONFIG_DIR=c:\gnucobol\config 
C:\Work>set COB_COPY_DIR=c:\gnucobol\copy 
C:\Work>set COB_INCLUDE_PATH=c:\gnucobol\include 
C:\Work>set COB_LIB_PATH=c:\gnucobol\lib 
C:\Work>cobc -x -std=mf C:\Work\test.cbl 
C:\Work\test.cbl:1: error: invalid indicator 'u' at column 7
C:\Work\test.cbl:2: warning: line not terminated by a newline [-Wmissing-newline]
C:\Work\test.cbl:3: warning: PROGRAM-ID header missing [-Wothers]
-- Done (0.3s), return code: 1

FindInFiles

This plugin implements searching in many files, starting from custom folder. CudaText doesn't have the built-in feature to search in many files, and seems it will not have it in future, because FindInFiles is so powerful, it even has the Configuration dialog with dozens of options.

Project Manager plugin allows to call FindInFiles functionality. Focus a folder in Project Manager, call context menu, and then "Selected directory / Find in directory..." menu item.

How to find/replace in all UI-tabs

FindInFiles 4 supports search inside all UI-tabs. Hover mouse over "From:" label in the dialog, tooltip will appear. Tooltip says what to enter in the nearest input-field. Enter one of these strings in the "From" field:

<tabs>
{t}

And in the "Files" field, enter "*" for all files.

To discover more features of FindInFiles dialog, hover mouse over other labels/buttons.

You can also replace in all UI-tabs, of course. To do it, fill all input fields in the FindInFiles main dialog, but instead of pressing "Find" - press "=" button and then choose "Replace with..." from appeared popup menu. Additional dialog will appear to confirm you replacement request, press "Replace" button there.

Additionally, CudaText gives built-in "Replace in all tabs" feature, it is the button "Rep global" in the built-in Find/Replace dialog. This is documented in the main CudaText wiki page.

How to use FindInFiles 4

FindInFiles v4 has two panels. Top panel shows found filenames, line by line. Bottom panel shows the entire document of one of the selected filenames. When you single click on a line of top panel, the bottom panel shows the content of a clicked file. When you double click the line again, the main editor of CudaText jumps to that location.

FiF3 and FiF4: comparison and future

CudaText has two plugins to search in files/tabs:

Important: FiF3 is almost frozen. Only serious bugs will be fixed. No plans to hide/delete FiF3. FiF4 supersedes FiF3.

Detailed comparison.

Common features:

Main new features:

Terminal

There are currently 3 terminal plugins:

Let's take ExTerminal plugin, and show how to perform some task with it, under Linux. Task: run Python script which uses 'input()' function. The simpest Terminal plugin cannot handle 'input()' function, but ExTerminal will work good. Let's take Python script with content:

python
x = int(input('Enter x: '))
w = int(input('Enter w: '))
print(x*w)

Steps:

Script should work and show 2 input-prompts.

user@user:~/myfolder$ ls *.py
a.py  test.py  tt.py
user@user:~/myfolder$ python3 tt.py
Enter x: 10
Enter w: 20
200

How to open ExTerminal in the directory of the current editor file? You can do this:

Configure Menu

Plugin "Configure Menu" (in Addons Manager) allows to change CudaText menus. You can add items to the CudaText top-menu, top menu submenu, editor context-menu, tab header context-menu and dropdown submenu of toolbar buttons. Plugin can create file (settings/menu.json) with default menu configuration, which you edit to customize all menus. File has items like:

json
  ,{"cap":"&Save", "cmd":"cmd_FileSave"}

How to add here built-in commands? See identifiers of CudaText commands in the file "py/cudatext_cmd.py", they have prefixes "cCommand_" (low level commands) and "cmd_" (high level commands). For example, "cmd_FileSave" is the command to save current file.

How to add here plugin commands? For example, you have plugin "Comments", it is in the folder "py/cuda_comments". See plugin's file install.inf, and find there needed Python methods. Then add in the "settings/menu.json" item like this:

json
  ,{"cap":"Toggle line comment", "cmd":"module=cuda_comments;cmd=cmt_toggle_line_body;"}

Here "cuda_comments" is plugin folder name, and "cmt_toggle_line_body" is Python method from install.inf.

You can add items to the CudaText top-menu and/or context-menu, it is different sections in "menu.json". Possible root sections in "menu.json" are listed in the API wiki page: CudaText_API#menu_proc_-_Menu_id.

Example screenshot shows how "menu.json" will look with new items for context-menu:

Example screenshot also shows tricks: how to write items for "External Tools" items and for "Macros" items: see lines with "cuda_exttools" and with "cuda_macros". Here they are:

json
    {"cap": "SomeToolName", "cmd": "module=cuda_exttools;cmd=run;info=174420;"}
   ,{"cap": "SomeMacroName", "cmd": "module=cuda_macros;cmd=run;info=87635;"}

These special lines need special integer IDs. You can find these IDs in the config files of both plugins: External Tools / Macros. For example, to find Extertal Tools IDs, open "settings/exttools.json". Here is a fragment of this file, which shows "id" value of the tool "C - compile":

json
{
    "ver": "20151209",
    "list": [
        {
            "id": 254653,
            "nm": "C - compile",
            "file": "gcc",
            "ddir": "{FileDir}",
            "shll": false,
            "prms": "\"{FileNameOnly}\" -o \"{FileNameNoExt}\"",
            "savs": "N",
            "rslt": "OP",
            "encd": "utf_8",
            "lxrs": "C,C++",
            "pttn": "(?P<file>[\\w\\.\\-]+):(?P<line>\\d+):(?P<col>\\d+):.+",
        },

Config Toolbar

Plugin allows to change the content of the main (horizontal) toolbar: hide standard buttons, add user buttons for any actions, customize icons and nesting of menu items.

For example, you installed two plugins:

And you want to call command "Apply bold" (from "Color Text") via toolbar. How to add such a button? Picture highlights your steps.

Intext Bookmarks

Plugin allows to place special marks, and to show Goto dialog for its special marks. These are not usual CudaText bookmarks, but text lines, which are recognized only by this plugin.

Plugin adds menu items in "Plugins / In-text Bookmarks":

"Special" lines are supported even for files without lexer, and files with lexer if lexer doesn't support comments. For such poor files, plugin will add special lines like "//NOTE: comment_text".

You can customize that special lines, using plugin configuration dialog: menu item "Options / Settings-plugins / In-text Bookmarks". Dialog gives such options:

That configuration means that for "poor" files (without lexer, or with lexer without line comments), plugin uses lines beginning with "//NOTE:" or "//NB!" or "//TODO:" etc. For files with rich lexers, plugin uses lexer's line-comment prefix.

Color Text

Plugin "Color Text" gives several commands (in the Plugins menu) to add coloring to text ranges. Plugin uses the selected text, without selection it uses word under first caret. On applying the coloring, plugin marks file as "modified". Plugin is suitable for files with any lexer, it adds its colors over the lexer highlight.

The data of coloring is saved to additional 'helper file' with extension .cuda-colortext, in the folder of the original file. After you delete this 'helper file', plugin will not load its data on next start.

Not only background color can be changed, but also border color, and font styles (bold, italic, stikeout). To specify colors/styles, you have to edit the plugin config file. To edit the config file, call menu item "Options / Settings-plugins / Color Text". Config file has sections for colors/styles, and usual options:

Insert Pics

CudaText gives the plugin API to show pictures between the text lines. These spaces between lines are called "gaps". Plugin "Insert Pics" exists to show picture files in gaps. It saves pictures in the helper files (using Base64 encoding), with extension .cuda-pic, near the original text file. Files with pictures look like this:

Complete From Text

Plugin allows to show auto-completion listbox with words from the current file (or all opened UI-tabs, by option). E.g. if you typed "op" and press Ctrl+Space (default auto-completion hotkey), it may suggest previously mentioned words "operations", "opinion", "option" etc. Plugin is not smart like "LSP Client" plugin, so expect lot of 'false positives' in its listbox.

In the picture above, one word was taken from C lexer's C.acp file (this is a feature).

Plugin is preconfigured to work with small set of lexers: none-lexer, Ini files, Markdown, reStructuredText, Properties. Here is how to use it for let's say "C" lexer:

Plugin has more options in that "plugins.ini" file:

Plugin supports CudaText option "nonword_chars", so for example words with '$' char are also added to completions, if CudaText option is configured so.

Embedded Editor

Plugin "Embedded Editor" shows "included" file in embedded editor - additional editor UI control is shown between the text lines. For example, you can open included CSS / JS files while editing the HTML file.

It adds menu item to show/hide embedded editor in the current document, for the current caret position: "Plugins / Embedded Editor / Toggle".

By default, plugin searches for the included filename inside double-quotes, surrounding the caret position. This works OK for HTML and many other documents.

For example, when you have opened file "/folder/file.html", and placed caret inside first double-quotes:

html
  <link href="css/style.css" rel="stylesheet" type="text/css"/>

then embedded editor will be opened for file "/folder/css/style.css".

The search can be configured, though. For example, plugin can be used in Pascal files for include-directives:

pascal
  {$I path/filename.inc}

Plugin has 2 config files, you will see 2 menu items in the "Options / Settings-plugins / Embedded Editor". Read more about config files in the readme.txt of plugin.

Breadcrumbs

Plugin "Breadcrumbs" shows the toolbar widget (modern name is breadcrumb bar) below or on top of the editor for quick file-system navigation. For example, when you have active editor with filename "/home/user/mydir/myfile.ext", widget shows buttons:

pascal
[ home / user / mydir / myfile.ext ]

It can also show the "~" button for the home directory (by option):

pascal
[ ~ / mydir / myfile.ext ]

Clicking on each button shows the popup with file-system listing, showing the folder containing the clicked item. This popup supports basic tree-view navigation, you can click files there to open them in CudaText.

Plugin can also show buttons for Code-Tree nodes. This must be enabled first in the config file - turn on the option "code_navigation". Clicking the buttons from the code-tree shows the same tree-popup but with a different content - with symbols of the documents. Clicking the nodes in the tree-popup scrolls the document to different symbols.

Spell Checker

Frequent question: how to make spell checking 'live', ie run it after each change? Do this:

Now checking should be 'live'. Note: it needs a pause after text editing (about 1 second), because it uses "on_change_slow" to avoid slowdown on editing.

LSP Client

Plugin "LSP Client" allows to use Microsoft LSP protocol in CudaText with servers for many languages. It requires that CudaText uses Python 3.6 or newer (otherwise you will see the error messagebox).

LSP Client gives several commands in the "Plugins / LSP Client", and all these commands work only if server supports them. Some of LSP commands are:

All LSP servers should have a homepage with description of their functions, and installation information.

In the server config "lsp_*.json", key "lexers", you need to specify the mapping between CudaText lexer names and LSP language names. For example, while CudaText lexer name is "Bash script", LSP language name is "bash". And while CudaText lexer name is "C#", LSP language name is "csharp".

json
{
  "lexers": {
    "C#": "csharp"
  },
  ...
}

LSP Client also has the settings file, use menu item to open it: "Options / Settings-plugins / LSP Client".

LSP server for Python

Project homepage is https://github.com/python-lsp/python-lsp-server . Note that this is fork of old, unmaintained, project "PyLS". Server supports:

Use "pip" to install the server:

pip install python-lsp-server\

This will expose the command "pylsp" on your PATH. Confirm that installation succeeded by running:

pylsp --help\

Create the file "[CudaText]/settings/lsp_py.json" with text like this:

json
{
  "lexers": {
    "Python": "python"
  },
  "cmd_windows": ["pylsp.exe"],
  "cmd_macos": ["pylsp"],
  "cmd_unix": ["pylsp"]
}

Open some Python script, and call some commands of LSP Client. It will run the server, and it should work.

LSP server for Python, pyright

1. Install the server:

pip install pyright

which pyright-langserver

It outputs on Ubuntu:

/home/user/.local/bin/pyright-langserver

/Applications/Python\ 3.10/Install\ Certificates.command

2. Create config (CudaText)/settings/lsp_pyright.json:

json
{
  "lexers": {
    "Python": "python"
  },
  "cmd_windows": ["pyright-langserver.exe", "--stdio"],
  "cmd_unix": ["/home/user/.local/bin/pyright-langserver", "--stdio"],
  "cmd_macos": ["/Library/Frameworks/Python.framework/Versions/3.10/bin/pyright-langserver", "--stdio"],
  "log_stderr": true
}

3. To disable type checking (which may be confusing), add key "settings" to the above config:

json
  "settings": {
    "python.analysis": {
      "typeCheckingMode": "off"
    }
  }

LSP server for JavaScript/ReactJS

npm install -g typescript typescript-language-server

json
{
    "name": "JavaScript",
    "lexers": {
        "JavaScript": "javascript",
        "JavaScript Babel": "javascriptreact"
    },
    "cmd_unix": [
        "typescript-language-server",
        "--stdio"
    ],
    "cmd_windows": [
        "typescript-language-server.cmd",
        "--stdio"
    ]
}

This assumes that "typescript-language-server" is in the PATH (it is true on Ubuntu). For Windows, you need to find the folder of "typescript-language-server.cmd" and add it to PATH.

LSP server for TypeScript

npm install -g typescript typescript-language-server

json
{
  "lexers": {
    "TypeScript": "ts"
  },
  "cmd_unix": [
    "typescript-language-server", 
    "--stdio" 
  ],
  "cmd_windows": [
    "typescript-language-server.cmd",
    "--stdio" 
  ]
}

This assumes that "typescript-language-server" is in the PATH (it is true on Ubuntu). For Windows, you need to find the folder of "typescript-language-server.cmd" and add it to PATH.

According to https://www.zeusedit.com/lsp/typescript.html, sometimes more complex config file may be needed. Here it is on Ubuntu:

json
{
  "lexers": {
    "TypeScript": "ts"
  },
  "cmd_unix": [
    "typescript-language-server", 
    "--stdio", 
    "--log-level=4", 
    "--tsserver-log-verbosity=verbose",
    "--tsserver-path=/usr/local/lib/node_modules/typescript/lib/"
  ],
  "cmd_windows": [
    "typescript-language-server.cmd",
    "--stdio", 
    "--log-level=4", 
    "--tsserver-log-verbosity=verbose",
    "--tsserver-path=\"%APPDATA%\\npm\\node_modules\\typescript\\lib\\\""
  ]
}

How did I get the last path? It may be different on different Linux'es. It is from the "node_modules" dir which contains the globally installed Node.js modules. I found it by running "which typescript-language-server", it gave "/usr/local/bin/typescript-language-server". Then I checked symlink target for "/usr/local/bin/typescript-language-server" - it points to the sub-dir of needed "node_modules".

Test the auto-completion on this "test.ts" file (with TypeScript lexer):

document.body.g

LSP server for C/C++

Install one of the servers following the instructions:

To use the server in LSP Client, create a file "lsp_c.json" in the "settings" directory with such content:

json
{
  "lexers": {
    "C++": "cpp",
    "C": "c"
  },
  "cmd_unix": [
      "clangd-12",
  ],
  "cmd_windows": [
      "clangd",
  ],
}

Replace "clangd*" with "ccls" if it was chosen.

On Windows: you must add the "bin" directory of mingw64 to the PATH so clangd is in the PATH.

LSP server for C#

First, install C# lexer from "Addons Manager".

1. Get OmniSharp server from GitHub https://github.com/OmniSharp/omnisharp-roslyn/releases . For Windows 64-bit it is the package "omnisharp-win-x64.zip" or "omnisharp-win-x64-net6.0.zip". Unzip this package to the folder "C:\OmniSharp", for example. It's not required to add that folder to system PATH.

2. You need to install MSBuild. As of May 2022, OmniSharp does not include MSBuild. Download link can be found at the bottom of this page: https://visualstudio.microsoft.com/downloads/?q=build+tools - see "Build Tools for Visual Studio 2022". In the installation check the following option: ".NET desktop build tools". If you won't install MSBuild, OmniSharp server will fail, see more info here: https://github.com/OmniSharp/omnisharp-vscode/issues/5120 .

3. Create LSP config file: (CudaText)/settings/lsp_cs.json:

json
{
  "lexers": {
    "C#": "csharp"
  },
  "cmd_windows": [
    "C:\\OmniSharp\\OmniSharp.exe", "-lsp", "-z"
  ]
}

Note that backslashes must be doubled (because of JSON format).

4. To test that server works: create a file "test.cs" (with C# lexer active). Call auto-completion after "date.A".

csharp
using System;

public class DateExample
{
    public static void Main()
    {
        DateTime  date;
        date.A
    }
}

LSP server for CSS/SCSS/LESS

The CSS (and SCSS, LESS) server is not easy to install, so here is the instruction, from the author of LSP Client:

json
{
    "compilerOptions": {
        "target": "es2018",
        "lib": [
            "es2018"
        ],
        "module": "commonjs",
        "strict": true,
        "alwaysStrict": true,
        "noImplicitAny": true,
        "noImplicitReturns": true,
        "noImplicitOverride": true,
        "noUnusedLocals": true,
        "noUnusedParameters": true,
        "forceConsistentCasingInFileNames": true,
        
        "outDir": "./out"
    },
  "files": [
      "src/node/cssServerMain.ts"
  ]
}

npm install
npm install -g typescript

npx tsc

Server should be compiled.

Create config file (CudaText)/settings/lsp_css.json:

json
{
    "name": "vsc-css",
    "lexers": {
        "CSS": "css",
        "SCSS": "scss",
        "Sass": "sass",
        "LESS": "less",
    },
    "cmd_unix": [
        "node",
        "path_to_server/server/out/node/cssServerMain.js",
        "--stdio"
    ]
}

LSP server for HTML

CudaText does not support built-in HTML auto-completion when caret is inside style="..." blocks. But LSP server supports it. Install server using Node.js:

npm install --global vscode-html-ls-bin

Make config file (CudaText)/settings/lsp_html.json:

json
{
    "lexers": {
        "HTML": "html",
    },
    "cmd_windows": ["html-ls.cmd", "--stdio"],
    "cmd_unix": ["html-ls", "--stdio"]
}

Make sure the script "html-ls" ("html-ls.cmd" on Windows) is in the PATH.

You may see wrong sorting of CSS properties in the auto-completion list, when auto-completion is called for CSS prop with dash char. To fix that, you need to remove dash char "-" from the "nonword_chars" option. Do it via lexer-specific config for HTML.

LSP server for Java

Part 1. Information for Windows.

java -version

It must show something like this:

java version "19.0.1" 2022-10-18
Java(TM) SE Runtime Environment (build 19.0.1+10-21)
Java HotSpot(TM) 64-Bit Server VM (build 19.0.1+10-21, mixed mode, sharing)

batch
@echo off
echo.
echo Usage: jLSP.cmd CacheDir
echo where "CacheDir" is an absolute path to your data directory. eclipse.jdt.ls stores workspace specific information in it. This should be unique per workspace/project.
echo.

:: language server installation folder (adjust to suit)
set Directory=C:/Java/jdt-language-server
:: language server jar file (update based on version file of jar)
set JarFile=%Directory%/plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar
:: language server config folder location
set Config=%Directory%/config_win

set CacheDir=%~1
echo Directory: %Directory%
echo   JarFile: %JarFile%
echo    Config: %Config%
echo  CacheDir: %CacheDir%

java -Dosgi.bundles.defaultStartLevel=4 -Declipse.product=org.eclipse.jdt.ls.core.product -Dlog.level=ALL -noverify -Xmx1G -jar %JarFile% -configuration %Config% --add-modules=ALL-SYSTEM --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED -data %CacheDir%
json
{
  "lexers": {
    "Java": "java"
  },
  "cmd_windows": ["C:\\Java\\jLSP.cmd", "./cache_for_proj1"]  
}

Use testing file "test.java". Place caret on last code line after "System.g" and call auto-completion.

java
public class Example {
    public static void main(String[] args) {
        System.g
    }
}

Part 2. Information for Linux.

On Ubuntu this command works (2022 year):

sudo apt install openjdk-17-jre-headless 

Then run in Console:

java -version

It must show something like this:

openjdk version "17.0.4" 2022-07-19
OpenJDK Runtime Environment (build 17.0.4+8-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 17.0.4+8-Ubuntu-120.04, mixed mode, sharing)

bash
#!/bin/bash
echo
echo Usage: jLSP.sh CacheDir
echo where "CacheDir" is an absolute path to your data directory. eclipse.jdt.ls stores workspace specific information in it. This should be unique per workspace/project.
echo

# language server installation folder (adjust to suit)
Directory=~/jdt-language-server
# language server jar file (update based on version file of jar)
JarFile=$Directory/plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar
# language server config folder location
Config=$Directory/config_linux

CacheDir=$1
echo Directory: $Directory
echo   JarFile: $JarFile
echo    Config: $Config
echo  CacheDir: $CacheDir

java -Dosgi.bundles.defaultStartLevel=4 -Declipse.product=org.eclipse.jdt.ls.core.product -Dlog.level=ALL -noverify -Xmx1G -jar $JarFile -configuration $Config --add-modules=ALL-SYSTEM --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED -data $CacheDir
json
{
  "lexers": {
    "Java": "java",
  },
  "cmd_unix": ["~/jLSP.sh", "./cache_for_proj1"],
}

Use testing file "test.java". Place caret on last code line after "System.g" and call auto-completion.

java
public class Example {
    public static void main(String[] args) {
        System.g
    }
}

LSP server for Nim

Server from https://github.com/PMunch/nimlsp works good.

Config file (CudaText)/settings/lsp_nim.json:

json
{
    "name": "nim-lsp",
    "lexers": {
        "Nim": "nim"
    },
    "cmd_unix": [
      "~/.nimble/bin/nimlsp"
    ]
}

LSP server for Rust

RLS server ( https://github.com/rust-lang/rls ) has been deprecated and is no longer supported. It has been replaced with Rust-analyzer. Users are encouraged to uninstall RLS and follow the instructions in the Rust-analyzer manual to install it. User needs to download binary file for his system: https://github.com/rust-lang/rust-analyzer#quick-start

Create config (CudaText)/settings/lsp_rust.json:

json
{
  "lexers": {
    "Rust": "rust"
  },
  "cmd_windows": ["rust-analyzer-x86_64-pc-windows-msvc.exe"],
  "cmd_unix": ["rust-analyzer-x86_64-unknown-linux-gnu"]
}

LSP server for AutoHotkey

npm install
npm install -g typescript

npx tsc

Server should be compiled now. To use the server in LSP Client, create the file "lsp_ahk.json" in the "settings" with such content:

json
{
    "name": "AutoHotkey2",
    "lexers": {
        "AutoHotkey": "ahk"
    },
    "cmd_unix": [
        "node",
        "path_to_server/server/out/server.js",
        "--stdio"
    ]
}

LSP server for Red

1) On Linux x64.

bash
#!/bin/bash
red ~/redlangserver/server.red
json
{
  "lexers": {
    "Red": "red"
  },
  "cmd_unix": ["redlangserver.sh"],
  "cmd_windows": ["c:\\red\\red.exe", "--cli", "c:\\red\\redlangserver\\server.red"]
}

Server should work now. It gives: mouse hover tooltips (Ctrl + mouse hovering over names), go to definition.

2) On Windows 10 x64.

Server should work now. It gives: mouse hover tooltips (Ctrl + mouse hovering over names), go to definition (works not always, logic when it works is unclear).

Note: don't create .bat or .cmd file with the "red.exe" calling, because it does not work in LSP Client for some reason.

LSP server for PHP

1. Install PHP, Composer. PHP versions 7.4.3 and 8.1 are OK.

2. Install php-dom extension. php-dom extension is the only needed for this server to work, and it must be installed before you run "composer update".

3. Clone Git repo https://github.com/zobo/php-language-server , and get the full path to the file "php-language-server.php", it will be needed in the next step. See readme "Installation" part, you must do some steps with Composer first, e.g. "composer update" inside php-language-server directory.

4. Create LSP config (CudaText)/settings/lsp_php.json:

json
{
    "name": "PHP",
    "lexers": {
        "PHP": "php"
    },
    "tcp_port": 12345,
    "cmd_unix": [
      "php",
      "folder_of_server/bin/php-language-server.php",
      "--tcp-server=127.0.0.1:12345"
    ],
    "cmd_windows": [
      "php",
      "D:\\programm\\php\\php-language-server\\bin\\php-language-server.php",
      "--tcp-server=127.0.0.1:12345"
    ]
}

Server should work now. It gives these features: https://github.com/zobo/php-language-server#features .

Auto-completion works, it is not working if you open .php file that is outside of current CudaText project directory. In LSP Client config there is a parameter named "root_dir_source". For zobo's server to index .php files they must be inside this dir. In CudaText Project Manager you must save your project file to your php project location, otherwise the root_dir will be wrong.

Note: on Windows, in rare cases hanging php.exe process can prevent LSP server from starting. If you see "ReadLoopError" in Console, try to kill all "php" processes and try again.

LSP server for Bash

json
{
    "lexers": {
        "Bash script": "bash"
    },
    "cmd_windows": ["bash-language-server.cmd", "start"],    
    "cmd_unix": ["bash-language-server", "start"]
}

LSP server for D

First, install D lexer from "Addons Manager".

1. Install DLang into "C:\D", for example. For 64-bit compiler, add folder "C:\D\dmd2\windows\bin64" to system PATH. Check that "dmd" and "dub" commands run OK from Windows console.

2. Install the LSP server, run from console:

dub fetch dls

This must show output like

C:\D>dub fetch dls
Fetching dls 0.26.2...
Please note that you need to use `dub run <pkgname>` or add it to dependencies of your package to actually use/run it. dub does not do actual installation of packages outside of its own ecosystem.

3. Compile the LSP server, run from console:

dub run dls:bootstrap

This must show output like

C:\D>dub run dls:bootstrap
Building package dls:bootstrap in C:\Users\user\AppData\Local\dub\packages\dls-0.26.2\dls\bootstrap\
Running pre-generate commands for dls:i18n...
Performing "debug" build using C:\D\dmd2\windows\bin64\dmd.exe for x86_64.
dls:protocol 0.26.2: building configuration "library"...
dls:i18n 0.26.2: building configuration "library"...
dls:bootstrap 0.26.2: building configuration "application"...
Linking...
Running ../Users/user/AppData/Local/dub/packages/dls-0.26.2/dls/bootstrap/dls_bootstrap.exe
C:\Users\user\AppData\Local\dub\packages\.bin\dls-latest\dls.exe

Copy to clipboard the last printed filename with dls.exe.

4. Create the CudaText LSP config: (CudaText)/settings/lsp_d.json. The dls.exe filename is from the previous step. Note: backslashes must be doubled (because of JSON format).

json
{
  "lexers": {
    "D": "dlang"
  },
  "cmd_windows": [
    "C:\\Users\\user\\AppData\\Local\\dub\\packages\\.bin\\dls-latest\\dls.exe", "--stdio"
  ]
}

5. Create test file "test.d" (with lexer D). Test that auto-completion works after "b.":

d
class A {int a; int a2;}
class B: A {int a3;}

void foo(B b)
{
    b.
}

LSP server for Go

Install lexer Go from "Addons Manager".

1. Install Go. Make sure that Go binary is in the system PATH, and GOPATH variable is also set.

2. Install the LSP server:

go install golang.org/x/tools/gopls@latest

In Ubuntu, this must create binary "gopls" in the folder "~/go/bin" (on Windows it may be "C:\Go\bin"), which is in the PATH. Check that "gopls" runs:

gopls version

It must give output like:

golang.org/x/tools/gopls v0.9.5
    golang.org/x/tools/gopls@v0.9.5 h1:F3TO5th6TUg40FHrpxZfMkMlVaaTmByeEvylgVHGH2A=

3. Create CudaText LSP config (CudaText)/settings/lsp_go.json:

json
{
  "lexers": {
    "Go": "go"
  },
  "cmd_unix": [
    "gopls" 
  ],
  "cmd_windows": [
    "gopls.exe"
  ]
}

4. See the content of GOPATH env variable, and create file "test.go" (with lexer Go) in that folder. Check that auto-completion works after "fmt.F":

go
package aa
import ("fmt")

func main() {
  fmt.F
}

LSP server for Lua

1. Install server for the command line from https://github.com/sumneko/lua-language-server . Find the full path of the file "lua-language-server" ("lua-language-server.exe" on Windows).

2. Create LSP config (CudaText)/settings/lsp_lua.json:

json
{
  "lexers": {
     "Lua": "lua"
  },
  "log_stderr": true,
  "cmd_windows": ["D:\\Programs\\lua-lsp\\bin\\lua-language-server.exe"],
  "cmd_unix": ["/path/to/lua-language-server"]
}

LSP server for Scala

Install lexer "Scala" from Addons Manager. Information for Windows.

1. Install Coursier: https://get-coursier.io/docs/cli-installation

2. Install Metals. Make sure "metals.bat" is in the system PATH.

cs install metals

3. Create LSP config file (CudaText)/settings/lsp_scala.json:

json
{
  "lexers": {
    "Scala": "scala"
  },
  "cmd_windows": ["metals.bat"]
}

Testing file for auto-completion:

object Hello extends App {
    println("Hello, world")
}

LSP server for Fortran

Install lexer "Fortran" from Addons Manager. Steps show how to use server on Linux (Ubuntu 20.04) with Python 3 installed.

1. Install the LSP server:

pip install fortran-language-server

Check that command runs OK:

fortls -?

And check its full path:

which fortls

Here it prints: "/home/user/.local/bin/fortls". We will need that full path in the next step, because short program name "fortls" gave errors for me.

2. Create LSP config file: (CudaText)/settings/lsp_fortran.json:

json
{
  "lexers": {
    "Fortran": "fortran"
  },
  "cmd_unix": [
      "/home/user/.local/bin/fortls" 
  ]
}

3. Make test file "test.for" (with Fortran lexer). Test auto-completion after "CALL myv".

fortran
PROGRAM myprog
USE test_free, ONLY: scaled_vector
TYPE(scaled_vector) :: myvec
CALL myv
END PROGRAM

LSP server for Markdown

1. Get precompiled Marksman LSP server from GitHub: https://github.com/artempyanykh/marksman/releases

2. On Windows, copy "marksman.exe" to some folder in PATH. On Linux, copy "marksman-linux" to this recommended folder in PATH: ~/.local/bin. Set executable permission for Linux binary.

chmod +x marksman-linux

3. Create config file (CudaText)/settings/lsp_md.json:

json
{
  "lexers": {
    "Markdown": "markdown"
  },
  "cmd_windows": ["marksman.exe"],
  "cmd_unix": ["marksman-linux"]
}

Now auto-completion / goto-definition / hover-tooltip must work on this "test.md" file:

md
[reference][abcd]
[reference][a123]

Some text.

[abcd]: url "title"
[a123]: url "title2"

LSP server for V

json
{
  "lexers": {
    "V": "v"
  },
  "cmd_windows": ["v-analyzer.exe"],
  "cmd_unix": ["v-analyzer"],
  "cmd_macos": ["v-analyzer"]
}

LSP server Vale

Steps for Windows OS.

json
{
    "lexers": {
        "": ""
    },
    
    "cmd_windows": ["vale-ls.exe"],
    "log_stderr": true,
    "settings": {
        "configPath": ""
    }
}

From the Free Pascal wiki, page "CudaText plugins", as it stood on 2024-05-05 after a change by Alextp, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 2, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.