NIPO ODIN Language
Everything you need to write, check, debug and hand off NIPO ODIN questionnaires in Visual Studio Code: language support that understands your script, a survey debugger you can step through as a respondent, and a one-click Word questionnaire for client sign-off.

- Understands your script. Completions, hover documentation, go to definition, references, rename, outline and call hierarchy, with questions, variables, lists and subroutines resolved by a real ODIN parser.
- Catches mistakes as you type. Syntax errors, undefined questions, overlapping data fields, unreachable code, with one-click fixes where there is a safe one.
- Shows the whole survey. Question flow, field position map, call graph, language comparison and a data dictionary, all updating live.
- Runs it. Press F5 to take the survey as a respondent, with breakpoints, variables, coverage and replayable scenarios.
- Hands it off. Export a client-ready Word questionnaire, in every language the script declares.
No account, licence or external runtime: the language server and debugger ship inside the extension.
Free, and maintained by one person. If it saves you hours, ☕ buy me a coffee, or support it as a team.
Writing ODIN
Syntax and semantic colouring
Commands, question numbers, field specs, strings, operators and comments are coloured as you type. Semantic colouring then tells question references, your variables, system variables, lists and subroutines apart, so a misspelled name stands out.

Completions
Type * for commands or ? for functions to get completions with a one-line description. Your own questions, variables, lists and subroutines are offered too, and parameter hints appear inside function calls such as ?DATETIMEADD(dt, interval).

Hover documentation
Hover any command, function or system variable for its reference entry, syntax included. Hover your own symbols for their type, where they are declared and how often they are used.

Inlay hints and code lenses
Inline hints show where a *GOTO lands (-> Q90), which line a *GOSUB calls (-> line 19) and how many choices a *USELIST brings in ((5 choices)). Code lenses above questions, lists and subroutines count their references; click one to list them.

Catching mistakes
Diagnostics
Problems appear in the editor and the Problems panel while you type:
- Syntax errors with ODIN-specific messages, such as a malformed command, a missing bracket or an option in the wrong place.
- Undefined references:
*GOTO 99 when there is no question 99, unknown variables and subroutines, duplicate declarations.
- Field positions: two questions writing the same data position, use of the system-reserved positions 1–60, positions beyond the Nfield maximum.
- Unreachable code after an unconditional
*END, *GOTO or *RETURN is dimmed, and questions whose *IF can never be true are flagged.

Quick fixes
When two questions share data positions, the lightbulb offers to move the field to the first free position. The suggestion accounts for every other question in the script, so the fix never creates a new overlap.

Navigating a script
| Feature |
Shortcut |
|
| Go to Definition |
F12 |
Jump to where a question, variable, list or subroutine is declared |
| Find All References |
Shift+F12 |
Every use of a symbol, lists included |
| Rename Symbol |
F2 |
Rename a symbol at its declaration and every use |
| Outline |
Explorer → Outline, Ctrl+Shift+O |
Questions, variables, lists, subroutines and blocks |
| Workspace Symbols |
Ctrl+T |
Find any question, variable, list or subroutine by name |
| Call Hierarchy |
Shift+Alt+H |
Who calls a subroutine, and what it calls |
| Document Links |
Ctrl+Click |
Follow *GOTO targets and *GOSUB names |


Code folding, sticky scroll and smart selection (Shift+Alt+→) all follow ODIN's structure: subroutines, questions, *IF / *ENDIF, *REPEAT, matrices, segments and sets.
Seeing the whole survey
Five panels, all from the Command Palette under ODIN:, and all refreshing as you edit. Click a question in any of them to jump to it in the script.
Question Flow (ODIN: Show Question Flow): every question in interview order with its type, plus routing, conditional and unreachable questions marked.

Field Position Map (ODIN: Show Field Position Map): every data position the script writes, coloured per question, with overlaps in red and a summary table.

Call Graph (ODIN: Show Call Graph): the subroutine call tree with reference counts.

Language Comparison (ODIN: Show Language Comparison): each *LANGUAGE overlay side by side, with missing translations counted.

Data Dictionary (ODIN: Export Data Dictionary): a searchable table of every question, variable, list and subroutine, exportable to Excel (one sheet per symbol kind).

Survey Debugger
Press F5 on an open .odin file. The script runs as a respondent would see it: each question appears in a side panel that follows your editor theme, you answer it, and routing is evaluated exactly as written. The usual debug controls work: Continue (F5), Step Over (F10), Step Into a *GOSUB (F11), Step Out (Shift+F11), breakpoints and the Variables, Watch and Call Stack views.

Matrices render as a grid, one row per statement:

What you can do
- Inspect state. The Variables view lists every variable the script has written, in your casing. Hover a question or variable in the source while paused to see its value.
- Conditional breakpoints. Add a condition such as
Q1 = 1 & _REPEAT = 3 to a breakpoint and it only pauses when that holds.
- Watch expressions.
Q5 IN [1,2,3] or LANGUAGE = "FR" are evaluated at every pause.
- Save and replay scenarios.
ODIN: Save Scenario records every answer so far to <script>.scenarios/<name>.json. ODIN: Run Scenario replays it after you change the script; if the script no longer matches the recording, the debugger stops at the first unknown question and lets you take over. Commit scenarios next to the script and they become regression tests.
- Preview languages. For multi-language scripts, pick the language at launch or switch with
ODIN: Change Preview Language. *SWILANG answers switch it too, so *IF [LANGUAGE = "FR"] routing is exercised.
- Reproducible randomisation. Pin a
seed in launch.json for *RANDOM / *ROT orders, or re-shuffle mid-session with ODIN: Reseed Session.
- Coverage. Visited lines are marked in the gutter, and the Coverage tab counts questions visited and
*IF branches taken.

