The official Vim repository
This report summarizes scanner evidence for vim/vim, a Vim Script project with 41,178 GitHub stars. SynthScan examined 842,152 lines of code across 726 source files, recording 928 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 1.1 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 898 finding(s).
Are imports declared and package/API names verified? 26 finding(s).
Are wrappers, guards, and repeated structures necessary? 14 finding(s).
Which changes need focused human review? 928 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 928 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | runtime/tools/efm_perl.pl | 1 | #!/usr/bin/perl -w | COMMENT |
| LOW | runtime/tools/efm_perl.pl | 21 | # set errorformat=%f:%l:%m | COMMENT |
| LOW | runtime/tools/efm_perl.pl | 41 | # Version history: | COMMENT |
| LOW | runtime/tools/xcmdsrv_client.c | 21 | #include <string.h> | COMMENT |
| LOW | runtime/tools/demoserver.py | 1 | #!/usr/bin/python | COMMENT |
| LOW | runtime/tools/pltags.pl | 1 | #!/usr/bin/env perl | COMMENT |
| LOW | runtime/tools/ccfilter.c | 61 | { "HPUX", "HPUX's C compiler" } | COMMENT |
| LOW | runtime/tools/vimspell.sh | 1 | #!/bin/sh | COMMENT |
| LOW | runtime/doc/vim2html.pl | 1 | #!/usr/bin/env perl | COMMENT |
| LOW | runtime/syntax/testdir/tools/regenerate_screendumps.sh | 1 | #!/bin/sh -e | COMMENT |
| LOW | runtime/syntax/testdir/input/c.c | 21 | #if defined(MSWIN) && (!defined(FEAT_GUI_MSWIN) || defined(VIMDLL)) | COMMENT |
| LOW | …ntime/syntax/testdir/input/java_comments_markdown.java | 1 | // VIM_TEST_SETUP unlet! g:java_no_tab_space_error g:java_ignore_javadoc | COMMENT |
| LOW | …ntime/syntax/testdir/input/java_comments_markdown.java | 21 | /**/ /*/ */ /* /*/ /*/*/ /*//*/ /// Markdown comment tests. | COMMENT |
| LOW | …ntime/syntax/testdir/input/java_comments_markdown.java | 101 | static final String MARKDOWN_COMMENT_B = "///"; | COMMENT |
| LOW | …ntime/syntax/testdir/input/java_comments_markdown.java | 121 | /// public static void main(String[] args) { } | COMMENT |
| LOW | …ntime/syntax/testdir/input/java_comments_markdown.java | 141 | /// @see java.base/java.lang.Object#toString() | COMMENT |
| LOW | runtime/syntax/testdir/input/c_string_literal.c | 1 | // C string literals | COMMENT |
| LOW | runtime/syntax/testdir/input/sh_07.sh | 1 | #!/bin/dash | COMMENT |
| LOW | runtime/syntax/testdir/input/sh_06.sh | 61 | COMMENT | |
| LOW | .github/workflows/ci-windows.yml | 281 | src\vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-2.vim -c quit | COMMENT |
| LOW | .github/workflows/ci-windows.yml | 301 | COMMENT | |
| LOW | src/normal.c | 6681 | // changes one character, not all blanks until the start of | COMMENT |
| LOW | src/clientserver.c | 261 | # endif | COMMENT |
| LOW | src/clientserver.c | 761 | // lcd - | COMMENT |
| LOW | src/bufwrite.c | 1341 | // Try to make the backup in each directory in the 'bdir' option. | COMMENT |
| LOW | src/bufwrite.c | 1821 | // Make sure we don't write anything. | COMMENT |
| LOW | src/bufwrite.c | 2141 | // On VMS there is a problem: newlines get added when writing | COMMENT |
| LOW | src/bufwrite.c | 2201 | if (!checking_conversion || end == 0) | COMMENT |
| LOW | src/bufwrite.c | 2281 | errmsg = (char_u *)_(e_close_failed); | COMMENT |
| LOW | src/gui_dwrite.h | 101 | #ifdef __cplusplus | COMMENT |
| LOW | src/crypt.c | 201 | } sodium_state_T; | COMMENT |
| LOW | src/crypt.c | 221 | # define sodium_init load_sodium | COMMENT |
| LOW | src/diff.c | 21 | COMMENT | |
| LOW | src/diff.c | 41 | # define DIFF_INLINE_NONE 0x2000 // no inline highlight | COMMENT |
| LOW | src/optionstr.c | 41 | #endif | COMMENT |
| LOW | src/optionstr.c | 101 | NULL}; | COMMENT |
| LOW | src/optionstr.c | 141 | #ifdef FEAT_FOLDING | COMMENT |
| LOW | src/optionstr.c | 301 | check_string_option(&buf->b_p_inex); | COMMENT |
| LOW | src/option.c | 601 | // "utf-8" for 'encoding' should work best for most users. | COMMENT |
| LOW | src/option.c | 6601 | && strstr(*(char **)varp, "<lambda>") != NULL) | COMMENT |
| LOW | src/option.c | 7801 | #ifdef FEAT_SIGNS | COMMENT |
| LOW | src/installml.sh | 1 | #! /bin/sh | COMMENT |
| LOW | src/osdef.sh | 1 | #! /bin/sh | COMMENT |
| LOW | src/osdef.sh | 21 | # Make sure collation works as expected | COMMENT |
| LOW | src/osdef.sh | 41 | #ifdef HAVE_FCNTL_H | COMMENT |
| LOW | src/buffer.c | 1001 | #ifdef FEAT_EVAL | COMMENT |
| LOW | src/buffer.c | 2441 | } | COMMENT |
| LOW | src/buffer.c | 4101 | COMMENT | |
| LOW | src/gui_w32_rc.h | 1 | //{{NO_DEPENDENCIES}} | COMMENT |
| LOW | src/mouse.c | 661 | # if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \ | COMMENT |
| LOW | src/mouse.c | 2401 | // Only use ScreenCols[] after the window was redrawn. Mainly matters | COMMENT |
| LOW | src/mouse.c | 2701 | COMMENT | |
| LOW | src/gui.c | 141 | // hit an X11 I/O error and do a longjmp(), leaving recursive | COMMENT |
| LOW | src/gui.c | 461 | # endif | COMMENT |
| LOW | src/gui.c | 1481 | // the vertical line needs to be on the right half. | COMMENT |
| LOW | src/gui.c | 1801 | int screen_h; | COMMENT |
| LOW | src/gui.c | 3861 | #endif | COMMENT |
| LOW | src/term.c | 41 | # define TPUTSFUNCAST (void (*)(unsigned int)) | COMMENT |
| LOW | src/term.c | 201 | # ifndef HAVE_UP_BC_PC | COMMENT |
| LOW | src/term.c | 221 | // When the cursor shape was detected these values are used: | COMMENT |
| 800 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | runtime/syntax/testdir/tools/regenerate_screendumps.sh | 8 | # 4) Repeat steps 2) and 3) once or as many times as requested with the "$1" | COMMENT |
| HIGH | src/strings.c | 4025 | // truncate string if necessary as requested by precision | COMMENT |
| HIGH | src/strings.c | 4591 | // insert padding to the left as requested by min_field_width; | COMMENT |
| HIGH | src/strings.c | 4613 | // zero padding as requested by the precision or by the minimal | COMMENT |
| HIGH | src/strings.c | 4640 | // insert zero padding as requested by the precision or min | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | runtime/doc/insert.txt | 461 | Lorem ipsum (dolor | CODE |
| LOW | runtime/doc/insert.txt | 465 | Lorem ipsum (dolor) | CODE |
| LOW⚡ | runtime/doc/indent.txt | 683 | "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do | CODE |
| LOW⚡ | runtime/doc/indent.txt | 683 | "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do | CODE |
| LOW⚡ | runtime/doc/indent.txt | 689 | "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do | CODE |
| LOW⚡ | runtime/doc/indent.txt | 689 | "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do | CODE |
| LOW | src/session.c | 778 | // Use `bufhidden=wipe` to remove empty "placeholder" buffers once | COMMENT |
| LOW⚡ | src/gui_xmdlg.c | 716 | XmListCallbackStruct fake_data; | CODE |
| LOW⚡ | src/gui_xmdlg.c | 723 | fake_data.item = str; | CODE |
| LOW⚡ | src/gui_xmdlg.c | 725 | do_choice(0, data, &fake_data, ENCODING); | CODE |
| LOW | src/feature.h | 799 | // #define MODIFIED_BY "John Doe" | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | runtime/tools/demoserver.py | 20 | CODE | |
| LOW | src/testdir/test_makeencoding.py | 6 | CODE | |
| LOW | src/testdir/test_makeencoding.py | 6 | CODE | |
| LOW | src/testdir/test_channel_write.py | 7 | CODE | |
| LOW | src/testdir/test_channel_pipe.py | 7 | CODE | |
| LOW | src/testdir/test_channel_lsp.py | 8 | CODE | |
| LOW | src/testdir/test_channel.py | 8 | CODE | |
| LOW | src/testdir/test_channel_unix.py | 8 | CODE | |
| LOW | src/testdir/test_channel_dap.py | 8 | CODE | |
| LOW | src/testdir/test_netbeans.py | 8 | CODE | |
| LOW | src/testdir/test_netbeans.py | 10 | CODE | |
| LOW | src/testdir/test_netbeans.py | 11 | CODE | |
| LOW | src/testdir/python3/module.py | 1 | CODE | |
| LOW | src/testdir/python2/module.py | 1 | CODE | |
| LOW | src/testdir/python_after/after.py | 1 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/testdir/test_makeencoding.py | 39 | except IOError: | CODE |
| HIGH | src/testdir/test_channel_pipe.py | 35 | except Exception: | CODE |
| HIGH | src/testdir/test_channel_unix.py | 54 | except FileNotFoundError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/list.c | 312 | * It is not initialized, don't forget to set v_lock. | COMMENT |
| LOW | src/findfile.c | 37 | * with some new parameters. Don't forget to pass your old search context to | COMMENT |
| LOW | src/findfile.c | 235 | * Don't forget to clean up by calling vim_findfile_cleanup() if you are done | COMMENT |
| LOW | src/findfile.c | 753 | * stack with a list (don't forget to leave partly searched directories on the | COMMENT |
| LOW | src/alloc.c | 689 | * Initialize a growing array. Don't forget to set ga_itemsize and | COMMENT |
| LOW | src/memline.c | 4346 | * Don't forget to copy the mark! | COMMENT |
| LOW | src/version.c | 3456 | * When adding features here, don't forget to update the list of | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | runtime/tools/demoserver.py | 35 | class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): | CODE |
| LOW | src/testdir/test_channel_lsp.py | 22 | class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): | CODE |
| LOW | src/testdir/test_channel_lsp.py | 123 | def send_hdr_with_negative_len(self, msgid, resp_dict): | CODE |
| LOW | src/testdir/test_channel_lsp.py | 214 | def do_server_req_in_middle_resp(self, payload): | CODE |
| LOW | src/testdir/test_channel.py | 22 | class TestingRequestHandler(socketserver.BaseRequestHandler): | CODE |
| LOW | src/testdir/test_channel.py | 238 | class ThreadedTCPRequestHandler(TestingRequestHandler): | CODE |
| LOW | src/testdir/test_channel_unix.py | 27 | class ThreadedUnixRequestHandler(TestingRequestHandler): | CODE |
| LOW | src/testdir/thread_util.py | 57 | def _get_time_constraint_policy(default=False): | CODE |
| LOW | src/testdir/thread_util.py | 73 | def _set_time_constraint_policy(policy_info): | CODE |
| LOW | src/testdir/test_netbeans.py | 22 | class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | runtime/tools/pltags.pl | 56 | # Create a tag file line and push it on the list of found tags | COMMENT |
| MEDIUM | runtime/tools/pltags.pl | 75 | # Create a tag line | COMMENT |
| MEDIUM | runtime/syntax/testdir/input/sh_06.sh | 51 | # Create a backup using fbackup/frecover | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/vim.h | 1162 | #define ECMD_ADDBUF 0x10 // don't edit, just add to buffer list | COMMENT |
| MEDIUM | src/highlight.c | 4814 | // Temporarily utilize 28 more hl entries: | COMMENT |
| MEDIUM | src/testdir/test_channel_unix.py | 38 | # Signal the test harness we're ready, the port value has no meaning. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/debugger.c | 1178 | // We need to check if this line is actually executed in do_one_cmd() | COMMENT |
| LOW | src/regexp_bt.c | 3975 | // When we run into BACK we need to check if we don't keep | COMMENT |
| LOW | src/job.c | 861 | * Return TRUE if we need to check if the process of "job" has ended. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | runtime/tools/demoserver.py | 37 | CODE | |
| LOW | src/testdir/test_channel.py | 23 | CODE | |
| LOW | src/testdir/test_channel_dap.py | 90 | CODE | |
| LOW | src/testdir/test_netbeans.py | 24 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | runtime/tools/efm_perl.pl | 23 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/os_amiga.c | 697 | // TODO: implement | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/testdir/test_channel_pipe.py | 35 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/testdir/test_channel_dap.py | 77 | def handle_request(self, msg): | CODE |