vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

systemd.lua

(7951B)


      1 -- Copyright 2016-2025 Christian Hesse. See LICENSE.
      2 -- systemd unit file LPeg lexer.
      3 
      4 local lexer = lexer
      5 local P, S = lpeg.P, lpeg.S
      6 
      7 local lex = lexer.new(..., {lex_by_line = true})
      8 
      9 -- Keywords.
     10 lex:add_rule('keyword', lex:tag(lexer.KEYWORD, lex:word_match(lexer.KEYWORD)))
     11 
     12 -- Options.
     13 lex:add_rule('option', lex:tag(lexer.PREPROCESSOR, lex:word_match(lexer.PREPROCESSOR)))
     14 
     15 -- Identifiers.
     16 lex:add_rule('identifier',
     17 	lex:tag(lexer.IDENTIFIER, (lexer.alpha + '_') * (lexer.alnum + S('_.'))^0))
     18 
     19 -- Strings.
     20 local sq_str = lexer.range("'")
     21 local dq_str = lexer.range('"')
     22 lex:add_rule('string', lex:tag(lexer.STRING, sq_str + dq_str))
     23 
     24 -- Sections.
     25 lex:add_rule('section', lex:tag(lexer.LABEL, '[' * lex:word_match(lexer.LABEL) * ']'))
     26 
     27 -- Comments.
     28 lex:add_rule('comment', lex:tag(lexer.COMMENT, lexer.starts_line(lexer.to_eol(S(';#')))))
     29 
     30 -- Numbers.
     31 local integer = S('+-')^-1 * (lexer.hex_num + lexer.oct_num_('_') + lexer.dec_num_('_'))
     32 lex:add_rule('number', lex:tag(lexer.NUMBER, lexer.float + integer))
     33 
     34 -- Operators.
     35 lex:add_rule('operator', lex:tag(lexer.OPERATOR, '='))
     36 
     37 -- Word lists
     38 lex:set_word_list(lexer.KEYWORD, {
     39 	-- Boolean values.
     40 	'true', 'false', 'on', 'off', 'yes', 'no',
     41 	-- Service types.
     42 	'forking', 'simple', 'oneshot', 'dbus', 'notify', 'idle',
     43 	-- Special system units.
     44 	'basic.target', 'ctrl-alt-del.target', 'cryptsetup.target', 'dbus.service', 'dbus.socket',
     45 	'default.target', 'display-manager.service', 'emergency.target', 'exit.target', 'final.target',
     46 	'getty.target', 'graphical.target', 'hibernate.target', 'hybrid-sleep.target', 'halt.target',
     47 	'initrd-fs.target', 'kbrequest.target', 'kexec.target', 'local-fs.target', 'multi-user.target',
     48 	'network-online.target', 'paths.target', 'poweroff.target', 'reboot.target', 'remote-fs.target',
     49 	'rescue.target', 'initrd-root-fs.target', 'runlevel2.target', 'runlevel3.target',
     50 	'runlevel4.target', 'runlevel5.target', 'shutdown.target', 'sigpwr.target', 'sleep.target',
     51 	'slices.target', 'sockets.target', 'suspend.target', 'swap.target', 'sysinit.target',
     52 	'syslog.socket', 'system-update.target', 'timers.target', 'umount.target',
     53 	-- Special system units for devices.
     54 	'bluetooth.target', 'printer.target', 'smartcard.target', 'sound.target',
     55 	-- Special passive system units.
     56 	'cryptsetup-pre.target', 'local-fs-pre.target', 'network.target', 'network-pre.target',
     57 	'nss-lookup.target', 'nss-user-lookup.target', 'remote-fs-pre.target', 'rpcbind.target',
     58 	'time-sync.target',
     59 	-- Specail slice units.
     60 	'-.slice', 'system.slice', 'user.slice', 'machine.slice',
     61 	-- Environment variables.
     62 	'PATH', 'LANG', 'USER', 'LOGNAME', 'HOME', 'SHELL', 'XDG_RUNTIME_DIR', 'XDG_SESSION_ID',
     63 	'XDG_SEAT', 'XDG_VTNR', 'MAINPID', 'MANAGERPID', 'LISTEN_FDS', 'LISTEN_PID', 'LISTEN_FDNAMES',
     64 	'NOTIFY_SOCKET', 'WATCHDOG_PID', 'WATCHDOG_USEC', 'TERM'
     65 })
     66 
     67 lex:set_word_list(lexer.PREPROCESSOR, {
     68 	-- Unit section.
     69 	'Description', 'Documentation', 'Requires', 'Requisite', 'Wants', 'BindsTo', 'PartOf',
     70 	'Conflicts', 'Before', 'After', 'OnFailure', 'PropagatesReloadTo', 'ReloadPropagatedFrom',
     71 	'JoinsNamespaceOf', 'RequiresMountsFor', 'OnFailureJobMode', 'IgnoreOnIsolate',
     72 	'StopWhenUnneeded', 'RefuseManualStart', 'RefuseManualStop', 'AllowIsolate',
     73 	'DefaultDependencies', 'JobTimeoutSec', 'JobTimeoutAction', 'JobTimeoutRebootArgument',
     74 	'StartLimitInterval', 'StartLimitBurst', 'StartLimitAction', 'RebootArgument',
     75 	'ConditionArchitecture', 'ConditionVirtualization', 'ConditionHost', 'ConditionKernelCommandLine',
     76 	'ConditionSecurity', 'ConditionCapability', 'ConditionACPower', 'ConditionNeedsUpdate',
     77 	'ConditionFirstBoot', 'ConditionPathExists', 'ConditionPathExistsGlob',
     78 	'ConditionPathIsDirectory', 'ConditionPathIsSymbolicLink', 'ConditionPathIsMountPoint',
     79 	'ConditionPathIsReadWrite', 'ConditionDirectoryNotEmpty', 'ConditionFileNotEmpty',
     80 	'ConditionFileIsExecutable', 'AssertArchitecture', 'AssertVirtualization', 'AssertHost',
     81 	'AssertKernelCommandLine', 'AssertSecurity', 'AssertCapability', 'AssertACPower',
     82 	'AssertNeedsUpdate', 'AssertFirstBoot', 'AssertPathExists', 'AssertPathExistsGlob',
     83 	'AssertPathIsDirectory', 'AssertPathIsSymbolicLink', 'AssertPathIsMountPoint',
     84 	'AssertPathIsReadWrite', 'AssertDirectoryNotEmpty', 'AssertFileNotEmpty',
     85 	'AssertFileIsExecutable', 'SourcePath',
     86 	-- Install section.
     87 	'Alias', 'WantedBy', 'RequiredBy', 'Also', 'DefaultInstance',
     88 	-- Service section.
     89 	'Type', 'RemainAfterExit', 'GuessMainPID', 'PIDFile', 'BusName', 'BusPolicy', 'ExecStart',
     90 	'ExecStartPre', 'ExecStartPost', 'ExecReload', 'ExecStop', 'ExecStopPost', 'RestartSec',
     91 	'TimeoutStartSec', 'TimeoutStopSec', 'TimeoutSec', 'RuntimeMaxSec', 'WatchdogSec', 'Restart',
     92 	'SuccessExitStatus', 'RestartPreventExitStatus', 'RestartForceExitStatus', 'PermissionsStartOnly',
     93 	'RootDirectoryStartOnly', 'NonBlocking', 'NotifyAccess', 'Sockets', 'FailureAction',
     94 	'FileDescriptorStoreMax', 'USBFunctionDescriptors', 'USBFunctionStrings',
     95 	-- Socket section.
     96 	'ListenStream', 'ListenDatagram', 'ListenSequentialPacket', 'ListenFIFO', 'ListenSpecial',
     97 	'ListenNetlink', 'ListenMessageQueue', 'ListenUSBFunction', 'SocketProtocol', 'BindIPv6Only',
     98 	'Backlog', 'BindToDevice', 'SocketUser', 'SocketGroup', 'SocketMode', 'DirectoryMode', 'Accept',
     99 	'Writable', 'MaxConnections', 'KeepAlive', 'KeepAliveTimeSec', 'KeepAliveIntervalSec',
    100 	'KeepAliveProbes', 'NoDelay', 'Priority', 'DeferAcceptSec', 'ReceiveBuffer', 'SendBuffer',
    101 	'IPTOS', 'IPTTL', 'Mark', 'ReusePort', 'SmackLabel', 'SmackLabelIPIn', 'SmackLabelIPOut',
    102 	'SELinuxContextFromNet', 'PipeSize', 'MessageQueueMaxMessages', 'MessageQueueMessageSize',
    103 	'FreeBind', 'Transparent', 'Broadcast', 'PassCredentials', 'PassSecurity', 'TCPCongestion',
    104 	'ExecStartPre', 'ExecStartPost', 'ExecStopPre', 'ExecStopPost', 'TimeoutSec', 'Service',
    105 	'RemoveOnStop', 'Symlinks', 'FileDescriptorName',
    106 	-- Mount section.
    107 	'What', 'Where', 'Type', 'Options', 'SloppyOptions', 'DirectoryMode', 'TimeoutSec',
    108 	-- Path section.
    109 	'PathExists', 'PathExistsGlob', 'PathChanged', 'PathModified', 'DirectoryNotEmpty', 'Unit',
    110 	'MakeDirectory', 'DirectoryMode',
    111 	-- Timer section.
    112 	'OnActiveSec', 'OnBootSec', 'OnStartupSec', 'OnUnitActiveSec', 'OnUnitInactiveSec', 'OnCalendar',
    113 	'AccuracySec', 'RandomizedDelaySec', 'Unit', 'Persistent', 'WakeSystem', 'RemainAfterElapse',
    114 	-- Exec section.
    115 	'WorkingDirectory', 'RootDirectory', 'User', 'Group', 'SupplementaryGroups', 'Nice',
    116 	'OOMScoreAdjust', 'IOSchedulingClass', 'IOSchedulingPriority', 'CPUSchedulingPolicy',
    117 	'CPUSchedulingPriority', 'CPUSchedulingResetOnFork', 'CPUAffinity', 'UMask', 'Environment',
    118 	'EnvironmentFile', 'PassEnvironment', 'StandardInput', 'StandardOutput', 'StandardError',
    119 	'TTYPath', 'TTYReset', 'TTYVHangup', 'TTYVTDisallocate', 'SyslogIdentifier', 'SyslogFacility',
    120 	'SyslogLevel', 'SyslogLevelPrefix', 'TimerSlackNSec', 'LimitCPU', 'LimitFSIZE', 'LimitDATA',
    121 	'LimitSTACK', 'LimitCORE', 'LimitRSS', 'LimitNOFILE', 'LimitAS', 'LimitNPROC', 'LimitMEMLOCK',
    122 	'LimitLOCKS', 'LimitSIGPENDING', 'LimitMSGQUEUE', 'LimitNICE', 'LimitRTPRIO', 'LimitRTTIME',
    123 	'PAMName', 'CapabilityBoundingSet', 'AmbientCapabilities', 'SecureBits', 'Capabilities',
    124 	'ReadWriteDirectories', 'ReadOnlyDirectories', 'InaccessibleDirectories', 'PrivateTmp',
    125 	'PrivateDevices', 'PrivateNetwork', 'ProtectSystem', 'ProtectHome', 'MountFlags',
    126 	'UtmpIdentifier', 'UtmpMode', 'SELinuxContext', 'AppArmorProfile', 'SmackProcessLabel',
    127 	'IgnoreSIGPIPE', 'NoNewPrivileges', 'SystemCallFilter', 'SystemCallErrorNumber',
    128 	'SystemCallArchitectures', 'RestrictAddressFamilies', 'Personality', 'RuntimeDirectory',
    129 	'RuntimeDirectoryMode',
    130 	-- Container files.
    131 	'AddCapability', 'AutoUpdate', 'ContainerName', 'Exec', 'HostName', 'Image', 'Network',
    132 	'PodmanArgs', 'PublishPort', 'UserNS', 'Volume'
    133 })
    134 
    135 lex:set_word_list(lexer.LABEL, {
    136 	'Automount', 'BusName', 'Install', 'Mount', 'Path', 'Service', 'Service', 'Socket', 'Timer',
    137 	'Unit'
    138 })
    139 
    140 lexer.property['scintillua.comment'] = '#'
    141 
    142 return lex