neovim/runtime/ftplugin/forth.vim

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

73 lines
1.8 KiB
VimL
Raw Normal View History

" Vim filetype plugin
" Language: Forth
" Maintainer: Johan Kotlinski <kotlinski@gmail.com>
" Last Change: 2023 Sep 15
" URL: https://github.com/jkotlinski/forth.vim
if exists("b:did_ftplugin")
finish
endif
let b:did_ftplugin = 1
let s:cpo_save = &cpo
set cpo&vim
setlocal commentstring=\\\ %s
setlocal comments=s:(,mb:\ ,e:),b:\\
setlocal iskeyword=33-126,128-255
let s:include_patterns =<< trim EOL
\<\%(INCLUDE\|REQUIRE\)\>\s\+\zs\k\+\ze
\<S"\s\+\zs[^"]*\ze"\s\+\%(INCLUDED\|REQUIRED\)\>
EOL
let &l:include = $'\c{ s:include_patterns[1:]->join('\|') }'
let s:define_patterns =<< trim EOL
:
[2F]\=CONSTANT
[2F]\=VALUE
[2F]\=VARIABLE
BEGIN-STRUCTURE
BUFFER:
CODE
CREATE
MARKER
SYNONYM
EOL
let &l:define = $'\c\<\%({ s:define_patterns->join('\|') }\)'
" assume consistent intra-project file extensions
let &l:suffixesadd = "." .. expand("%:e")
let b:undo_ftplugin = "setl cms< com< def< inc< isk< sua<"
if exists("loaded_matchit") && !exists("b:match_words")
let s:matchit_patterns =<< trim EOL
\<\:\%(NONAME\)\=\>:\<EXIT\>:\<;\>
\<IF\>:\<ELSE\>:\<THEN\>
\<\[IF]\>:\<\[ELSE]\>:\<\[THEN]\>
\<?\=DO\>:\<LEAVE\>:\<+\=LOOP\>
\<CASE\>:\<ENDCASE\>
\<OF\>:\<ENDOF\>
\<BEGIN\>:\<WHILE\>:\<\%(AGAIN\|REPEAT\|UNTIL\)\>
\<CODE\>:\<END-CODE\>
\<BEGIN-STRUCTURE\>:\<END-STRUCTURE\>
EOL
let b:match_ignorecase = 1
let b:match_words = s:matchit_patterns[1:]->join(',')
let b:undo_ftplugin ..= "| unlet! b:match_ignorecase b:match_words"
unlet s:matchit_patterns
endif
if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
let b:browsefilter = "Forth Source Files (*.f *.fs *.ft *.fth *.4th)\t*.f;*.fs;*.ft;*.fth;*.4th\n" ..
\ "All Files (*.*)\t*.*\n"
let b:undo_ftplugin ..= " | unlet! b:browsefilter"
endif
let &cpo = s:cpo_save
unlet s:cpo_save
unlet s:define_patterns s:include_patterns