From b77c5f11070ecb2ff343aa18b4ea859e6168f16c Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Thu, 17 Feb 2022 04:31:35 +0100 Subject: Update --- autoload/clojurecomplete.vim | 2 +- autoload/csv.vim | 6 +- autoload/dart.vim | 12 - autoload/freebasic.vim | 45 +++ autoload/fsharp.vim | 53 +-- autoload/polyglot/ft.vim | 753 +++++++++++++++++++++++-------------------- autoload/polyglot/init.vim | 6 +- autoload/polyglot/sleuth.vim | 6 +- autoload/unison.vim | 12 +- 9 files changed, 485 insertions(+), 410 deletions(-) create mode 100644 autoload/freebasic.vim (limited to 'autoload') diff --git a/autoload/clojurecomplete.vim b/autoload/clojurecomplete.vim index bc352ccb..35833004 100644 --- a/autoload/clojurecomplete.vim +++ b/autoload/clojurecomplete.vim @@ -13,7 +13,7 @@ endif " -*- COMPLETION WORDS -*- " Generated from https://github.com/clojure-vim/clojure.vim/blob/%%RELEASE_TAG%%/clj/src/vim_clojure_static/generate.clj " Clojure version 1.10.3 -let s:words = ["*","*'","*1","*2","*3","*agent*","*allow-unresolved-vars*","*assert*","*clojure-version*","*command-line-args*","*compile-files*","*compile-path*","*compiler-options*","*data-readers*","*default-data-reader-fn*","*e","*err*","*file*","*flush-on-newline*","*fn-loader*","*in*","*math-context*","*ns*","*out*","*print-dup*","*print-length*","*print-level*","*print-meta*","*print-namespace-maps*","*print-readably*","*read-eval*","*reader-resolver*","*source-path*","*suppress-read*","*unchecked-math*","*use-context-classloader*","*verbose-defrecords*","*warn-on-reflection*","+","+'","-","-'","->","->>","->ArrayChunk","->Eduction","->Vec","->VecNode","->VecSeq","-cache-protocol-fn","-reset-methods",".","..","/","<","<=","=","==",">",">=","EMPTY-NODE","Inst","PrintWriter-on","StackTraceElement->vec","Throwable->map","accessor","aclone","add-classpath","add-tap","add-watch","agent","agent-error","agent-errors","aget","alength","alias","all-ns","alter","alter-meta!","alter-var-root","amap","ancestors","and","any?","apply","areduce","array-map","as->","aset","aset-boolean","aset-byte","aset-char","aset-double","aset-float","aset-int","aset-long","aset-short","assert","assoc!","assoc","assoc-in","associative?","atom","await","await-for","await1","bases","bean","bigdec","bigint","biginteger","binding","bit-and","bit-and-not","bit-clear","bit-flip","bit-not","bit-or","bit-set","bit-shift-left","bit-shift-right","bit-test","bit-xor","boolean","boolean-array","boolean?","booleans","bound-fn","bound-fn*","bound?","bounded-count","butlast","byte","byte-array","bytes","bytes?","case","cast","cat","catch","char","char-array","char-escape-string","char-name-string","char?","chars","chunk","chunk-append","chunk-buffer","chunk-cons","chunk-first","chunk-next","chunk-rest","chunked-seq?","class","class?","clear-agent-errors","clojure-version","coll?","comment","commute","comp","comparator","compare","compare-and-set!","compile","complement","completing","concat","cond","cond->","cond->>","condp","conj!","conj","cons","constantly","construct-proxy","contains?","count","counted?","create-ns","create-struct","cycle","dec","dec'","decimal?","declare","dedupe","def","default-data-readers","definline","definterface","defmacro","defmethod","defmulti","defn","defn-","defonce","defprotocol","defrecord","defstruct","deftype","delay","delay?","deliver","denominator","deref","derive","descendants","destructure","disj!","disj","dissoc!","dissoc","distinct","distinct?","do","doall","dorun","doseq","dosync","dotimes","doto","double","double-array","double?","doubles","drop","drop-last","drop-while","eduction","empty","empty?","ensure","ensure-reduced","enumeration-seq","error-handler","error-mode","eval","even?","every-pred","every?","ex-cause","ex-data","ex-info","ex-message","extend","extend-protocol","extend-type","extenders","extends?","false?","ffirst","file-seq","filter","filterv","finally","find","find-keyword","find-ns","find-protocol-impl","find-protocol-method","find-var","first","flatten","float","float-array","float?","floats","flush","fn","fn","fn?","fnext","fnil","for","force","format","frequencies","future","future-call","future-cancel","future-cancelled?","future-done?","future?","gen-class","gen-interface","gensym","get","get-in","get-method","get-proxy-class","get-thread-bindings","get-validator","group-by","halt-when","hash","hash-combine","hash-map","hash-ordered-coll","hash-set","hash-unordered-coll","ident?","identical?","identity","if","if-let","if-not","if-some","ifn?","import","in-ns","inc","inc'","indexed?","init-proxy","inst-ms","inst-ms*","inst?","instance?","int","int-array","int?","integer?","interleave","intern","interpose","into","into-array","ints","io!","isa?","iterate","iterator-seq","juxt","keep","keep-indexed","key","keys","keyword","keyword?","last","lazy-cat","lazy-seq","let","let","letfn","line-seq","list","list*","list?","load","load-file","load-reader","load-string","loaded-libs","locking","long","long-array","longs","loop","loop","macroexpand","macroexpand-1","make-array","make-hierarchy","map","map-entry?","map-indexed","map?","mapcat","mapv","max","max-key","memfn","memoize","merge","merge-with","meta","method-sig","methods","min","min-key","mix-collection-hash","mod","monitor-enter","monitor-exit","munge","name","namespace","namespace-munge","nat-int?","neg-int?","neg?","new","newline","next","nfirst","nil?","nnext","not","not-any?","not-empty","not-every?","not=","ns","ns-aliases","ns-imports","ns-interns","ns-map","ns-name","ns-publics","ns-refers","ns-resolve","ns-unalias","ns-unmap","nth","nthnext","nthrest","num","number?","numerator","object-array","odd?","or","parents","partial","partition","partition-all","partition-by","pcalls","peek","persistent!","pmap","pop!","pop","pop-thread-bindings","pos-int?","pos?","pr","pr-str","prefer-method","prefers","primitives-classnames","print","print-ctor","print-dup","print-method","print-simple","print-str","printf","println","println-str","prn","prn-str","promise","proxy","proxy-call-with-super","proxy-mappings","proxy-name","proxy-super","push-thread-bindings","pvalues","qualified-ident?","qualified-keyword?","qualified-symbol?","quot","quote","rand","rand-int","rand-nth","random-sample","range","ratio?","rational?","rationalize","re-find","re-groups","re-matcher","re-matches","re-pattern","re-seq","read","read+string","read-line","read-string","reader-conditional","reader-conditional?","realized?","record?","recur","reduce","reduce-kv","reduced","reduced?","reductions","ref","ref-history-count","ref-max-history","ref-min-history","ref-set","refer","refer-clojure","reify","release-pending-sends","rem","remove","remove-all-methods","remove-method","remove-ns","remove-tap","remove-watch","repeat","repeatedly","replace","replicate","require","requiring-resolve","reset!","reset-meta!","reset-vals!","resolve","rest","restart-agent","resultset-seq","reverse","reversible?","rseq","rsubseq","run!","satisfies?","second","select-keys","send","send-off","send-via","seq","seq?","seqable?","seque","sequence","sequential?","set!","set","set-agent-send-executor!","set-agent-send-off-executor!","set-error-handler!","set-error-mode!","set-validator!","set?","short","short-array","shorts","shuffle","shutdown-agents","simple-ident?","simple-keyword?","simple-symbol?","slurp","some","some->","some->>","some-fn","some?","sort","sort-by","sorted-map","sorted-map-by","sorted-set","sorted-set-by","sorted?","special-symbol?","spit","split-at","split-with","str","string?","struct","struct-map","subs","subseq","subvec","supers","swap!","swap-vals!","symbol","symbol?","sync","tagged-literal","tagged-literal?","take","take-last","take-nth","take-while","tap>","test","the-ns","thread-bound?","throw","time","to-array","to-array-2d","trampoline","transduce","transient","tree-seq","true?","try","type","unchecked-add","unchecked-add-int","unchecked-byte","unchecked-char","unchecked-dec","unchecked-dec-int","unchecked-divide-int","unchecked-double","unchecked-float","unchecked-inc","unchecked-inc-int","unchecked-int","unchecked-long","unchecked-multiply","unchecked-multiply-int","unchecked-negate","unchecked-negate-int","unchecked-remainder-int","unchecked-short","unchecked-subtract","unchecked-subtract-int","underive","unquote","unquote-splicing","unreduced","unsigned-bit-shift-right","update","update-in","update-proxy","uri?","use","uuid?","val","vals","var","var-get","var-set","var?","vary-meta","vec","vector","vector-of","vector?","volatile!","volatile?","vreset!","vswap!","when","when-first","when-let","when-not","when-some","while","with-bindings","with-bindings*","with-in-str","with-loading-context","with-local-vars","with-meta","with-open","with-out-str","with-precision","with-redefs","with-redefs-fn","xml-seq","zero?","zipmap"] +let s:words = ["&","*","*'","*1","*2","*3","*agent*","*allow-unresolved-vars*","*assert*","*clojure-version*","*command-line-args*","*compile-files*","*compile-path*","*compiler-options*","*data-readers*","*default-data-reader-fn*","*e","*err*","*file*","*flush-on-newline*","*fn-loader*","*in*","*math-context*","*ns*","*out*","*print-dup*","*print-length*","*print-level*","*print-meta*","*print-namespace-maps*","*print-readably*","*read-eval*","*reader-resolver*","*source-path*","*suppress-read*","*unchecked-math*","*use-context-classloader*","*verbose-defrecords*","*warn-on-reflection*","+","+'","-","-'","->","->>","->ArrayChunk","->Eduction","->Vec","->VecNode","->VecSeq","-cache-protocol-fn","-reset-methods",".","..","/","<","<=","=","==",">",">=","EMPTY-NODE","Inst","PrintWriter-on","StackTraceElement->vec","Throwable->map","accessor","aclone","add-classpath","add-tap","add-watch","agent","agent-error","agent-errors","aget","alength","alias","all-ns","alter","alter-meta!","alter-var-root","amap","ancestors","and","any?","apply","areduce","array-map","as->","aset","aset-boolean","aset-byte","aset-char","aset-double","aset-float","aset-int","aset-long","aset-short","assert","assoc","assoc!","assoc-in","associative?","atom","await","await-for","await1","bases","bean","bigdec","bigint","biginteger","binding","bit-and","bit-and-not","bit-clear","bit-flip","bit-not","bit-or","bit-set","bit-shift-left","bit-shift-right","bit-test","bit-xor","boolean","boolean-array","boolean?","booleans","bound-fn","bound-fn*","bound?","bounded-count","butlast","byte","byte-array","bytes","bytes?","case","case*","cast","cat","catch","char","char-array","char-escape-string","char-name-string","char?","chars","chunk","chunk-append","chunk-buffer","chunk-cons","chunk-first","chunk-next","chunk-rest","chunked-seq?","class","class?","clear-agent-errors","clojure-version","coll?","comment","commute","comp","comparator","compare","compare-and-set!","compile","complement","completing","concat","cond","cond->","cond->>","condp","conj","conj!","cons","constantly","construct-proxy","contains?","count","counted?","create-ns","create-struct","cycle","dec","dec'","decimal?","declare","dedupe","def","default-data-readers","definline","definterface","defmacro","defmethod","defmulti","defn","defn-","defonce","defprotocol","defrecord","defstruct","deftype","deftype*","delay","delay?","deliver","denominator","deref","derive","descendants","destructure","disj","disj!","dissoc","dissoc!","distinct","distinct?","do","doall","dorun","doseq","dosync","dotimes","doto","double","double-array","double?","doubles","drop","drop-last","drop-while","eduction","empty","empty?","ensure","ensure-reduced","enumeration-seq","error-handler","error-mode","eval","even?","every-pred","every?","ex-cause","ex-data","ex-info","ex-message","extend","extend-protocol","extend-type","extenders","extends?","false","false?","ffirst","file-seq","filter","filterv","finally","find","find-keyword","find-ns","find-protocol-impl","find-protocol-method","find-var","first","flatten","float","float-array","float?","floats","flush","fn","fn*","fn?","fnext","fnil","for","force","format","frequencies","future","future-call","future-cancel","future-cancelled?","future-done?","future?","gen-class","gen-interface","gensym","get","get-in","get-method","get-proxy-class","get-thread-bindings","get-validator","group-by","halt-when","hash","hash-combine","hash-map","hash-ordered-coll","hash-set","hash-unordered-coll","ident?","identical?","identity","if","if-let","if-not","if-some","ifn?","import","in-ns","inc","inc'","indexed?","init-proxy","inst-ms","inst-ms*","inst?","instance?","int","int-array","int?","integer?","interleave","intern","interpose","into","into-array","ints","io!","isa?","iterate","iterator-seq","juxt","keep","keep-indexed","key","keys","keyword","keyword?","last","lazy-cat","lazy-seq","let","let*","letfn","letfn*","line-seq","list","list*","list?","load","load-file","load-reader","load-string","loaded-libs","locking","long","long-array","longs","loop","loop*","macroexpand","macroexpand-1","make-array","make-hierarchy","map","map-entry?","map-indexed","map?","mapcat","mapv","max","max-key","memfn","memoize","merge","merge-with","meta","method-sig","methods","min","min-key","mix-collection-hash","mod","monitor-enter","monitor-exit","munge","name","namespace","namespace-munge","nat-int?","neg-int?","neg?","new","newline","next","nfirst","nil","nil?","nnext","not","not-any?","not-empty","not-every?","not=","ns","ns-aliases","ns-imports","ns-interns","ns-map","ns-name","ns-publics","ns-refers","ns-resolve","ns-unalias","ns-unmap","nth","nthnext","nthrest","num","number?","numerator","object-array","odd?","or","parents","partial","partition","partition-all","partition-by","pcalls","peek","persistent!","pmap","pop","pop!","pop-thread-bindings","pos-int?","pos?","pr","pr-str","prefer-method","prefers","primitives-classnames","print","print-ctor","print-dup","print-method","print-simple","print-str","printf","println","println-str","prn","prn-str","promise","proxy","proxy-call-with-super","proxy-mappings","proxy-name","proxy-super","push-thread-bindings","pvalues","qualified-ident?","qualified-keyword?","qualified-symbol?","quot","quote","rand","rand-int","rand-nth","random-sample","range","ratio?","rational?","rationalize","re-find","re-groups","re-matcher","re-matches","re-pattern","re-seq","read","read+string","read-line","read-string","reader-conditional","reader-conditional?","realized?","record?","recur","reduce","reduce-kv","reduced","reduced?","reductions","ref","ref-history-count","ref-max-history","ref-min-history","ref-set","refer","refer-clojure","reify","reify*","release-pending-sends","rem","remove","remove-all-methods","remove-method","remove-ns","remove-tap","remove-watch","repeat","repeatedly","replace","replicate","require","requiring-resolve","reset!","reset-meta!","reset-vals!","resolve","rest","restart-agent","resultset-seq","reverse","reversible?","rseq","rsubseq","run!","satisfies?","second","select-keys","send","send-off","send-via","seq","seq?","seqable?","seque","sequence","sequential?","set","set!","set-agent-send-executor!","set-agent-send-off-executor!","set-error-handler!","set-error-mode!","set-validator!","set?","short","short-array","shorts","shuffle","shutdown-agents","simple-ident?","simple-keyword?","simple-symbol?","slurp","some","some->","some->>","some-fn","some?","sort","sort-by","sorted-map","sorted-map-by","sorted-set","sorted-set-by","sorted?","special-symbol?","spit","split-at","split-with","str","string?","struct","struct-map","subs","subseq","subvec","supers","swap!","swap-vals!","symbol","symbol?","sync","tagged-literal","tagged-literal?","take","take-last","take-nth","take-while","tap>","test","the-ns","thread-bound?","throw","time","to-array","to-array-2d","trampoline","transduce","transient","tree-seq","true","true?","try","type","unchecked-add","unchecked-add-int","unchecked-byte","unchecked-char","unchecked-dec","unchecked-dec-int","unchecked-divide-int","unchecked-double","unchecked-float","unchecked-inc","unchecked-inc-int","unchecked-int","unchecked-long","unchecked-multiply","unchecked-multiply-int","unchecked-negate","unchecked-negate-int","unchecked-remainder-int","unchecked-short","unchecked-subtract","unchecked-subtract-int","underive","unquote","unquote-splicing","unreduced","unsigned-bit-shift-right","update","update-in","update-proxy","uri?","use","uuid?","val","vals","var","var-get","var-set","var?","vary-meta","vec","vector","vector-of","vector?","volatile!","volatile?","vreset!","vswap!","when","when-first","when-let","when-not","when-some","while","with-bindings","with-bindings*","with-in-str","with-loading-context","with-local-vars","with-meta","with-open","with-out-str","with-precision","with-redefs","with-redefs-fn","xml-seq","zero?","zipmap"] " Simple word completion for special forms and public vars in clojure.core function! clojurecomplete#Complete(findstart, base) diff --git a/autoload/csv.vim b/autoload/csv.vim index 34943bc7..ba04d2bc 100644 --- a/autoload/csv.vim +++ b/autoload/csv.vim @@ -780,8 +780,7 @@ fu! csv#CalculateColumnWidth(row, silent) "{{{3 " row for the row for which to calculate the width let b:col_width=[] if has( 'vartabs' ) && b:delimiter == "\t" - let vts_save=&vts - set vts= + setlocal vts= endif try if exists("b:csv_headerline") @@ -801,9 +800,6 @@ fu! csv#CalculateColumnWidth(row, silent) "{{{3 " delete buffer content in variable b:csv_list, " this was only necessary for calculating the max width unlet! b:csv_list s:columnize_count s:decimal_column - if has( 'vartabs' ) && b:delimiter == "\t" - let &vts=vts_save - endif endfu fu! csv#Columnize(field) "{{{3 " Internal function, not called from external, diff --git a/autoload/dart.vim b/autoload/dart.vim index a5733d03..28e55552 100644 --- a/autoload/dart.vim +++ b/autoload/dart.vim @@ -90,18 +90,6 @@ function! s:FindDartFmt() abort return [] endfunction -function! dart#analyzer(q_args) abort - call s:error('DartAnalyzer support has been removed. '. - \'If this broke your workflow please comment on '. - \'https://github.com/dart-lang/dart-vim-plugin/issues/89') -endfunction - -function! dart#tojs(q_args) abort - call s:error('Dart2JS support has been removed. '. - \'If this broke your workflow please comment on '. - \'https://github.com/dart-lang/dart-vim-plugin/issues/89') -endfunction - " Finds the path to `uri`. " " If the file is a package: uri, looks for a .packages file to resolve the path. diff --git a/autoload/freebasic.vim b/autoload/freebasic.vim new file mode 100644 index 00000000..50be9045 --- /dev/null +++ b/autoload/freebasic.vim @@ -0,0 +1,45 @@ +if polyglot#init#is_disabled(expand(':p'), 'freebasic', 'autoload/freebasic.vim') + finish +endif + +" Vim filetype plugin file +" Language: FreeBASIC +" Maintainer: Doug Kearns +" Last Change: 2021 Mar 16 + +" Dialects can be one of fb, qb, fblite, or deprecated +" Precedence is forcelang > #lang > lang +function! freebasic#GetDialect() abort + if exists("g:freebasic_forcelang") + return g:freebasic_forcelang + endif + + if exists("g:freebasic_lang") + let dialect = g:freebasic_lang + else + let dialect = "fb" + endif + + " override with #lang directive or metacommand + + let skip = "has('syntax_items') && synIDattr(synID(line('.'), col('.'), 1), 'name') =~ 'Comment$'" + let pat = '\c^\s*\%(#\s*lang\s\+\|''\s*$lang\s*:\s*\)"\([^"]*\)"' + + let save_cursor = getcurpos() + call cursor(1, 1) + let lnum = search(pat, 'n', '', '', skip) + call setpos('.', save_cursor) + + if lnum + let word = matchlist(getline(lnum), pat)[1] + if word =~? '\%(fb\|deprecated\|fblite\|qb\)' + let dialect = word + else + echomsg "freebasic#GetDialect: Invalid lang, found '" .. word .. "' at line " .. lnum .. " " .. getline(lnum) + endif + endif + + return dialect +endfunction + +" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker: diff --git a/autoload/fsharp.vim b/autoload/fsharp.vim index 5d8bb79d..275913cf 100644 --- a/autoload/fsharp.vim +++ b/autoload/fsharp.vim @@ -238,11 +238,7 @@ function! fsharp#loadConfig() endif if !exists('g:fsharp#fsautocomplete_command') - let s:fsac = fnamemodify(s:script_root_dir . "fsac/fsautocomplete.dll", ":p") - let g:fsharp#fsautocomplete_command = - \ ['dotnet', s:fsac, - \ '--background-service-enabled' - \ ] + let g:fsharp#fsautocomplete_command = ['fsautocomplete', '--background-service-enabled'] endif if !exists('g:fsharp#use_recommended_server_config') let g:fsharp#use_recommended_server_config = 1 @@ -283,6 +279,7 @@ function! fsharp#loadConfig() " backend configuration if g:fsharp#backend == 'languageclient-neovim' + let $DOTNET_ROLL_FORWARD='LatestMajor' if !exists('g:LanguageClient_serverCommands') let g:LanguageClient_serverCommands = {} endif @@ -478,8 +475,17 @@ function! fsharp#OnCursorMove() endfunction function! fsharp#showF1Help() - let result = s:f1Help(expand('%:p'), line('.') - 1, col('.') - 1) - echo result + function! s:callback_showF1Help(result) + let result = a:result + if exists('result.result.content') + let content = json_decode(result.result.content) + if exists('content.Data') + let url = 'https://docs.microsoft.com/en-us/dotnet/api/' . substitute(content.Data, '#ctor', '-ctor', 'g') + echo url + endif + endif + endfunction + call s:f1Help(expand('%:p'), line('.') - 1, col('.') - 1, function("s:callback_showF1Help")) endfunction function! s:hover() @@ -505,39 +511,6 @@ function! fsharp#showTooltip() endfunction -" FSAC update utils - -function! s:update_win() - echom "[FSAC] Downloading FSAC. This may take a while..." - let script = s:script_root_dir . "install.ps1" - call system('powershell -ExecutionPolicy Unrestricted ' . script . " update") -endfunction - -function! s:update_unix() - echom "[FSAC] Downloading FSAC. This may take a while..." - let zip = s:script_root_dir . "fsac.zip" - call system( - \ 'curl -fLo ' . zip . ' --create-dirs ' . - \ '"https://github.com/fsharp/FsAutoComplete/releases/latest/download/fsautocomplete.netcore.zip"' - \ ) - if v:shell_error == 0 - call system('unzip -o -d ' . s:script_root_dir . "/fsac " . zip) - call system('find ' . s:script_root_dir . '/fsac' . ' -type f -exec chmod 777 \{\} \;') - echom "[FSAC] Updated FsAutoComplete" - else - echom "[FSAC] Failed to update FsAutoComplete" - endif -endfunction - -function! fsharp#updateFSAC(...) - if has('win32') && !has('win32unix') - call s:update_win() - else - call s:update_unix() - endif -endfunction - - " FSI integration let s:fsi_buffer = -1 diff --git a/autoload/polyglot/ft.vim b/autoload/polyglot/ft.vim index 2ba69ed1..a8ca9008 100644 --- a/autoload/polyglot/ft.vim +++ b/autoload/polyglot/ft.vim @@ -1,113 +1,127 @@ -" Vim functions for file type detection -" -" Maintainer: Bram Moolenaar -" Last Change: 2021 Dec 17 +vim9script -" These functions are moved here from runtime/filetype.vim to make startup -" faster. +# Vim functions for file type detection +# +# Maintainer: Bram Moolenaar +# Last Change: 2022 Feb 05 -" Line continuation is used here, remove 'C' from 'cpoptions' -let s:cpo_save = &cpo -set cpo&vim +# These functions are moved here from runtime/filetype.vim to make startup +# faster. -func polyglot#ft#Check_inp() +export def Check_inp() if getline(1) =~ '^\*' setf abaqus else - let n = 1 - if line("$") > 500 - let nmax = 500 - else - let nmax = line("$") - endif + var n = 1 + var nmax = line("$") > 500 ? 500 : line("$") while n <= nmax if getline(n) =~? "^header surface data" setf trasys break endif - let n = n + 1 + n += 1 endwhile endif -endfunc +enddef -" This function checks for the kind of assembly that is wanted by the user, or -" can be detected from the first five lines of the file. -func polyglot#ft#FTasm() - " make sure b:asmsyntax exists +# This function checks for the kind of assembly that is wanted by the user, or +# can be detected from the first five lines of the file. +export def FTasm() + # make sure b:asmsyntax exists if !exists("b:asmsyntax") - let b:asmsyntax = "" + b:asmsyntax = "" endif if b:asmsyntax == "" - call polyglot#ft#FTasmsyntax() + FTasmsyntax() endif - " if b:asmsyntax still isn't set, default to asmsyntax or GNU + # if b:asmsyntax still isn't set, default to asmsyntax or GNU if b:asmsyntax == "" if exists("g:asmsyntax") - let b:asmsyntax = g:asmsyntax + b:asmsyntax = g:asmsyntax else - let b:asmsyntax = "asm" + b:asmsyntax = "asm" endif endif - exe "setf " . fnameescape(b:asmsyntax) -endfunc + exe "setf " .. fnameescape(b:asmsyntax) +enddef -func polyglot#ft#FTasmsyntax() - " see if file contains any asmsyntax=foo overrides. If so, change - " b:asmsyntax appropriately - let head = " ".getline(1)." ".getline(2)." ".getline(3)." ".getline(4). - \" ".getline(5)." " - let match = matchstr(head, '\sasmsyntax=\zs[a-zA-Z0-9]\+\ze\s') +export def FTasmsyntax() + # see if the file contains any asmsyntax=foo overrides. If so, change + # b:asmsyntax appropriately + var head = " " .. getline(1) .. " " .. getline(2) .. " " + .. getline(3) .. " " .. getline(4) .. " " .. getline(5) .. " " + var match = matchstr(head, '\sasmsyntax=\zs[a-zA-Z0-9]\+\ze\s') if match != '' - let b:asmsyntax = match + b:asmsyntax = match elseif ((head =~? '\.title') || (head =~? '\.ident') || (head =~? '\.macro') || (head =~? '\.subtitle') || (head =~? '\.library')) - let b:asmsyntax = "vmasm" + b:asmsyntax = "vmasm" + endif +enddef + +var ft_visual_basic_content = '\cVB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)' + +# See FTfrm() for Visual Basic form file detection +export def FTbas() + if exists("g:filetype_bas") + exe "setf " .. g:filetype_bas + return endif -endfunc -" Check if one of the first five lines contains "VB_Name". In that case it is -" probably a Visual Basic file. Otherwise it's assumed to be "alt" filetype. -func polyglot#ft#FTVB(alt) - if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'VB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)' + # most frequent FreeBASIC-specific keywords in distro files + var fb_keywords = '\c^\s*\%(extern\|var\|enum\|private\|scope\|union\|byref\|operator\|constructor\|delete\|namespace\|public\|property\|with\|destructor\|using\)\>\%(\s*[:=(]\)\@!' + var fb_preproc = '\c^\s*\%(#\a\+\|option\s\+\%(byval\|dynamic\|escape\|\%(no\)\=gosub\|nokeyword\|private\|static\)\>\)' + var fb_comment = "^\\s*/'" + # OPTION EXPLICIT, without the leading underscore, is common to many dialects + var qb64_preproc = '\c^\s*\%($\a\+\|option\s\+\%(_explicit\|_\=explicitarray\)\>\)' + + var lines = getline(1, min([line("$"), 100])) + + if match(lines, fb_preproc) > -1 || match(lines, fb_comment) > -1 || match(lines, fb_keywords) > -1 + setf freebasic + elseif match(lines, qb64_preproc) > -1 + setf qb64 + elseif match(lines, s:ft_visual_basic_content) > -1 setf vb else - exe "setf " . a:alt + setf basic endif -endfunc +enddef -func polyglot#ft#FTbtm() +export def FTbtm() if exists("g:dosbatch_syntax_for_btm") && g:dosbatch_syntax_for_btm setf dosbatch else setf btm endif -endfunc +enddef -func polyglot#ft#BindzoneCheck(default) - if getline(1).getline(2).getline(3).getline(4) =~ '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA' +export def BindzoneCheck(default = '') + if getline(1) .. getline(2) .. getline(3) .. getline(4) + =~ '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA' setf bindzone - elseif a:default != '' - exe 'setf ' . a:default + elseif default != '' + exe 'setf ' .. default endif -endfunc +enddef -func polyglot#ft#FTlpc() +export def FTlpc() if exists("g:lpc_syntax_for_c") - let lnum = 1 + var lnum = 1 while lnum <= 12 if getline(lnum) =~# '^\(//\|inherit\|private\|protected\|nosave\|string\|object\|mapping\|mixed\)' setf lpc return endif - let lnum = lnum + 1 + lnum += 1 endwhile endif setf c -endfunc +enddef -func polyglot#ft#FTheader() +export def FTheader() if match(getline(1, min([line("$"), 200])), '^@\(interface\|end\|class\)') > -1 if exists("g:c_syntax_for_h") setf objc @@ -121,15 +135,15 @@ func polyglot#ft#FTheader() else setf cpp endif -endfunc +enddef -" This function checks if one of the first ten lines start with a '@'. In -" that case it is probably a change file. -" If the first line starts with # or ! it's probably a ch file. -" If a line has "main", "include", "//" or "/*" it's probably ch. -" Otherwise CHILL is assumed. -func polyglot#ft#FTchange() - let lnum = 1 +# This function checks if one of the first ten lines start with a '@'. In +# that case it is probably a change file. +# If the first line starts with # or ! it's probably a ch file. +# If a line has "main", "include", "//" or "/*" it's probably ch. +# Otherwise CHILL is assumed. +export def FTchange() + var lnum = 1 while lnum <= 10 if getline(lnum)[0] == '@' setf change @@ -147,86 +161,101 @@ func polyglot#ft#FTchange() setf ch return endif - let lnum = lnum + 1 + lnum += 1 endwhile setf chill -endfunc +enddef -func polyglot#ft#FTent() - " This function checks for valid cl syntax in the first five lines. - " Look for either an opening comment, '#', or a block start, '{". - " If not found, assume SGML. - let lnum = 1 +export def FTent() + # This function checks for valid cl syntax in the first five lines. + # Look for either an opening comment, '#', or a block start, '{". + # If not found, assume SGML. + var lnum = 1 while lnum < 6 - let line = getline(lnum) + var line = getline(lnum) if line =~ '^\s*[#{]' setf cl return elseif line !~ '^\s*$' - " Not a blank line, not a comment, and not a block start, - " so doesn't look like valid cl code. + # Not a blank line, not a comment, and not a block start, + # so doesn't look like valid cl code. break endif - let lnum = lnum + 1 + lnum += 1 endw setf dtd -endfunc +enddef -func polyglot#ft#ExCheck() - let lines = getline(1, min([line("$"), 100])) +export def ExCheck() + var lines = getline(1, min([line("$"), 100])) if exists('g:filetype_euphoria') - exe 'setf ' . g:filetype_euphoria + exe 'setf ' .. g:filetype_euphoria elseif match(lines, '^--\|^ifdef\>\|^include\>') > -1 setf euphoria3 else setf elixir endif -endfunc +enddef -func polyglot#ft#EuphoriaCheck() +export def EuphoriaCheck() if exists('g:filetype_euphoria') - exe 'setf ' . g:filetype_euphoria + exe 'setf ' .. g:filetype_euphoria else setf euphoria3 endif -endfunc +enddef -func polyglot#ft#DtraceCheck() - let lines = getline(1, min([line("$"), 100])) +export def DtraceCheck() + var lines = getline(1, min([line("$"), 100])) if match(lines, '^module\>\|^import\>') > -1 - " D files often start with a module and/or import statement. + # D files often start with a module and/or import statement. setf d elseif match(lines, '^#!\S\+dtrace\|#pragma\s\+D\s\+option\|:\S\{-}:\S\{-}:') > -1 setf dtrace else setf d endif -endfunc +enddef -func polyglot#ft#FTe() +export def FTe() if exists('g:filetype_euphoria') - exe 'setf ' . g:filetype_euphoria + exe 'setf ' .. g:filetype_euphoria else - let n = 1 + var n = 1 while n < 100 && n <= line("$") if getline(n) =~ "^\\s*\\(<'\\|'>\\)\\s*$" setf specman return endif - let n = n + 1 + n += 1 endwhile setf eiffel endif -endfunc +enddef + +export def FTfrm() + if exists("g:filetype_frm") + exe "setf " .. g:filetype_frm + return + endif + + var lines = getline(1, min([line("$"), 5])) -" Distinguish between Forth and F#. -" Provided by Doug Kearns. -func polyglot#ft#FTfs() + if match(lines, s:ft_visual_basic_content) > -1 + setf vb + else + setf form + endif +enddef + +# Distinguish between Forth and F#. +# Provided by Doug Kearns. +export def FTfs() if exists("g:filetype_fs") - exe "setf " . g:filetype_fs + exe "setf " .. g:filetype_fs else - let line = getline(nextnonblank(1)) - " comments and colon definitions + var line = getline(nextnonblank(1)) + # comments and colon definitions if line =~ '^\s*\.\=( ' || line =~ '^\s*\\G\= ' || line =~ '^\\$' \ || line =~ '^\s*: \S' setf forth @@ -234,11 +263,11 @@ func polyglot#ft#FTfs() setf fsharp endif endif -endfunc +enddef -" Distinguish between HTML, XHTML and Django -func polyglot#ft#FThtml() - let n = 1 +# Distinguish between HTML, XHTML and Django +export def FThtml() + var n = 1 while n < 10 && n <= line("$") if getline(n) =~ '\' || line =~ objc_preprocessor setf objc @@ -310,7 +339,7 @@ func polyglot#ft#FTm() setf octave return endif - " TODO: could be Matlab or Octave + # TODO: could be Matlab or Octave if line =~ '^\s*%' setf matlab return @@ -323,24 +352,24 @@ func polyglot#ft#FTm() setf murphi return endif - let n = n + 1 + n += 1 endwhile if saw_comment - " We didn't see anything definitive, but this looks like either Objective C - " or Murphi based on the comment leader. Assume the former as it is more - " common. + # We didn't see anything definitive, but this looks like either Objective C + # or Murphi based on the comment leader. Assume the former as it is more + # common. setf objc else - " Default is Matlab + # Default is Matlab setf matlab endif -endfunc +enddef -func polyglot#ft#FTmms() - let n = 1 +export def FTmms() + var n = 1 while n < 20 - let line = getline(n) + var line = getline(n) if line =~ '^\s*\(%\|//\)' || line =~ '^\*' setf mmix return @@ -349,78 +378,78 @@ func polyglot#ft#FTmms() setf make return endif - let n = n + 1 + n += 1 endwhile setf mmix -endfunc +enddef -" This function checks if one of the first five lines start with a dot. In -" that case it is probably an nroff file: 'filetype' is set and 1 is returned. -func polyglot#ft#FTnroff() - if getline(1)[0] . getline(2)[0] . getline(3)[0] . getline(4)[0] . getline(5)[0] =~ '\.' +# This function checks if one of the first five lines start with a dot. In +# that case it is probably an nroff file: 'filetype' is set and 1 is returned. +export def FTnroff(): number + if getline(1)[0] .. getline(2)[0] .. getline(3)[0] + .. getline(4)[0] .. getline(5)[0] =~ '\.' setf nroff return 1 endif return 0 -endfunc +enddef -func polyglot#ft#FTmm() - let n = 1 +export def FTmm() + var n = 1 while n < 20 - let line = getline(n) - if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\)' + if getline(n) =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\)' setf objcpp return endif - let n = n + 1 + n += 1 endwhile setf nroff -endfunc +enddef -func polyglot#ft#FTpl() +export def FTpl() if exists("g:filetype_pl") - exe "setf " . g:filetype_pl + exe "setf " .. g:filetype_pl else - " recognize Prolog by specific text in the first non-empty line - " require a blank after the '%' because Perl uses "%list" and "%translate" - let l = getline(nextnonblank(1)) + # recognize Prolog by specific text in the first non-empty line + # require a blank after the '%' because Perl uses "%list" and "%translate" + var l = getline(nextnonblank(1)) if l =~ '\' || l =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || l =~ ':-' setf prolog else setf perl endif endif -endfunc +enddef -func polyglot#ft#FTinc() +export def FTinc() if exists("g:filetype_inc") - exe "setf " . g:filetype_inc + exe "setf " .. g:filetype_inc else - let lines = getline(1).getline(2).getline(3) + var lines = getline(1) .. getline(2) .. getline(3) if lines =~? "perlscript" setf aspperl elseif lines =~ "<%" setf aspvbs elseif lines =~ "' +var ft_pascal_comments = '^\s*\%({\|(\*\|//\)' +var ft_pascal_keywords = '^\s*\%(program\|unit\|library\|uses\|begin\|procedure\|function\|const\|type\|var\)\>' -func polyglot#ft#FTprogress_pascal() +export def FTprogress_pascal() if exists("g:filetype_p") - exe "setf " . g:filetype_p + exe "setf " .. g:filetype_p return endif - " This function checks for valid Pascal syntax in the first ten lines. - " Look for either an opening comment or a program start. - " If not found, assume Progress. - let lnum = 1 + # This function checks for valid Pascal syntax in the first ten lines. + # Look for either an opening comment or a program start. + # If not found, assume Progress. + var lnum = 1 while lnum <= 10 && lnum < line('$') - let line = getline(lnum) + var line = getline(lnum) if line =~ s:ft_pascal_comments || line =~? s:ft_pascal_keywords setf pascal return elseif line !~ '^\s*$' || line =~ '^/\*' - " Not an empty line: Doesn't look like valid Pascal code. - " Or it looks like a Progress /* comment + # Not an empty line: Doesn't look like valid Pascal code. + # Or it looks like a Progress /* comment break endif - let lnum = lnum + 1 + lnum += 1 endw setf progress -endfunc +enddef -func polyglot#ft#FTpp() +export def FTpp() if exists("g:filetype_pp") - exe "setf " . g:filetype_pp + exe "setf " .. g:filetype_pp else - let line = getline(nextnonblank(1)) + var line = getline(nextnonblank(1)) if line =~ s:ft_pascal_comments || line =~? s:ft_pascal_keywords setf pascal else setf puppet endif endif -endfunc +enddef -func polyglot#ft#FTr() - let max = line("$") > 50 ? 50 : line("$") +export def FTr() + var max = line("$") > 50 ? 50 : line("$") for n in range(1, max) - " Rebol is easy to recognize, check for that first + # Rebol is easy to recognize, check for that first if getline(n) =~? '\' setf rebol return @@ -505,82 +534,82 @@ func polyglot#ft#FTr() endfor for n in range(1, max) - " R has # comments + # R has # comments if getline(n) =~ '^\s*#' setf r return endif - " Rexx has /* comments */ + # Rexx has /* comments */ if getline(n) =~ '^\s*/\*' setf rexx return endif endfor - " Nothing recognized, use user default or assume Rexx + # Nothing recognized, use user default or assume Rexx if exists("g:filetype_r") - exe "setf " . g:filetype_r + exe "setf " .. g:filetype_r else - " Rexx used to be the default, but R appears to be much more popular. + # Rexx used to be the default, but R appears to be much more popular. setf r endif -endfunc +enddef -func polyglot#ft#McSetf() - " Rely on the file to start with a comment. - " MS message text files use ';', Sendmail files use '#' or 'dnl' +export def McSetf() + # Rely on the file to start with a comment. + # MS message text files use ';', Sendmail files use '#' or 'dnl' for lnum in range(1, min([line("$"), 20])) - let line = getline(lnum) + var line = getline(lnum) if line =~ '^\s*\(#\|dnl\)' - setf m4 " Sendmail .mc file + setf m4 # Sendmail .mc file return elseif line =~ '^\s*;' - setf msmessages " MS Message text file + setf msmessages # MS Message text file return endif endfor setf m4 " Default: Sendmail .mc file -endfunc +enddef -" Called from filetype.vim and scripts.vim. -func polyglot#ft#SetFileTypeSH(name) +# Called from filetype.vim and scripts.vim. +export def SetFileTypeSH(name: string) if did_filetype() - " Filetype was already detected + # Filetype was already detected return endif if expand("") =~ g:ft_ignore_pat return endif - if a:name =~ '\' - " Some .sh scripts contain #!/bin/csh. - call polyglot#ft#SetFileTypeShell("csh") + if name =~ '\' + # Some .sh scripts contain #!/bin/csh. + SetFileTypeShell("csh") return - elseif a:name =~ '\' - " Some .sh scripts contain #!/bin/tcsh. - call polyglot#ft#SetFileTypeShell("tcsh") + elseif name =~ '\' + # Some .sh scripts contain #!/bin/tcsh. + SetFileTypeShell("tcsh") return - elseif a:name =~ '\' - " Some .sh scripts contain #!/bin/zsh. - call polyglot#ft#SetFileTypeShell("zsh") + elseif name =~ '\' + # Some .sh scripts contain #!/bin/zsh. + SetFileTypeShell("zsh") return - elseif a:name =~ '\' - let b:is_kornshell = 1 + elseif name =~ '\' + b:is_kornshell = 1 if exists("b:is_bash") unlet b:is_bash endif if exists("b:is_sh") unlet b:is_sh endif - elseif exists("g:bash_is_sh") || a:name =~ '\' || a:name =~ '\' - let b:is_bash = 1 + elseif exists("g:bash_is_sh") || name =~ '\' || name =~ '\' + b:is_bash = 1 if exists("b:is_kornshell") unlet b:is_kornshell endif if exists("b:is_sh") unlet b:is_sh endif - elseif a:name =~ '\' - let b:is_sh = 1 + elseif name =~ '\' + b:is_sh = 1 if exists("b:is_kornshell") unlet b:is_kornshell endif @@ -588,75 +617,76 @@ func polyglot#ft#SetFileTypeSH(name) unlet b:is_bash endif endif - call polyglot#ft#SetFileTypeShell("sh") -endfunc + SetFileTypeShell("sh") +enddef -" For shell-like file types, check for an "exec" command hidden in a comment, -" as used for Tcl. -" Also called from scripts.vim, thus can't be local to this script. -func polyglot#ft#SetFileTypeShell(name) +# For shell-like file types, check for an "exec" command hidden in a comment, +# as used for Tcl. +# Also called from scripts.vim, thus can't be local to this script. +export def SetFileTypeShell(name: string) if did_filetype() - " Filetype was already detected + # Filetype was already detected return endif if expand("") =~ g:ft_ignore_pat return endif - let l = 2 + var l = 2 while l < 20 && l < line("$") && getline(l) =~ '^\s*\(#\|$\)' - " Skip empty and comment lines. - let l = l + 1 + # Skip empty and comment lines. + l += 1 endwhile if l < line("$") && getline(l) =~ '\s*exec\s' && getline(l - 1) =~ '^\s*#.*\\$' - " Found an "exec" line after a comment with continuation - let n = substitute(getline(l),'\s*exec\s\+\([^ ]*/\)\=', '', '') + # Found an "exec" line after a comment with continuation + var n = substitute(getline(l), '\s*exec\s\+\([^ ]*/\)\=', '', '') if n =~ '\:p') +var ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*' +export def FTRules() + var path = expand(':p') if path =~ '/\(etc/udev/\%(rules\.d/\)\=.*\.rules\|\%(usr/\)\=lib/udev/\%(rules\.d/\)\=.*\.rules\)$' setf udevrules return endif if path =~ '^/etc/ufw/' - setf conf " Better than hog + setf conf # Better than hog return endif if path =~ '^/\(etc\|usr/share\)/polkit-1/rules\.d' setf javascript return endif + var config_lines: list try - let config_lines = readfile('/etc/udev/udev.conf') + config_lines = readfile('/etc/udev/udev.conf') catch /^Vim\%((\a\+)\)\=:E484/ setf hog return endtry - let dir = expand(':p:h') + var dir = expand(':p:h') for line in config_lines if line =~ s:ft_rules_udev_rules_pattern - let udev_rules = substitute(line, s:ft_rules_udev_rules_pattern, '\1', "") + var udev_rules = substitute(line, s:ft_rules_udev_rules_pattern, '\1', "") if dir == udev_rules setf udevrules endif @@ -664,24 +694,24 @@ func polyglot#ft#FTRules() endif endfor setf hog -endfunc +enddef -func polyglot#ft#SQL() +export def SQL() if exists("g:filetype_sql") - exe "setf " . g:filetype_sql + exe "setf " .. g:filetype_sql else setf sql endif -endfunc +enddef -" If the file has an extension of 't' and is in a directory 't' or 'xt' then -" it is almost certainly a Perl test file. -" If the first line starts with '#' and contains 'perl' it's probably a Perl -" file. -" (Slow test) If a file contains a 'use' statement then it is almost certainly -" a Perl file. -func polyglot#ft#FTperl() - let dirname = expand("%:p:h:t") +# If the file has an extension of 't' and is in a directory 't' or 'xt' then +# it is almost certainly a Perl test file. +# If the first line starts with '#' and contains 'perl' it's probably a Perl +# file. +# (Slow test) If a file contains a 'use' statement then it is almost certainly +# a Perl file. +export def FTperl(): number + var dirname = expand("%:p:h:t") if expand("%:e") == 't' && (dirname == 't' || dirname == 'xt') setf perl return 1 @@ -690,86 +720,88 @@ func polyglot#ft#FTperl() setf perl return 1 endif - let save_cursor = getpos('.') - call cursor(1,1) - let has_use = search('^use\s\s*\k', 'c', 30) + var save_cursor = getpos('.') + call cursor(1, 1) + var has_use = search('^use\s\s*\k', 'c', 30) > 0 call setpos('.', save_cursor) if has_use setf perl return 1 endif return 0 -endfunc - -" Choose context, plaintex, or tex (LaTeX) based on these rules: -" 1. Check the first line of the file for "%&". -" 2. Check the first 1000 non-comment lines for LaTeX or ConTeXt keywords. -" 3. Default to "plain" or to g:tex_flavor, can be set in user's vimrc. -func polyglot#ft#FTtex() - let firstline = getline(1) +enddef + +# Choose context, plaintex, or tex (LaTeX) based on these rules: +# 1. Check the first line of the file for "%&". +# 2. Check the first 1000 non-comment lines for LaTeX or ConTeXt keywords. +# 3. Default to "plain" or to g:tex_flavor, can be set in user's vimrc. +export def FTtex() + var firstline = getline(1) + var format: string if firstline =~ '^%&\s*\a\+' - let format = tolower(matchstr(firstline, '\a\+')) - let format = substitute(format, 'pdf', '', '') + format = tolower(matchstr(firstline, '\a\+')) + format = substitute(format, 'pdf', '', '') if format == 'tex' - let format = 'latex' + format = 'latex' elseif format == 'plaintex' - let format = 'plain' + format = 'plain' endif elseif expand('%') =~ 'tex/context/.*/.*.tex' - let format = 'context' + format = 'context' else - " Default value, may be changed later: - let format = exists("g:tex_flavor") ? g:tex_flavor : 'plain' - " Save position, go to the top of the file, find first non-comment line. - let save_cursor = getpos('.') - call cursor(1,1) - let firstNC = search('^\s*[^[:space:]%]', 'c', 1000) - if firstNC " Check the next thousand lines for a LaTeX or ConTeXt keyword. - let lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>' - let cpat = 'start\a\+\|setup\a\+\|usemodule\|enablemode\|enableregime\|setvariables\|useencoding\|usesymbols\|stelle\a\+\|verwende\a\+\|stel\a\+\|gebruik\a\+\|usa\a\+\|imposta\a\+\|regle\a\+\|utilisemodule\>' - let kwline = search('^\s*\\\%(' . lpat . '\)\|^\s*\\\(' . cpat . '\)', - \ 'cnp', firstNC + 1000) - if kwline == 1 " lpat matched - let format = 'latex' - elseif kwline == 2 " cpat matched - let format = 'context' - endif " If neither matched, keep default set above. - " let lline = search('^\s*\\\%(' . lpat . '\)', 'cn', firstNC + 1000) - " let cline = search('^\s*\\\%(' . cpat . '\)', 'cn', firstNC + 1000) - " if cline > 0 - " let format = 'context' - " endif - " if lline > 0 && (cline == 0 || cline > lline) - " let format = 'tex' - " endif - endif " firstNC + # Default value, may be changed later: + format = exists("g:tex_flavor") ? g:tex_flavor : 'plain' + # Save position, go to the top of the file, find first non-comment line. + var save_cursor = getpos('.') + call cursor(1, 1) + var firstNC = search('^\s*[^[:space:]%]', 'c', 1000) + if firstNC > 0 + # Check the next thousand lines for a LaTeX or ConTeXt keyword. + var lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>' + var cpat = 'start\a\+\|setup\a\+\|usemodule\|enablemode\|enableregime\|setvariables\|useencoding\|usesymbols\|stelle\a\+\|verwende\a\+\|stel\a\+\|gebruik\a\+\|usa\a\+\|imposta\a\+\|regle\a\+\|utilisemodule\>' + var kwline = search('^\s*\\\%(' .. lpat .. '\)\|^\s*\\\(' .. cpat .. '\)', + 'cnp', firstNC + 1000) + if kwline == 1 # lpat matched + format = 'latex' + elseif kwline == 2 # cpat matched + format = 'context' + endif # If neither matched, keep default set above. + # let lline = search('^\s*\\\%(' . lpat . '\)', 'cn', firstNC + 1000) + # let cline = search('^\s*\\\%(' . cpat . '\)', 'cn', firstNC + 1000) + # if cline > 0 + # let format = 'context' + # endif + # if lline > 0 && (cline == 0 || cline > lline) + # let format = 'tex' + # endif + endif # firstNC call setpos('.', save_cursor) - endif " firstline =~ '^%&\s*\a\+' + endif # firstline =~ '^%&\s*\a\+' - " Translation from formats to file types. TODO: add AMSTeX, RevTex, others? + # Translation from formats to file types. TODO: add AMSTeX, RevTex, others? if format == 'plain' setf plaintex elseif format == 'context' setf context - else " probably LaTeX + else # probably LaTeX setf tex endif return -endfunc +enddef -func polyglot#ft#FTxml() - let n = 1 +export def FTxml() + var n = 1 while n < 100 && n <= line("$") - let line = getline(n) - " DocBook 4 or DocBook 5. - let is_docbook4 = line =~ ' 0 && line[start - 1] !~ '\s' && line[start - 1] != '(' && line[start - 1] != ')' + " Examples of where we want to count the start of a word: + " + " foo List.fold + " ^ + " + " {Abor + " ^ + " + " (List.fol + " ^ + while start > 0 && line[start - 1] !~ '\v\s|[(){}\[\]]' let start -= 1 endwhile return start -- cgit v1.2.3