nvim-cmp source for many Symfony completions:
- Behat steps
- HTML classes
- Symfony form options
- Symfony routes
- Symfony translations
- Twig constants
- Twig filters and functions
- Twig templates
- fd for twig templates
- jq for form options
- nvim-treesitter for form options (with PHP parser)
- ripgrep to search for behat steps, constants, filters and functions
require('cmp').setup({
sources = {
{ name = 'behat' },
{ name = 'form_options' },
{ name = 'html_class' },
{ name = 'symfony_routes' },
{ name = 'symfony_translations' },
{ name = 'twig' },
{ name = 'twig_constants' },
{ name = 'twig_templates' },
},
})Steps located in vendor and behat directories are handled.
Steps are refreshed every 60 seconds.
The plugin is activated for cucumber filetype.
The trigger characters are n and d. This covers
Given, When, Then, And keywords.
Form option completion.
The completion is based on a file named autocomplete_form_type.json
at the root of the project. It consists of a JSON array for each
FormType as key and all available options as values.
This file is obtained iterating over the results of:
bin/console debug:form --format json # gets all form types
bin/console debug:form --format json ChoiceType # for each for typeHere is the script I'm using to create this file:
View script
#!/usr/bin/env bash
function create_json() {
echo "$1" | jq -c '{
(."class" | split("\\") | last): (
[
.class as $class |
(.options.own // [] | map({(.): $class}) | add) as $own |
(.options.overridden // {} | to_entries | map({key: .value[], value: .key}) | from_entries) as $overridden |
(.options.parent // {} | to_entries | map({key: .value[], value: .key}) | from_entries) as $parent |
(.options.extension // {} | to_entries | map({key: .value[], value: .key}) | from_entries) as $extension |
$own + $overridden + $parent + $extension
] | add
)
}'
}
json=$(docker compose run --rm franken-cli bin/console debug:form --format json)
echo "" > /tmp/autocomplete_form_type.json
builtin_types=$(echo "$json" | jq -r ".builtin_form_types[]")
service_types=$(echo "$json" | jq -r ".service_form_types[]")
builtin_types_count=$(echo "$builtin_types" | wc -l)
service_types_count=$(echo "$service_types" | wc -l)
counter=0
echo "[INFO] Creating builtin types"
for builtin_type in $builtin_types; do
counter=$((counter+1))
echo "$counter/$builtin_types_count: $builtin_type"
json=$(docker compose exec franken bin/console debug:form --format json "$builtin_type")
create_json "$json" >> /tmp/autocomplete_form_type.json
done
counter=0
echo "[INFO] Creating service types"
for service_type in $service_types; do
counter=$((counter+1))
echo "$counter/$service_types_count: $service_type"
json=$(docker compose exec franken bin/console debug:form --format json "$service_type")
create_json "$json" >> /tmp/autocomplete_form_type.json
done
jq --slurp 'add' /tmp/autocomplete_form_type.json > ./autocomplete_form_type.jsonThis is rather hard to maintain, so duplicated FormType are not preserved.
The plugin is activated for php filetypes.
The trigger character is a single quote, and the current buffer must extends AbstractType.
The completion is triggered only on the left side of =>.
This plugin autocompletes class tags using a pre-generated json file.
A json file must be generated first. It contains one json object per line, with two keys:
- class: the html class to autocomplete
- files: a json array containing all files where this class is defined
Here is an example:
{"class":"my-first-class","files":["/path/to/file.css","/path/to/file.min.css"]}
{"class":"my-second-class","files":["/path/to/file.css"]}The file is generated with this bash script:
View script
#!/usr/bin/env bash
temp_dir=$(mktemp -d)
# Get all classes in css files, in json format, then use jq to get all matching
# results and format them: {"class":"my-first-class","file":"/path/to/file.css"}
rg "\.[a-z][a-z0-9-]{3,}" -tcss --no-filename --json assets | jq -c '.
| select(.type == "match")
| {class: .data.submatches[].match.text, file: .data.path.text}' > $temp_dir/raw.json
# Sort and uniq input file
cat $temp_dir/raw.json | sort | uniq > $temp_dir/uniq.json
# Group results by class name and add a files key containing all files
cat $temp_dir/uniq.json | jq -sc 'map(. + {data: [{class: [.class], file: [.file]}]})
| group_by(.class)[]
| .[0] + {files: [.[].data[].file | add]}
| del (.data, .file)' > $temp_dir/grouped.json
# Remove trailing dot in class name
sed -i 's/"\./"/' $temp_dir/grouped.json
mv $temp_dir/grouped.json ~/generated_html_classes.jsonThe plugin is activated for twig and html filetypes.
Autocompletion is triggered for double quotes and space
characters.
The source is using ./var/cache/dev/url_generating_routes.php file.
This plugin is a very simple implementation, the autocomplete won't work if the above file doesn't exist.
Routes are refreshed every 30 seconds.
The plugin is activated for php and twig filetypes.
The trigger character is a single quote, and the line must contains
route, path or url. This covers most of Symfony and twig
functions used to generate URLs:
- PHP
- redirectToRoute
- $router->generate
- Twig
- path
- url
The source is using ./var/cache/dev/translations/catalog.fr.SHA1.php file.
This plugin the autocomplete won't work if the above file doesn't exist.
Translations are refreshed every 60 seconds.
- completes translation domains
- documentation displays full french translation value
->addFlashonly displaysflashes_messagestranslationsmessageattribute only displaysvalidatorstranslations
The plugin is activated for php and twig filetypes.
The trigger character is a single quote, and the line must contains
trans, addflash, message:, 'label' => or 'choice_label' =>. This covers most of Symfony and twig
translation functions:
- PHP
- $translation->trans
- $this->addFlash
- message attribute for validators
- form labels
- Twig
- ''|trans({}, '')
This plugin autocompletes PHP constants located in src directory for twig.
Output is:
constant('App\\Voter\\MyVoter::CAN_EDIT')Constants are refreshed every 60 seconds.
The plugin is activated for twig filetype only.
The trigger character is a single quote, and the line must contains constant or enum.
This plugin autocompletes twig filters and functions located in
src directory.
The native filters and functions are also available.
Filters and functions are refreshed every 30 seconds.
The plugin is activated for twig filetype.
There are three trigger characters:
- pipe triggers filters completion
- space and open parenthesis trigger functions completion
Autocompletes twig templates located in project directory /templates.
Templates are refreshed every 30 seconds.
The plugin is activated for php and twig filetypes.
The trigger character is a single quote, and the line must contains
render or include. This covers most of Symfony and twig
functions used to generate URLs:
- PHP
- render
- renderView
- Twig
- include