At *END the panel shows a summary of the session, with buttons to save it as a scenario, restart or close.

Configuring launch.json
F5 works without any configuration. To keep settings, add an ODIN: Launch configuration under Run and Debug:
{
"type": "odin",
"request": "launch",
"name": "Debug ODIN Script",
"program": "${file}",
"stopAtEntry": true
}
| Field |
Type |
Purpose |
seed |
integer |
Seed for *RANDOM / *ROT ordering (default 42) |
language |
string |
Preview language, e.g. "FR"; empty uses the primary content |
externals |
array |
Values for variables the script uses but doesn't declare (sample fields, quota flags): {name, kind: "code" \| "numeric" \| "open", value} |
scenario |
object |
A saved scenario to replay |
trace |
"compact" | "verbose" |
Debug Console detail; verbose adds assignments, shuffle orders and *GOSUB / *REPEAT scopes |
If the script references variables it never declares (such as _AGE or QUOTA_FULL) and externals doesn't cover them, the debugger asks for values in a form before the first question.
Limits
The debugger evaluates the questionnaire's logic, not the fieldwork system around it: quotas, sample management, *DOFILE and *EXTERN are skipped with a note in the Debug Console. Some string functions inside *IF conditions (?STRLENGTH, ?STRINDEX) are not evaluated yet and count as false.
Client Questionnaire (Word)
Turn the script into a Word document a client can read and approve before fieldwork. Run ODIN: Export Client Questionnaire (Word), choose the language, and pick where to save. ODIN: Export Client Questionnaire — All Languages writes one document per *LANGUAGE in one go.


The document has a cover page, sections taken from your ** SECTION comments, every question with its answer list, routing written as plain English ("Asked if Q5 = Yes"), randomisation and other instructions as notes, matrices as grids, and a footer with project, version and page numbers. *DUMMY questions are left out.
Fill in the cover page with directives in the first 50 lines of the script:
** @word.doc.title: Coffee Habits 2026
** @word.doc.client: Acme Brands
** @word.doc.project: 2604-COFFEE
** @word.doc.version: v0.4 DRAFT
** @word.doc.date: 28 April 2026
** @word.doc.prepared_by: Anteras Research
** @word.doc.confidentiality: Confidential
Anything missing falls back to the file name, today's date and DRAFT.
What's New after updates
When an update adds features (a new minor or major version), a What's New page opens once with that release's highlights, plus links to this page and the full changelog. Bug-fix releases never open it. Turn it off with the odin.whatsNew.showOnUpdate setting, or the link on the page itself; ODIN: Show What's New brings it back any time.

Commands
| Command |
|
ODIN: Show Question Flow |
Question Flow panel |
ODIN: Show Field Position Map |
Field Position Map panel |
ODIN: Show Call Graph |
Call Graph panel |
ODIN: Show Language Comparison |
Language Comparison panel |
ODIN: Export Data Dictionary |
Data Dictionary panel |
ODIN: Run Full Diagnostics |
Re-check the open script now |
ODIN: Export Client Questionnaire (Word) |
Word document for one language |
ODIN: Export Client Questionnaire — All Languages |
One Word document per language |
ODIN: Save Scenario / ODIN: Run Scenario |
Record and replay debug sessions |
ODIN: Change Preview Language / ODIN: Reseed Session |
During a debug session |
ODIN: Show What's New |
Release highlights |
ODIN: Get Started |
The getting-started walkthrough |
ODIN: Report Issue or Send Feedback |
Pre-filled bug report, wrong-diagnostic report or idea |
ODIN: Support ODIN (Buy Me a Coffee) |
Support the project |
Getting started
- Install the extension. The Get started with NIPO ODIN walkthrough opens to show you around;
ODIN: Get Started reopens it.
- Open a folder with your
.odin scripts. UTF-8 and UTF-16 files (as Nfield exports them) both work.
- Start editing, or press F5 to run the script.
Requires Visual Studio Code 1.85 or later on Windows, macOS (Intel or Apple silicon) or Linux (x64 or Arm64).
Known limitations
- Analysis is per file: references into other files (for example
*MERGE targets) are not resolved.
Feedback and bug reports
Found a bug, or a diagnostic that's wrong? Run ODIN: Report Issue or Send Feedback, or click the lightbulb on any ODIN diagnostic and choose Report this diagnostic as wrong. Either one opens a pre-filled report with your extension and VS Code versions. The script isn't attached: the only code included is the flagged line, and only after you've seen it and agreed.
Support the project
This extension is free, with no account, licence or telemetry, and it's built and maintained by one person. That includes the parser, the language server, the survey debugger and the Word export, checked against more than 1,500 real Nfield scripts so the diagnostics match what Nfield accepts.
If it saves you time, a coffee keeps it going. If your team uses it every day, a monthly membership helps even more: it pays for the next Nfield change, grammar gap and feature.
For agencies: the Team membership lists your company in this section if you'd like, and your bug reports and wrong-diagnostic reports are looked at first. Buy Me a Coffee emails a receipt for every payment.

On a work machine? Scan to support from your phone:
How the extension asks. Word export and preview results carry a ☕ Support ODIN button beside their own actions, and the debugger's end-of-session screen and the What's New page show the same button with the QR code. Now and then, after a milestone such as your 5th Word export or the 25th problem ODIN flagged that you then fixed, it asks once in a message. It asks at most once every 60 days, and Don't ask again turns off both the asks and the buttons in messages for good. Everything it counts stays on your machine.
Copyright © 2026 Antonio Rodriguez (arodriguez@anteras.org). All rights reserved. See LICENSE for terms.