From 190a65fa35a1158895dee94cdfdf87f974121b50 Mon Sep 17 00:00:00 2001 From: anon Date: Thu, 23 Jan 2025 13:33:36 +0100 Subject: [PATCH] vim highlighting WIP --- .vim/ftdetect/vimdir.vim | 1 + .vim/syntax/vimdir.vim | 25 +++++++++++++++ Makefile | 10 ++++++ object/.gitkeep | 0 script/gen_syntax_from_ls_colors.tcl | 48 ++++++++++++++++++++++++++++ 5 files changed, 84 insertions(+) create mode 100644 .vim/ftdetect/vimdir.vim create mode 100644 .vim/syntax/vimdir.vim create mode 100644 object/.gitkeep create mode 100755 script/gen_syntax_from_ls_colors.tcl diff --git a/.vim/ftdetect/vimdir.vim b/.vim/ftdetect/vimdir.vim new file mode 100644 index 0000000..504fa11 --- /dev/null +++ b/.vim/ftdetect/vimdir.vim @@ -0,0 +1 @@ +au BufRead,BufNewFile *.vimdir set filetype=vimdir diff --git a/.vim/syntax/vimdir.vim b/.vim/syntax/vimdir.vim new file mode 100644 index 0000000..4600a2b --- /dev/null +++ b/.vim/syntax/vimdir.vim @@ -0,0 +1,25 @@ +" Vim syntax file +" Language: Vimdir entry file +" Current Maintainer: Anon +" Last Change: 2025 + +let b:current_syntax = "vimdir" + +syn match vdId "^\d\+" +syn match vdSeparator ":" +syn match vdPermissions "[-dcbpls][-rwx]\{9}" +syn match vdDirectory "[^\t]\+/" +" NOTE: tabs are used for field separation, +" however it is possible that the user has expandtab on. +" this would confuse the lexer, leading to unexpected results. +" therefor, it is a good idea to warn the user. +" that said, spaces are valid inside file names. +syn match vdSpace " " + +hi link vdId Number +hi link vdSeparator Statement +hi link vdPermissions Special +hi link vdSpace Error +hi link vdDirectory Directory + +" #placeholder COLLAPSED diff --git a/Makefile b/Makefile index 4446c8c..c7e7aad 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,16 @@ ${OUT}: ${SOURCE} test: cmdtest --fast +ls_colors: + tclsh script/gen_syntax_from_ls_colors.tcl > object/ls_colors.vimdir + plug -g -e ls_colors object/ls_colors.vimdir .vim/syntax/vimdir.vim + +bundle: + tar -c .vim/ -f vimdir.tar + +install: bundle + tar -x -f vimdir.tar --dereference -C ~/ + clean: -rm ${OUT} diff --git a/object/.gitkeep b/object/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/script/gen_syntax_from_ls_colors.tcl b/script/gen_syntax_from_ls_colors.tcl new file mode 100755 index 0000000..29f0838 --- /dev/null +++ b/script/gen_syntax_from_ls_colors.tcl @@ -0,0 +1,48 @@ +#!/usr/bin/tclsh + +if {[info exists env(LS_COLORS)] == 0} { + puts stderr "Error: LS_COLORS environment variable is not set." + exit 1 +} + +set rules {} +set lscolors $env(LS_COLORS) +foreach pair [split $lscolors :] { + set color [lindex [split $pair =] 1] + set pattern [lindex [split $pair =] 0] + lappend rules [list $pattern $color] +} + +proc to_clean_name {string} { + set r $string + set r [regsub -all {[^a-zA-Z0-9]} $r ""] + return $r +} + +proc rewrite_regex {string} { + set r $string + set r [string map {"*" ".\*"} $r] + return $r +} + +proc match_rule {rule} { + set template "syn match vd%s \"%s\"" + set name [to_clean_name [lindex $rule 0]] + set pattern [rewrite_regex [lindex $rule 0]] + return [format $template $name $pattern] +} + +proc def_rule {rule} { + set template "hi def vd%s ctermfg=%s" + set name [to_clean_name [lindex $rule 0]] + set color [lindex $rule 1] + return [format $template $name $color] +} + +foreach rule $rules { + puts [match_rule $rule] +} + +foreach rule $rules { + puts [def_rule $rule] +}