From 86fbbd84cf3e0321d75239fa31a80265ffbc8b18 Mon Sep 17 00:00:00 2001 From: Adam Hovorka Date: Wed, 20 May 2020 15:46:54 -0600 Subject: Update k.zsh and add custom ls colors --- base/zsh/LS_COLORS | 799 ++++++++++++++++++++++++++++++++++++++++++++++++++ base/zsh/k.zsh | 396 +++++++++++++++---------- base/zsh/lscolors.zsh | 3 + 3 files changed, 1038 insertions(+), 160 deletions(-) create mode 100644 base/zsh/LS_COLORS create mode 100644 base/zsh/lscolors.zsh diff --git a/base/zsh/LS_COLORS b/base/zsh/LS_COLORS new file mode 100644 index 0000000..a5e970d --- /dev/null +++ b/base/zsh/LS_COLORS @@ -0,0 +1,799 @@ +# dircolors LS_COLORS >lscolors.zsh +# vim: set ft=dircolors, set fdm=marker + +# core {{{1 +BLK 33;1 +CAPABILITY 31;1;7 +CHR 33;1 +DIR 34;1 +DOOR 35;1 +EXEC 32;1 +FIFO 33 +FILE 0 +LINK target +MISSING 31;1;7 +MULTIHARDLINK 33;1 +NORMAL 0 +ORPHAN 31;1;7 +OTHER_WRITABLE 32;1;7 +SETGID 33;1;7 +SETUID 42;1 +SOCK 35;1 +STICKY 44;1 +STICKY_OTHER_WRITABLE 36;1;7 +# }}} +# documents {{{1 +*README 38;5;16 +*README.rst 38;5;16 +*README.md 38;5;16 +*LICENSE 38;5;16 +*COPYING 38;5;16 +*INSTALL 38;5;16 +*COPYRIGHT 38;5;16 +*AUTHORS 38;5;16 +*HISTORY 38;5;16 +*CONTRIBUTORS 38;5;16 +*PATENTS 38;5;16 +*VERSION 38;5;16 +*NOTICE 38;5;16 +*CHANGES 38;5;16 +.log 38;5;16 +# plain-text {{{2 +.txt 0 +# markup {{{2 +.etx 38;5;16 +.info 38;5;16 +.markdown 38;5;16 +.md 38;5;16 +.mkd 38;5;16 +.nfo 38;5;16 +.pod 38;5;16 +.rst 38;5;16 +.tex 38;5;16 +.textile 38;5;16 +# key-value, non-relational data {{{2 +.bib 33 +.json 33 +.jsonl 33 +.ndjson 33 +.msg 33 +.pgn 33 +.rss 33 +.xml 33 +.fxml 33 +.toml 33 +.yaml 33 +.yml 33 +.RData 33 +.rdata 33 +.xsd 33 +.dtd 33 +.sgml 33 +.rng 33 +.rnc 33 +# }}} +# binary {{{2 +.cbr 35 +.cbz 35 +.chm 35 +.djvu 35 +.pdf 35 +.PDF 35 +.mobi 35 +.epub 35 +# words {{{3 +.docm 35;4 +.doc 35 +.docx 35 +.odb 35 +.odt 35 +.rtf 35 +# presentation {{{3 +.odp 38;5;16;1 +.pps 38;5;16;1 +.ppt 38;5;16;1 +.pptx 38;5;16;1 +# Powerpoint show +.ppts 38;5;16;1 +# Powerpoint with enabled macros +.pptxm 38;5;16;1;4 +# Powerpoint show with enabled macros +.pptsm 38;5;16;1;4 +# spreadsheet {{{3 +.csv 32 +.tsv 32 +# Open document spreadsheet +.ods 32 +.xla 32 +# Excel spreadsheet +.xls 32 +.xlsx 32 +# Excel spreadsheet with macros +.xlsxm 32;4 +# Excel module +.xltm 32;4 +.xltx 32 +# }}} +# }}} +# configs {{{2 +*config 1 +*cfg 1 +*conf 1 +*rc 1 +*authorized_keys 1 +*known_hosts 1 +.ini 1 +.plist 1 +# vim +.viminfo 1 +# cisco VPN client configuration +.pcf 1 +# adobe photoshop proof settings file +.psf 1 +# Sublime Text config +.hidden-color-scheme 1 +.hidden-tmTheme 1 +.last-run 1 +.merged-ca-bundle 1 +.sublime-build 1 +.sublime-commands 1 +.sublime-keymap 1 +.sublime-settings 1 +.sublime-snippet 1 +.sublime-project 1 +.sublime-workspace 1 +.tmTheme 1 +.user-ca-bundle 1 +# eclipse +.epf 1 +# }}} +# }}} +# code {{{1 +# version control {{{2 +.git 35 +.gitignore 38;5;8 +.gitattributes 38;5;8 +.gitmodules 38;5;8 + +# shell {{{2 +.awk 32;1 +.bash 32;1 +.bat 32;1 +.BAT 32;1 +.sed 32;1 +.sh 32;1 +.zsh 32;1 +.vim 32;1 + +# interpreted {{{2 +.ahk 38;5;71 +# python +.py 38;5;71 +.ipynb 38;5;71 +# ruby +.rb 38;5;71 +.gemspec 38;5;71 +# perl +.pl 36 +.PL 36 +.t 36 +# sql +.msql 33 +.mysql 33 +.pgsql 33 +.sql 33 +# Tool Command Language +.tcl 38;5;71 +# R language +.r 36 +.R 36 +# Clojure +.clj 38;5;71 +.cljs 38;5;71 +.cljc 38;5;71 +# Clojure gorilla REPL worksheet +.cljw 38;5;71 +# Scala +.scala 38;5;71 +# Dart +.dart 36 + +# compiled {{{2 +# +# assembly language +.asm 34 +# LISP +.cl 34 +.lisp 34 +.rkt 34 +# lua +.lua 34 +# Moonscript +.moon 34 +# C +.c 34 +.C 34 +.h 34 +.H 34 +.tcc 34 +# C++ +.c++ 34 +.h++ 34 +.hpp 34 +.hxx 34 +.ii 34 +# method file for Objective C +.M 34 +.m 34 +# Csharp +.cc 34 +.cs 34 +.cp 34 +.cpp 34 +.cxx 34 +# Crystal +.cr 34 +# Google golang +.go 34 +# fortran +.f 34 +.F 34 +.for 34 +.ftn 34 +.f90 34 +.F90 34 +.f95 34 +.F95 34 +.f03 34 +.F03 34 +.f08 34 +.F08 34 +# Nim +.nim 34 +.nimble 34 +# pascal +.s 34 +.S 34 +# Rust +.rs 34 +# AppleScript +.scpt 35 +# Swift +.swift 35 +# ? +.sx 34 +# Vala +.vala 34 +.vapi 34 +# interface file in GHC - https://github.com/trapd00r/LS_COLORS/pull/9 +.hi 34 +# haskell +.hs 34 +.lhs 34 +# agda +.agda 34 +.lagda 34 +.lagda.tex 34 +.lagda.rst 34 +.lagda.md 34 +.agdai 34 +# Zig +.zig 34 + +# binaries {{{2 +# compiled apps for interpreted languages +.pyc 38;5;8 +# }}} +# orchestration {{{2 +.tf 35 +.tfstate 35 +.tfvars 35 +# orchestration 2}}} +# html {{{2 +.css 38;5;16 +.less 38;5;16 +.sass 38;5;16 +.scss 38;5;16 +.htm 38;5;16 +.html 38;5;16 +.jhtm 38;5;16 +.mht 38;5;16 +.eml 38;5;16 +.mustache 38;5;16 +# }}} +# java {{{2 +.coffee 34 +.java 34 +.js 34 +.mjs 34 +.jsm 34 +.jsp 34 +# }}} +# php {{{2 +.php 34 +# CakePHP view scripts and helpers +.ctp 34 +# Twig template engine +.twig 34 +# }}} +# vb/a {{{2 +.vb 34 +.vba 34 +.vbs 34 +# 2}}} +# Build stuff {{{2 +*Dockerfile 38;5;71 +.dockerignore 38;5;8 +*Makefile 38;5;71 +*MANIFEST 38;5;8 +*pm_to_blib 38;5;8 +# Functional Configuration +.nix 38;5;71 +.dhall 38;5;16 +# ruby rake +.rake 38;5;71 +# automake +.am 38;5;8 +.in 38;5;8 +.hin 38;5;8 +.scan 38;5;8 +.m4 38;5;8 +.old 38;5;8 +.out 38;5;8 +.SKIP 38;5;8 +# }}} +# patch files {{{2 +.diff 38;5;17 +.patch 38;5;17 +#}}} +# graphics {{{1 +.bmp 35 +.dicom 35 +.tiff 35 +.tif 35 +.TIFF 35 +.cdr 35 +.flif 35 +.gif 35 +.icns 35 +.ico 35 +.jpeg 35 +.JPG 35 +.jpg 35 +.nth 35 +.png 35 +.psd 35 +.pxd 35 +.pxm 35 +.xpm 35 +.webp 35 +# }}} +# vector {{{1 +.ai 35 +.eps 35 +.epsf 35 +.drw 35 +.ps 35 +.svg 35 +# }}} +# video {{{1 +.avi 35 +.divx 35 +.IFO 35 +.m2v 35 +.m4v 35 +.mkv 35 +.MOV 35 +.mov 35 +.mp4 35 +.mpeg 35 +.mpg 35 +.ogm 35 +.rmvb 35 +.sample 35 +.wmv 35 + # mobile/streaming {{{2 +.3g2 35 +.3gp 35 +.gp3 35 +.webm 35 +.gp4 35 +.asf 35 +.flv 35 +.ts 35 +.ogv 35 +.f4v 35 + # }}} + # lossless {{{2 +.VOB 35 +.vob 35 +# }}} +# subtitles {{{1 +.ass 33 +.srt 33 +.ssa 33 +.sub 33 +.sup 33 # bitmap image track +.vtt 33 +#}}} +# audio {{{1 +.3ga 36 +.S3M 36 +.aac 36 +.amr 36 +.au 36 +.caf 36 +.dat 36 +.dts 36 +.fcm 36 +.m4a 36 +.mid 36 +.mod 36 +.mp3 36 +.mp4a 36 +.oga 36 +.ogg 36 +.opus 36 +.s3m 36 +.sid 36 +.wma 36 +# lossless +.ape 36 +.aiff 36 +.cda 36 +.flac 36 +.alac 36 +.midi 36 +.pcm 36 +.wav 36 +.wv 36 +.wvc 36 + +# }}} +# fonts {{{1 +.afm 34 +.fon 34 +.fnt 34 +.pfb 34 +.pfm 34 +.ttf 34 +.otf 34 +# Web Open Font Format +.woff 34 +.woff2 34 +# postscript fonts +.PFA 34 +.pfa 34 +# }}} +# archives {{{1 +.7z 31 +.a 31 +.arj 31 +.bz2 31 +.cpio 31 +.gz 31 +.lrz 31 +.lz 31 +.lzma 31 +.lzo 31 +.rar 31 +.s7z 31 +.sz 31 +.tar 31 +.tgz 31 +.xz 31 +.z 31 +.zip 31 +.zipx 31 +.zoo 31 +.zpaq 31 +.zst 31 +.zstd 31 +.zz 31 + # packaged apps {{{2 +.apk 31 +.ipa 31 +.deb 31 +.rpm 31 +.jad 31 +.jar 31 +.cab 31 +.pak 31 +.pk3 31 +.vdf 31 +.vpk 31 +.bsp 31 +.dmg 31 + # }}} + # segments from 0 to three digits after first extension letter {{{2 +.r[0-9]{0,2} 31 +.zx[0-9]{0,2} 31 +.z[0-9]{0,2} 31 +# partial files +.part 38;5;8 + # }}} +# partition images {{{2 +.iso 31 +.bin 31 +.nrg 31 +.qcow 31 +.sparseimage 31 +.toast 31 +.vcd 31 +.vmdk 31 +# }}} +# databases {{{2 +.accdb 35 +.accde 35 +.accdr 35 +.accdt 35 +.db 35 +.fmp12 35 +.fp7 35 +.localstorage 35 +.mdb 35 +.mde 35 +.sqlite 35 +.typelib 35 +# NetCDF database +.nc 35 +# }}} +# tempfiles {{{1 +# undo files +.pacnew 34;1;7 +.un~ 38;5;8 +.orig 38;5;8 +# backups +.BUP 38;5;8 +.bak 38;5;8 +.o 38;5;8 # *nix Object file (shared libraries, core dumps etc) +*core 38;5;8 # Linux user core dump file (from /proc/sys/kernel/core_pattern) +.mdump 38;5;8 # Mini DuMP crash report +.rlib 38;5;8 # Static rust library +.dll 38;5;8 # dynamic linked library +# temporary files +.swp 38;5;8 +.swo 38;5;8 +.tmp 38;5;8 +.sassc 38;5;8 +# state files +.pid 38;5;20 +.state 38;5;20 +*lockfile 38;5;20 +*lock 38;5;20 +# error logs +.err 31;1 +.error 31;1 +.stderr 31;1 +# state dumps +.aria2 38;5;8 +.dump 38;5;8 +.stackdump 38;5;8 +.zcompdump 38;5;8 +.zwc 38;5;8 +# tcpdump, network traffic capture +.pcap 36 +.cap 36 +.dmp 36 +# macOS +.DS_Store 38;5;8 +.localized 38;5;8 +.CFUserTextEncoding 38;5;8 +# }}} +# hosts {{{1 +# /etc/hosts.{deny,allow} +.allow 32 +.deny 31 +# }}} +# systemd {{{1 +# http://www.freedesktop.org/software/systemd/man/systemd.unit.html +.service 34 +*@.service 34 +.socket 34 +.swap 34 +.device 34 +.mount 34 +.automount 34 +.target 34 +.path 34 +.timer 34 +.snapshot 34 +# }}} +# metadata {{{1 +.application 36 +.cue 36 +.description 36 +.directory 36 +.m3u 36 +.m3u8 36 +.md5 36 +.properties 36 +.sfv 36 +.theme 36 +.torrent 36 +.urlview 36 +.webloc 36 +.lnk 36 +# }}} +# macOS files {{{1 +*CodeResources 38;5;8 # code signing apps +*PkgInfo 38;5;8 # app bundle id +.nib 35 # UI +.car 35 # asset catalog +.dylib 38;5;8 # shared lib +# Xcode files {{{2 +.entitlements 38;5;20 +.pbxproj 38;5;20 +.strings 38;5;20 +.storyboard 31 +.xcconfig 38;5;20 +.xcsettings 38;5;20 +.xcuserstate 38;5;20 +.xcworkspacedata 38;5;20 +.xib 38;5;16 +# }}} +# }}} +# encrypted data {{{1 +.asc 32 +.bfe 32 +.enc 32 +.gpg 32 +.signature 32 +.sig 32 +.p12 32 +.pem 32 +.pgp 32 +.p7s 32 +*id_dsa 32 +*id_rsa 32 +*id_ecdsa 32 +*id_ed25519 32 +# 1}}} +# emulators {{{1 +.32x 35 +.cdi 35 +.fm2 35 +.rom 35 +.sav 35 +.st 35 + # atari +.a00 35 +.a52 35 +.A64 35 +.a64 35 +.a78 35 +.adf 35 +.atr 35 + # nintendo +.gb 35 +.gba 35 +.gbc 35 +.gel 35 +.gg 35 +.ggl 35 +.ipk 35 # Nintendo (DS Packed Images) +.j64 35 +.nds 35 +.nes 35 + # Sega +.sms 35 +# }}} +# Texas Instruments Calculator files {{{1 +# for more see http://tibasicdev.wikidot.com/file-extensions +.8xp 35 +.8eu 35 +.82p 35 +.83p 35 +.8xe 35 +# }}} +# 3D printing {{{1 +.stl 38;5;17 +.dwg 38;5;17 +.ply 38;5;17 +.wrl 38;5;17 +# }}} +# unsorted {{{1 +# +# Portable Object Translation for GNU Gettext +.pot 0 +# CAD files for printed circuit boards +.pcb 38;5;17 +# groff (rendering app for texinfo) +.mm 0 +# GIMP files +.gbr 35 +.scm 35 +.xcf 35 +# printer spool file +.spl 0 +# RStudio project file +.Rproj 36 +# Nokia Symbian OS files +.sis 0 + +.1p 0 +.3p 0 +.cnc 0 +.def 0 +.ex 0 +.example 0 +.feature 0 +.ger 0 +.ics 0 # calendar information +.map 0 +.mf 0 +.mfasl 0 +.mi 0 +.mtx 0 +.pc 0 +.pi 0 +.plt 0 +.pm 0 +.rdf 0 +.ru 0 +.sch 0 +.sty 0 +.sug 0 +.tdy 0 +.tfm 0 +.tfnt 0 +.tg 0 +.vcard 0 +.vcf 0 #contact information +.xln 0 +# AppCode files +.iml 0 +# }}} +# termcap {{{1 +TERM ansi +TERM color-xterm +TERM con132x25 +TERM con132x30 +TERM con132x43 +TERM con132x60 +TERM con80x25 +TERM con80x28 +TERM con80x30 +TERM con80x43 +TERM con80x50 +TERM con80x60 +TERM cons25 +TERM console +TERM cygwin +TERM dtterm +TERM Eterm +TERM eterm-color +TERM gnome +TERM gnome-256color +TERM jfbterm +TERM konsole +TERM kterm +TERM linux +TERM linux-c +TERM mach-color +TERM mlterm +TERM putty +TERM rxvt +TERM rxvt-256color +TERM rxvt-cygwin +TERM rxvt-cygwin-native +TERM rxvt-unicode +TERM rxvt-unicode-256color +TERM rxvt-unicode256 +TERM screen +TERM screen-256color +TERM screen-256color-bce +TERM screen-bce +TERM screen-w +TERM screen.linux +TERM screen.rxvt +TERM terminator +TERM vt100 +TERM xterm +TERM xterm-16color +TERM xterm-256color +TERM xterm-88color +TERM xterm-color +TERM xterm-debian +TERM xterm-kitty +# }}} diff --git a/base/zsh/k.zsh b/base/zsh/k.zsh index fe80c3c..0b2cc5e 100644 --- a/base/zsh/k.zsh +++ b/base/zsh/k.zsh @@ -8,53 +8,100 @@ k () { # Stop stat failing when a directory contains either no files or no hidden files # Track if we _accidentally_ create a new global variable - setopt local_options null_glob typeset_silent no_auto_pushd + setopt local_options null_glob typeset_silent no_auto_pushd nomarkdirs pushd_silent + unsetopt pushd_ignore_dups # Process options and get files/directories - typeset -a o_all o_almost_all o_raw o_si o_directory o_no_directory o_no_vcs o_help - #typeset -a o_all o_almost_all o_human o_si o_directory o_no_directory o_no_vcs o_help + typeset -a o_all o_almost_all o_raw o_si o_directory o_mix_directories \ + o_no_directory o_no_vcs o_sort o_sort_reverse o_help + #typeset -a o_all o_almost_all o_human o_si o_directory o_group_directories \ + # o_no_directory o_no_vcs o_sort o_sort_reverse o_help zparseopts -E -D \ a=o_all -all=o_all \ A=o_almost_all -almost-all=o_almost_all \ + c=o_sort \ d=o_directory -directory=o_directory \ - r=o_raw -raw-size=o_raw \ + -mix-directories=o_mix_directories \ + b=o_raw -raw-size=o_raw \ -si=o_si \ n=o_no_directory -no-directory=o_no_directory \ -no-vcs=o_no_vcs \ + r=o_sort_reverse -reverse=o_sort_reverse \ + -sort:=o_sort \ + S=o_sort \ + t=o_sort \ + u=o_sort \ + U=o_sort \ -help=o_help + #-group-directories-first=o_group_directories \ #h=o_human -human=o_human \ # Print Help if bad usage, or they asked for it - if [[ $? != 0 || "$o_help" != "" ]] + if [[ $? != 0 || -n "$o_help" ]] then print -u2 "Usage: k [options] DIR" print -u2 "Options:" - print -u2 "\t-a --all list entries starting with ." - print -u2 "\t-A --almost-all list all except . and .." - print -u2 "\t-d --directory list only directories" - print -u2 "\t-n --no-directory do not list directories" - #print -u2 "\t-h --human show filesizes in human-readable format" - print -u2 "\t-r --raw-size show filesizes in byte format" - print -u2 "\t --si with -h, use powers of 1000 not 1024" - print -u2 "\t --no-vcs do not get VCS status (much faster)" - print -u2 "\t --help show this help" + print -u2 "\t-a --all list entries starting with ." + print -u2 "\t-A --almost-all list all except . and .." + print -u2 "\t-c sort by ctime (inode change time)" + print -u2 "\t-d --directory list only directories" + print -u2 "\t-n --no-directory do not list directories" + print -u2 "\t --mix-directories do not group directories first" + #print -u2 "\t-h --human show filesizes in human-readable format" + print -u2 "\t-b --raw-size show filesizes in byte format" + print -u2 "\t --si with -h, use powers of 1000 not 1024" + print -u2 "\t-r --reverse reverse sort order" + print -u2 "\t-S sort by size" + print -u2 "\t-t sort by time (modification time)" + print -u2 "\t-u sort by atime (use or access time)" + print -u2 "\t-U Unsorted" + print -u2 "\t --sort WORD sort by WORD: none (U), size (S)," + print -u2 "\t time (t), ctime or status (c)," + print -u2 "\t atime or access or use (u)" + print -u2 "\t --no-vcs do not get VCS status (much faster)" + print -u2 "\t --help show this help" return 1 fi # Check for conflicts - if [[ "$o_directory" != "" && "$o_no_directory" != "" ]]; then + if [[ -n "$o_directory" && -n "$o_no_directory" ]]; then print -u2 "$o_directory and $o_no_directory cannot be used together" return 1 fi + # case is like a mnemonic for sort order: + # lower-case for standard, upper-case for descending + local S_ORD="o" R_ORD="O" SPEC="n" # default: by name + + # translate ls options to glob-qualifiers, + # ignoring "--sort" prefix of long-args form + case ${o_sort:#--sort} in + -U|none) SPEC="N";; + -t|time) SPEC="m";; + -c|ctime|status) SPEC="c";; + -u|atime|access|use) SPEC="a";; + # reverse default order for sort by size + -S|size) S_ORD="O" R_ORD="o" SPEC="L";; + esac + + if [[ -z "$o_sort_reverse" ]]; then + typeset SORT_GLOB="${S_ORD}${SPEC}" + else + typeset SORT_GLOB="${R_ORD}${SPEC}" + fi + #if [[ -n "$o_group_directories" ]]; then + if [[ -z "$o_mix_directories" ]]; then + SORT_GLOB="oe:[[ -d \$REPLY ]];REPLY=\$?:$SORT_GLOB" + fi + # Check which numfmt available (if any), warn user if not available typeset -i numfmt_available=0 typeset -i gnumfmt_available=0 - #if [[ "$o_human" != "" ]]; then - if [[ "$o_raw" == "" ]]; then - if [[ $+commands[numfmt] == 1 ]]; then + #if [[ -n "$o_human" ]]; then + if [[ -z "$o_raw" ]]; then + if (( $+commands[numfmt] )); then numfmt_available=1 - elif [[ $+commands[gnumfmt] == 1 ]]; then + elif (( $+commands[gnumfmt] )); then gnumfmt_available=1 else print -u2 "'numfmt' or 'gnumfmt' command not found, human readable output will not work." @@ -69,32 +116,26 @@ k () { # Create numfmt local function numfmt_local () { - if [[ "$o_si" != "" ]]; then - if (( $numfmt_available )); then + if [[ -n "$o_si" ]]; then + if (( numfmt_available )); then numfmt --to=si $1 - elif (( $gnumfmt_available )); then + elif (( gnumfmt_available )); then gnumfmt --to=si $1 fi else - if (( $numfmt_available )); then + if (( numfmt_available )); then numfmt --to=iec $1 - elif (( $gnumfmt_available )); then + elif (( gnumfmt_available )); then gnumfmt --to=iec $1 fi fi } - # Set if we're in a repo or not - typeset -i INSIDE_WORK_TREE=0 - if [[ $(command git rev-parse --is-inside-work-tree 2>/dev/null) == true ]]; then - INSIDE_WORK_TREE=1 - fi - # Setup array of directories to print typeset -a base_dirs typeset base_dir - if [[ "$@" == "" ]]; then + if [[ -z "$@" ]]; then base_dirs=. else base_dirs=($@) @@ -104,17 +145,18 @@ k () { # Colors # ---------------------------------------------------------------------------- # default colors - K_COLOR_DI="0;34" # di:directory - K_COLOR_LN="0;35" # ln:symlink - K_COLOR_SO="0;32" # so:socket - K_COLOR_PI="0;33" # pi:pipe - K_COLOR_EX="0;31" # ex:executable - K_COLOR_BD="34;46" # bd:block special - K_COLOR_CD="34;43" # cd:character special - K_COLOR_SU="30;41" # su:executable with setuid bit set - K_COLOR_SG="30;46" # sg:executable with setgid bit set + K_COLOR_DI="01;34" # di:directory + K_COLOR_LN="01;36" # ln:symlink + K_COLOR_SO="01;35" # so:socket + K_COLOR_PI="40;33" # pi:pipe + K_COLOR_EX="01;32" # ex:executable + K_COLOR_BD="40;33;01" # bd:block special + K_COLOR_CD="40;33;01" # cd:character special + K_COLOR_SU="37;41" # su:executable with setuid bit set + K_COLOR_SG="30;43" # sg:executable with setgid bit set K_COLOR_TW="30;42" # tw:directory writable to others, with sticky bit - K_COLOR_OW="30;43" # ow:directory writable to others, without sticky bit + K_COLOR_OW="34;42" # ow:directory writable to others, without sticky bit + K_COLOR_BR="00;90" # branch # read colors if osx and $LSCOLORS is defined if [[ $(uname) == 'Darwin' && -n $LSCOLORS ]]; then @@ -132,11 +174,6 @@ k () { K_COLOR_OW=$(_k_bsd_to_ansi $LSCOLORS[21] $LSCOLORS[22]) fi - # read colors if linux and $LS_COLORS is defined - # if [[ $(uname) == 'Linux' && -n $LS_COLORS ]]; then - - # fi - # ---------------------------------------------------------------------------- # Loop over passed directories and files to display # ---------------------------------------------------------------------------- @@ -145,7 +182,7 @@ k () { # ---------------------------------------------------------------------------- # Display name if multiple paths were passed # ---------------------------------------------------------------------------- - if [[ "$#base_dirs" > 1 ]]; then + if (( $#base_dirs > 1 )); then # Only add a newline if its not the first iteration if [[ "$base_dir" != "${base_dirs[1]}" ]]; then print @@ -164,7 +201,7 @@ k () { typeset -i TOTAL_BLOCKS=0 - MAX_LEN=(0 0 0 0 0 0) + MAX_LEN=(0 0 0 0 0 0 0) # Array to hold results from `stat` call RESULTS=() @@ -173,32 +210,44 @@ k () { typeset -i IS_GIT_REPO=0 typeset GIT_TOPLEVEL - typeset -i LARGE_FILE_COLOR=196 + #typeset -i LARGE_FILE_COLOR=196 + typeset -i LARGE_FILE_COLOR=1 typeset -a SIZELIMITS_TO_COLOR SIZELIMITS_TO_COLOR=( - 1024 46 # <= 1kb - 2048 82 # <= 2kb - 3072 118 # <= 3kb - 5120 154 # <= 5kb - 10240 190 # <= 10kb - 20480 226 # <= 20kb - 40960 220 # <= 40kb - 102400 214 # <= 100kb - 262144 208 # <= 0.25mb || 256kb - 524288 202 # <= 0.5mb || 512kb + # 1024 46 # <= 1kb + # 2048 82 # <= 2kb + # 3072 118 # <= 3kb + # 5120 154 # <= 5kb + # 10240 190 # <= 10kb + # 20480 226 # <= 20kb + # 40960 220 # <= 40kb + #102400 214 # <= 100kb + #262144 208 # <= 0.25mb || 256kb + #524288 202 # <= 0.5mb || 512kb + 3072 71 # <= 3kb + 51200 2 # <= 50kb + 262144 3 # <= 0.25mb || 256kb + 524288 16 # <= 0.5mb || 512kb ) - typeset -i ANCIENT_TIME_COLOR=236 # > more than 2 years old + #typeset -i ANCIENT_TIME_COLOR=236 # > more than 2 years old + typeset -i ANCIENT_TIME_COLOR=18 # > more than 2 years old typeset -a FILEAGES_TO_COLOR FILEAGES_TO_COLOR=( - 0 196 # < in the future, #spooky - 60 255 # < less than a min old - 3600 252 # < less than an hour old - 86400 250 # < less than 1 day old - 604800 244 # < less than 1 week old - 2419200 244 # < less than 28 days (4 weeks) old - 15724800 242 # < less than 26 weeks (6 months) old - 31449600 240 # < less than 1 year old - 62899200 238 # < less than 2 years old + # 0 196 # < in the future, #spooky + # 60 255 # < less than a min old + # 3600 252 # < less than an hour old + # 86400 250 # < less than 1 day old + # 604800 244 # < less than 1 week old + # 2419200 244 # < less than 28 days (4 weeks) old + #15724800 242 # < less than 26 weeks (6 months) old + #31449600 240 # < less than 1 year old + #62899200 238 # < less than 2 years old + 0 1 # < in the future, #spooky + 3600 21 # < less than an hour old + 86400 7 # < less than 1 day old + 604800 20 # < less than 1 week old + 2419200 8 # < less than 28 days (4 weeks) old + 31449600 19 # < less than 1 year old ) # ---------------------------------------------------------------------------- @@ -211,38 +260,49 @@ k () { # Check if it even exists if [[ ! -e $base_dir ]]; then print -u2 "k: cannot access $base_dir: No such file or directory" + continue # If its just a file, skip the directory handling elif [[ -f $base_dir ]]; then show_list=($base_dir) #Directory, add its contents - else + elif pushd $base_dir 2>/dev/null; then + # Set if we're in a repo or not + typeset -i INSIDE_WORK_TREE=0 + if $(git rev-parse --is-inside-work-tree 2> /dev/null); then + INSIDE_WORK_TREE=1 + GIT_TOPLEVEL=$(git rev-parse --show-toplevel) + fi + # Break total blocks of the front of the stat call, then push the rest to results - if [[ "$o_all" != "" && "$o_almost_all" == "" && "$o_no_directory" == "" ]]; then - show_list+=($base_dir/.) - show_list+=($base_dir/..) + if [[ -n "$o_all" && -z "$o_almost_all" && -z "$o_no_directory" ]]; then + show_list+=(.) + show_list+=(..) fi - if [[ "$o_all" != "" || "$o_almost_all" != "" ]]; then - if [[ "$o_directory" != "" ]]; then - show_list+=($base_dir/*(D/)) - elif [[ "$o_no_directory" != "" ]]; then + if [[ -n "$o_all" || -n "$o_almost_all" ]]; then + if [[ -n "$o_directory" ]]; then + show_list+=(*(D/$SORT_GLOB)) + elif [[ -n "$o_no_directory" ]]; then #Use (^/) instead of (.) so sockets and symlinks get displayed - show_list+=($base_dir/*(D^/)) + show_list+=(*(D^/$SORT_GLOB)) else - show_list+=($base_dir/*(D)) + show_list+=(*(D$SORT_GLOB)) fi else - if [[ "$o_directory" != "" ]]; then - show_list+=($base_dir/*(/)) - elif [[ "$o_no_directory" != "" ]]; then + if [[ -n "$o_directory" ]]; then + show_list+=(*(/$SORT_GLOB)) + elif [[ -n "$o_no_directory" ]]; then #Use (^/) instead of (.) so sockets and symlinks get displayed - show_list+=($base_dir/*(^/)) + show_list+=(*(^/$SORT_GLOB)) else - show_list+=($base_dir/*) + show_list+=(*($SORT_GLOB)) fi fi + else + print -u2 "k: permission denied: $base_dir" + continue fi # ---------------------------------------------------------------------------- @@ -260,7 +320,7 @@ k () { typeset -A $statvar zstat -H $statvar -Lsn -F "%s^%d^%b^%H:%M^%Y" -- "$fn" # use lstat, render mode/uid/gid to strings STATS_PARAMS_LIST+=($statvar) - i+=1 + (( i++ )) done @@ -273,14 +333,18 @@ k () { if [[ ${#sv[uid]} -gt $MAX_LEN[3] ]]; then MAX_LEN[3]=${#sv[uid]} ; fi if [[ ${#sv[gid]} -gt $MAX_LEN[4] ]]; then MAX_LEN[4]=${#sv[gid]} ; fi - #if [[ "$o_human" != "" ]]; then - if [[ "$o_raw" == "" ]]; then + #if [[ -n "$o_human" ]]; then + if [[ -z "$o_raw" ]]; then h=$(numfmt_local ${sv[size]}) if (( ${#h} > $MAX_LEN[5] )); then MAX_LEN[5]=${#h}; fi else if [[ ${#sv[size]} -gt $MAX_LEN[5] ]]; then MAX_LEN[5]=${#sv[size]}; fi fi + LNAME="${sv[name]}" + if [[ -n ${sv[link]} ]]; then LNAME="$LNAME -> ${sv[link]}"; fi + if [[ ${#LNAME} -gt $MAX_LEN[6] ]]; then MAX_LEN[6]=${#LNAME}; fi + TOTAL_BLOCKS+=$sv[blocks] done @@ -292,6 +356,7 @@ k () { # ---------------------------------------------------------------------------- typeset REPOMARKER + typeset REPOBRANCH typeset PERMISSIONS HARDLINKCOUNT OWNER GROUP FILESIZE FILESIZE_OUT DATE NAME SYMLINK_TARGET typeset FILETYPE PER1 PER2 PER3 PERMISSIONS_OUTPUT STATUS typeset TIME_DIFF TIME_COLOR DATE_OUTPUT @@ -305,6 +370,7 @@ k () { # We check if the result is a git repo later, so set a blank marker indication the result is not a git repo REPOMARKER=" " + REPOBRANCH="" IS_DIRECTORY=0 IS_SYMLINK=0 IS_SOCKET=0 @@ -342,27 +408,9 @@ k () { # IS_GIT_REPO is a 1 if $NAME is a file/directory in a git repo, OR if $NAME is a git-repo itself # GIT_TOPLEVEL is set to the directory containing the .git folder of a git-repo - # is this a git repo - if [[ "$o_no_vcs" != "" ]]; then - IS_GIT_REPO=0 - GIT_TOPLEVEL='' - else - if (( IS_DIRECTORY )); - then builtin cd -q $NAME 2>/dev/null || builtin cd -q - >/dev/null && IS_GIT_REPO=0 #Say no if we don't have permissions there - else builtin cd -q $NAME:a:h 2>/dev/null || builtin cd -q - >/dev/null && IS_GIT_REPO=0 - fi - if [[ $(command git rev-parse --is-inside-work-tree 2>/dev/null) == true ]]; then - IS_GIT_REPO=1 - GIT_TOPLEVEL=$(command git rev-parse --show-toplevel) - else - IS_GIT_REPO=0 - fi - builtin cd -q - >/dev/null - fi - # Get human readable output if necessary - #if [[ "$o_human" != "" ]]; then - if [[ "$o_raw" == "" ]]; then + #if [[ -n "$o_human" ]]; then + if [[ -z "$o_raw" ]]; then # I hate making this call twice, but its either that, or do a bunch # of calculations much earlier. FILESIZE_OUT=$(numfmt_local $FILESIZE) @@ -395,14 +443,11 @@ k () { PERMISSIONS_OUTPUT="$FILETYPE$PER1$PER2$PER3" # -------------------------------------------------------------------------- - # Colour the symlinks - # -------------------------------------------------------------------------- - - # -------------------------------------------------------------------------- - # Colour Owner and Group + # Colour Hardlinkcound, Owner and Group # -------------------------------------------------------------------------- - OWNER=$'\e[38;5;241m'"$OWNER"$'\e[0m' - GROUP=$'\e[38;5;241m'"$GROUP"$'\e[0m' + HARDLINKCOUNT=$'\e[38;5;19m'"$HARDLINKCOUNT"$'\e[0m' + OWNER=$'\e[38;5;8m'"$OWNER"$'\e[0m' + GROUP=$'\e[38;5;8m'"$GROUP"$'\e[0m' # -------------------------------------------------------------------------- # Colour file weights @@ -444,38 +489,62 @@ k () { # -------------------------------------------------------------------------- # Colour the repomarker # -------------------------------------------------------------------------- - if [[ "$o_no_vcs" != "" ]]; then - REPOMARKER="" - elif (( IS_GIT_REPO != 0)); then - # If we're not in a repo, still check each directory if it's a repo, and - # then mark appropriately - if (( INSIDE_WORK_TREE == 0 )); then - if (( IS_DIRECTORY )); then - if command git --git-dir="$GIT_TOPLEVEL/.git" --work-tree="${NAME}" diff --stat --quiet --ignore-submodules HEAD &>/dev/null # if dirty - then REPOMARKER=$'\e[38;5;46m|\e[0m' # Show a green vertical bar for clean - else REPOMARKER=$'\e[0;31m+\e[0m' # Show a red vertical bar if dirty - fi - fi - else - if (( IS_DIRECTORY )); then - # If the directory isn't ignored or clean, we'll just say it's dirty - if command git check-ignore --quiet ${NAME} 2>/dev/null; then STATUS='!!' - elif command git diff --stat --quiet --ignore-submodules ${NAME} 2> /dev/null; then STATUS=''; - else STATUS=' M' + # GIT_TOPLEVEL is set to the directory containing the .git folder of a git-repo + + # is this a git repo + if [[ -n "$o_no_vcs" ]]; then + STATUS='N' + elif (( IS_DIRECTORY )); then + if pushd $NAME 2>/dev/null; then + if $(git rev-parse --is-inside-work-tree 2>/dev/null); then + # If we're not in a repo, still check each directory if it's a repo, and + # then mark appropriately + if (( INSIDE_WORK_TREE == 0 )); then + REPOBRANCH="[$(git rev-parse --abbrev-ref HEAD 2>/dev/null)]" + if git diff --stat --quiet --ignore-submodules HEAD &>/dev/null # if dirty + then STATUS='' # Show a green vertical bar for clean + else STATUS='D' # Show a red vertical bar if dirty + fi + popd >/dev/null + else + popd >/dev/null + # If the directory isn't ignored or clean, we'll just say it's dirty + if git check-ignore --quiet ${NAME} 2>/dev/null; then STATUS='!!' + elif git diff --stat --quiet --ignore-submodules ${NAME} 2> /dev/null; then STATUS='' + else STATUS='D' + fi fi else - # File - STATUS=$(command git status --porcelain --ignored --untracked-files=normal $GIT_TOPLEVEL/${${${NAME:a}##$GIT_TOPLEVEL}#*/}) - fi - STATUS=${STATUS[1,2]} - if [[ $STATUS == ' M' ]]; then REPOMARKER=$'\e[0;31m+\e[0m'; # Tracked & Dirty - elif [[ $STATUS == 'M ' ]]; then REPOMARKER=$'\e[38;5;082m+\e[0m'; # Tracked & Dirty & Added - elif [[ $STATUS == '??' ]]; then REPOMARKER=$'\e[38;5;214m+\e[0m'; # Untracked - elif [[ $STATUS == '!!' ]]; then REPOMARKER=$'\e[38;5;238m|\e[0m'; # Ignored - elif [[ $STATUS == 'A ' ]]; then REPOMARKER=$'\e[38;5;082m+\e[0m'; # Added - else REPOMARKER=$'\e[38;5;082m|\e[0m'; # Good + STATUS='N' + popd >/dev/null fi + else + STATUS='N' fi + elif (( INSIDE_WORK_TREE )); then + # File + STATUS=${$(git status --porcelain --ignored --untracked-files=normal $GIT_TOPLEVEL/${${${NAME:a}##$GIT_TOPLEVEL}#*/})[1]} + else + STATUS='N' + fi + case "$STATUS" in + (D) REPOMARKER=$'\e[0;31m+\e[0m';; # Tracked & Dirty + (M) REPOMARKER=$'\e[0;32m+\e[0m';; # Tracked & Dirty & Added + (\?\?) REPOMARKER=$'\e[38;5;16m+\e[0m';; # Untracked + (!!) REPOMARKER=$'\e[38;5;19|\e[0m';; # Ignored + (A) REPOMARKER=$'\e[0;32m+\e[0m';; # Added + (N) REPOMARKER=' ';; # Not a repo + (*) REPOMARKER=$'\e[0;32m|\e[0m';; # Clean + esac + + # -------------------------------------------------------------------------- + # Colour branch + # -------------------------------------------------------------------------- + if [[ -n $REPOBRANCH ]]; then + REPOPAD="'$NAME" + if [[ -n $SYMLINK_TARGET ]]; then REPOPAD="$REPOPAD $SYMLINK_TARGET"; fi + REPOPAD="$(echo "${(l:MAX_LEN[6]:)REPOPAD}" | sed 's/\S.*//')" + REPOBRANCH="$REPOPAD"$'\e['"$K_COLOR_BR"'m'"$REPOBRANCH"$'\e[0m' fi # -------------------------------------------------------------------------- @@ -485,36 +554,44 @@ k () { # But we don't want to quote '.'; so instead we escape the escape manually and use q- NAME="${${NAME##*/}//$'\e'/\\e}" # also propagate changes to SYMLINK_TARGET below - if [[ $IS_DIRECTORY == 1 ]]; then - if [[ $IS_WRITABLE_BY_OTHERS == 1 ]]; then - if [[ $HAS_STICKY_BIT == 1 ]]; then - NAME=$'\e['"$K_COLOR_TW"'m'"$NAME"$'\e[0m'; + if [[ -n "$LS_COLORS" ]] && ls --color -d . &>/dev/null; then + # We are using an ls that supports using colors from $LS_COLORS (probably GNU ls here) + #pushd "${base_dir}" &>/dev/null + NAME="$(ls --color=always -d "$NAME")" + #popd &>/dev/null + elif (( $IS_DIRECTORY == 1 )); then + if (( $IS_WRITABLE_BY_OTHERS == 1 )); then + if (( $HAS_STICKY_BIT == 1 )); then + NAME=$'\e['"$K_COLOR_TW"'m'"$NAME"$'\e[0m' fi - NAME=$'\e['"$K_COLOR_OW"'m'"$NAME"$'\e[0m'; + NAME=$'\e['"$K_COLOR_OW"'m'"$NAME"$'\e[0m' fi - NAME=$'\e['"$K_COLOR_DI"'m'"$NAME"$'\e[0m'; - elif [[ $IS_SYMLINK == 1 ]]; then NAME=$'\e['"$K_COLOR_LN"'m'"$NAME"$'\e[0m'; - elif [[ $IS_SOCKET == 1 ]]; then NAME=$'\e['"$K_COLOR_SO"'m'"$NAME"$'\e[0m'; - elif [[ $IS_PIPE == 1 ]]; then NAME=$'\e['"$K_COLOR_PI"'m'"$NAME"$'\e[0m'; - elif [[ $HAS_UID_BIT == 1 ]]; then NAME=$'\e['"$K_COLOR_SU"'m'"$NAME"$'\e[0m'; - elif [[ $HAS_GID_BIT == 1 ]]; then NAME=$'\e['"$K_COLOR_SG"'m'"$NAME"$'\e[0m'; - elif [[ $IS_EXECUTABLE == 1 ]]; then NAME=$'\e['"$K_COLOR_EX"'m'"$NAME"$'\e[0m'; - elif [[ $IS_BLOCK_SPECIAL == 1 ]]; then NAME=$'\e['"$K_COLOR_BD"'m'"$NAME"$'\e[0m'; - elif [[ $IS_CHARACTER_SPECIAL == 1 ]]; then NAME=$'\e['"$K_COLOR_CD"'m'"$NAME"$'\e[0m'; + NAME=$'\e['"$K_COLOR_DI"'m'"$NAME"$'\e[0m' + elif (( $IS_SYMLINK == 1 )); then NAME=$'\e['"$K_COLOR_LN"'m'"$NAME"$'\e[0m' + elif (( $IS_SOCKET == 1 )); then NAME=$'\e['"$K_COLOR_SO"'m'"$NAME"$'\e[0m' + elif (( $IS_PIPE == 1 )); then NAME=$'\e['"$K_COLOR_PI"'m'"$NAME"$'\e[0m' + elif (( $HAS_UID_BIT == 1 )); then NAME=$'\e['"$K_COLOR_SU"'m'"$NAME"$'\e[0m' + elif (( $HAS_GID_BIT == 1 )); then NAME=$'\e['"$K_COLOR_SG"'m'"$NAME"$'\e[0m' + elif (( $IS_EXECUTABLE == 1 )); then NAME=$'\e['"$K_COLOR_EX"'m'"$NAME"$'\e[0m' + elif (( $IS_BLOCK_SPECIAL == 1 )); then NAME=$'\e['"$K_COLOR_BD"'m'"$NAME"$'\e[0m' + elif (( $IS_CHARACTER_SPECIAL == 1 )); then NAME=$'\e['"$K_COLOR_CD"'m'"$NAME"$'\e[0m' fi # -------------------------------------------------------------------------- # Format symlink target # -------------------------------------------------------------------------- - if [[ $SYMLINK_TARGET != "" ]]; then SYMLINK_TARGET="-> ${SYMLINK_TARGET//$'\e'/\\e}"; fi + if [[ -n $SYMLINK_TARGET ]]; then SYMLINK_TARGET="-> ${SYMLINK_TARGET//$'\e'/\\e}"; fi # -------------------------------------------------------------------------- # Display final result # -------------------------------------------------------------------------- - print -r -- "$PERMISSIONS_OUTPUT $HARDLINKCOUNT $OWNER $GROUP $FILESIZE_OUT $DATE_OUTPUT $REPOMARKER $NAME $SYMLINK_TARGET" + print -r -- "$PERMISSIONS_OUTPUT $HARDLINKCOUNT $OWNER $GROUP $FILESIZE_OUT $DATE_OUTPUT $REPOMARKER $NAME$SYMLINK_TARGET$REPOBRANCH" - k=$((k+1)) # Bump loop index + (( k++ )) # Bump loop index done + if [[ ! -f $base_dir ]]; then + popd >/dev/null + fi done } @@ -546,4 +623,3 @@ _k_bsd_to_ansi() { } # http://upload.wikimedia.org/wikipedia/en/1/15/Xterm_256color_chart.svg -# vim: set ts=2 sw=2 ft=zsh et : diff --git a/base/zsh/lscolors.zsh b/base/zsh/lscolors.zsh new file mode 100644 index 0000000..815ff79 --- /dev/null +++ b/base/zsh/lscolors.zsh @@ -0,0 +1,3 @@ +#export LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:' + +export LS_COLORS='bd=33;1:ca=31;1;7:cd=33;1:di=34;1:do=35;1:ex=32;1:pi=33:fi=0:ln=target:mi=31;1;7:mh=33;1:no=0:or=31;1;7:ow=32;1;7:sg=33;1;7:su=42;1:so=35;1:st=44;1:tw=36;1;7:*README=38;5;16:*README.rst=38;5;16:*README.md=38;5;16:*LICENSE=38;5;16:*COPYING=38;5;16:*INSTALL=38;5;16:*COPYRIGHT=38;5;16:*AUTHORS=38;5;16:*HISTORY=38;5;16:*CONTRIBUTORS=38;5;16:*PATENTS=38;5;16:*VERSION=38;5;16:*NOTICE=38;5;16:*CHANGES=38;5;16:*.log=38;5;16:*.txt=0:*.etx=38;5;16:*.info=38;5;16:*.markdown=38;5;16:*.md=38;5;16:*.mkd=38;5;16:*.nfo=38;5;16:*.pod=38;5;16:*.rst=38;5;16:*.tex=38;5;16:*.textile=38;5;16:*.bib=33:*.json=33:*.jsonl=33:*.ndjson=33:*.msg=33:*.pgn=33:*.rss=33:*.xml=33:*.fxml=33:*.toml=33:*.yaml=33:*.yml=33:*.RData=33:*.rdata=33:*.xsd=33:*.dtd=33:*.sgml=33:*.rng=33:*.rnc=33:*.cbr=35:*.cbz=35:*.chm=35:*.djvu=35:*.pdf=35:*.PDF=35:*.mobi=35:*.epub=35:*.docm=35;4:*.doc=35:*.docx=35:*.odb=35:*.odt=35:*.rtf=35:*.odp=38;5;16;1:*.pps=38;5;16;1:*.ppt=38;5;16;1:*.pptx=38;5;16;1:*.ppts=38;5;16;1:*.pptxm=38;5;16;1;4:*.pptsm=38;5;16;1;4:*.csv=32:*.tsv=32:*.ods=32:*.xla=32:*.xls=32:*.xlsx=32:*.xlsxm=32;4:*.xltm=32;4:*.xltx=32:*config=1:*cfg=1:*conf=1:*rc=1:*authorized_keys=1:*known_hosts=1:*.ini=1:*.plist=1:*.viminfo=1:*.pcf=1:*.psf=1:*.hidden-color-scheme=1:*.hidden-tmTheme=1:*.last-run=1:*.merged-ca-bundle=1:*.sublime-build=1:*.sublime-commands=1:*.sublime-keymap=1:*.sublime-settings=1:*.sublime-snippet=1:*.sublime-project=1:*.sublime-workspace=1:*.tmTheme=1:*.user-ca-bundle=1:*.epf=1:*.git=35:*.gitignore=38;5;8:*.gitattributes=38;5;8:*.gitmodules=38;5;8:*.awk=32;1:*.bash=32;1:*.bat=32;1:*.BAT=32;1:*.sed=32;1:*.sh=32;1:*.zsh=32;1:*.vim=32;1:*.ahk=38;5;71:*.py=38;5;71:*.ipynb=38;5;71:*.rb=38;5;71:*.gemspec=38;5;71:*.pl=36:*.PL=36:*.t=36:*.msql=33:*.mysql=33:*.pgsql=33:*.sql=33:*.tcl=38;5;71:*.r=36:*.R=36:*.clj=38;5;71:*.cljs=38;5;71:*.cljc=38;5;71:*.cljw=38;5;71:*.scala=38;5;71:*.dart=36:*.asm=34:*.cl=34:*.lisp=34:*.rkt=34:*.lua=34:*.moon=34:*.c=34:*.C=34:*.h=34:*.H=34:*.tcc=34:*.c++=34:*.h++=34:*.hpp=34:*.hxx=34:*.ii=34:*.M=34:*.m=34:*.cc=34:*.cs=34:*.cp=34:*.cpp=34:*.cxx=34:*.cr=34:*.go=34:*.f=34:*.F=34:*.for=34:*.ftn=34:*.f90=34:*.F90=34:*.f95=34:*.F95=34:*.f03=34:*.F03=34:*.f08=34:*.F08=34:*.nim=34:*.nimble=34:*.s=34:*.S=34:*.rs=34:*.scpt=35:*.swift=35:*.sx=34:*.vala=34:*.vapi=34:*.hi=34:*.hs=34:*.lhs=34:*.agda=34:*.lagda=34:*.lagda.tex=34:*.lagda.rst=34:*.lagda.md=34:*.agdai=34:*.zig=34:*.pyc=38;5;8:*.tf=35:*.tfstate=35:*.tfvars=35:*.css=38;5;16:*.less=38;5;16:*.sass=38;5;16:*.scss=38;5;16:*.htm=38;5;16:*.html=38;5;16:*.jhtm=38;5;16:*.mht=38;5;16:*.eml=38;5;16:*.mustache=38;5;16:*.coffee=34:*.java=34:*.js=34:*.mjs=34:*.jsm=34:*.jsp=34:*.php=34:*.ctp=34:*.twig=34:*.vb=34:*.vba=34:*.vbs=34:*Dockerfile=38;5;71:*.dockerignore=38;5;8:*Makefile=38;5;71:*MANIFEST=38;5;8:*pm_to_blib=38;5;8:*.nix=38;5;71:*.dhall=38;5;16:*.rake=38;5;71:*.am=38;5;8:*.in=38;5;8:*.hin=38;5;8:*.scan=38;5;8:*.m4=38;5;8:*.old=38;5;8:*.out=38;5;8:*.SKIP=38;5;8:*.diff=38;5;17:*.patch=38;5;17:*.bmp=35:*.dicom=35:*.tiff=35:*.tif=35:*.TIFF=35:*.cdr=35:*.flif=35:*.gif=35:*.icns=35:*.ico=35:*.jpeg=35:*.JPG=35:*.jpg=35:*.nth=35:*.png=35:*.psd=35:*.pxd=35:*.pxm=35:*.xpm=35:*.webp=35:*.ai=35:*.eps=35:*.epsf=35:*.drw=35:*.ps=35:*.svg=35:*.avi=35:*.divx=35:*.IFO=35:*.m2v=35:*.m4v=35:*.mkv=35:*.MOV=35:*.mov=35:*.mp4=35:*.mpeg=35:*.mpg=35:*.ogm=35:*.rmvb=35:*.sample=35:*.wmv=35:*.3g2=35:*.3gp=35:*.gp3=35:*.webm=35:*.gp4=35:*.asf=35:*.flv=35:*.ts=35:*.ogv=35:*.f4v=35:*.VOB=35:*.vob=35:*.ass=33:*.srt=33:*.ssa=33:*.sub=33:*.sup=33:*.vtt=33:*.3ga=36:*.S3M=36:*.aac=36:*.amr=36:*.au=36:*.caf=36:*.dat=36:*.dts=36:*.fcm=36:*.m4a=36:*.mid=36:*.mod=36:*.mp3=36:*.mp4a=36:*.oga=36:*.ogg=36:*.opus=36:*.s3m=36:*.sid=36:*.wma=36:*.ape=36:*.aiff=36:*.cda=36:*.flac=36:*.alac=36:*.midi=36:*.pcm=36:*.wav=36:*.wv=36:*.wvc=36:*.afm=34:*.fon=34:*.fnt=34:*.pfb=34:*.pfm=34:*.ttf=34:*.otf=34:*.woff=34:*.woff2=34:*.PFA=34:*.pfa=34:*.7z=31:*.a=31:*.arj=31:*.bz2=31:*.cpio=31:*.gz=31:*.lrz=31:*.lz=31:*.lzma=31:*.lzo=31:*.rar=31:*.s7z=31:*.sz=31:*.tar=31:*.tgz=31:*.xz=31:*.z=31:*.zip=31:*.zipx=31:*.zoo=31:*.zpaq=31:*.zst=31:*.zstd=31:*.zz=31:*.apk=31:*.ipa=31:*.deb=31:*.rpm=31:*.jad=31:*.jar=31:*.cab=31:*.pak=31:*.pk3=31:*.vdf=31:*.vpk=31:*.bsp=31:*.dmg=31:*.r[0-9]{0,2}=31:*.zx[0-9]{0,2}=31:*.z[0-9]{0,2}=31:*.part=38;5;8:*.iso=31:*.bin=31:*.nrg=31:*.qcow=31:*.sparseimage=31:*.toast=31:*.vcd=31:*.vmdk=31:*.accdb=35:*.accde=35:*.accdr=35:*.accdt=35:*.db=35:*.fmp12=35:*.fp7=35:*.localstorage=35:*.mdb=35:*.mde=35:*.sqlite=35:*.typelib=35:*.nc=35:*.pacnew=34;1;7:*.un~=38;5;8:*.orig=38;5;8:*.BUP=38;5;8:*.bak=38;5;8:*.o=38;5;8:*core=38;5;8:*.mdump=38;5;8:*.rlib=38;5;8:*.dll=38;5;8:*.swp=38;5;8:*.swo=38;5;8:*.tmp=38;5;8:*.sassc=38;5;8:*.pid=38;5;20:*.state=38;5;20:*lockfile=38;5;20:*lock=38;5;20:*.err=31;1:*.error=31;1:*.stderr=31;1:*.aria2=38;5;8:*.dump=38;5;8:*.stackdump=38;5;8:*.zcompdump=38;5;8:*.zwc=38;5;8:*.pcap=36:*.cap=36:*.dmp=36:*.DS_Store=38;5;8:*.localized=38;5;8:*.CFUserTextEncoding=38;5;8:*.allow=32:*.deny=31:*.service=34:*@.service=34:*.socket=34:*.swap=34:*.device=34:*.mount=34:*.automount=34:*.target=34:*.path=34:*.timer=34:*.snapshot=34:*.application=36:*.cue=36:*.description=36:*.directory=36:*.m3u=36:*.m3u8=36:*.md5=36:*.properties=36:*.sfv=36:*.theme=36:*.torrent=36:*.urlview=36:*.webloc=36:*.lnk=36:*CodeResources=38;5;8:*PkgInfo=38;5;8:*.nib=35:*.car=35:*.dylib=38;5;8:*.entitlements=38;5;20:*.pbxproj=38;5;20:*.strings=38;5;20:*.storyboard=31:*.xcconfig=38;5;20:*.xcsettings=38;5;20:*.xcuserstate=38;5;20:*.xcworkspacedata=38;5;20:*.xib=38;5;16:*.asc=32:*.bfe=32:*.enc=32:*.gpg=32:*.signature=32:*.sig=32:*.p12=32:*.pem=32:*.pgp=32:*.p7s=32:*id_dsa=32:*id_rsa=32:*id_ecdsa=32:*id_ed25519=32:*.32x=35:*.cdi=35:*.fm2=35:*.rom=35:*.sav=35:*.st=35:*.a00=35:*.a52=35:*.A64=35:*.a64=35:*.a78=35:*.adf=35:*.atr=35:*.gb=35:*.gba=35:*.gbc=35:*.gel=35:*.gg=35:*.ggl=35:*.ipk=35:*.j64=35:*.nds=35:*.nes=35:*.sms=35:*.8xp=35:*.8eu=35:*.82p=35:*.83p=35:*.8xe=35:*.stl=38;5;17:*.dwg=38;5;17:*.ply=38;5;17:*.wrl=38;5;17:*.pot=0:*.pcb=38;5;17:*.mm=0:*.gbr=35:*.scm=35:*.xcf=35:*.spl=0:*.Rproj=36:*.sis=0:*.1p=0:*.3p=0:*.cnc=0:*.def=0:*.ex=0:*.example=0:*.feature=0:*.ger=0:*.ics=0:*.map=0:*.mf=0:*.mfasl=0:*.mi=0:*.mtx=0:*.pc=0:*.pi=0:*.plt=0:*.pm=0:*.rdf=0:*.ru=0:*.sch=0:*.sty=0:*.sug=0:*.tdy=0:*.tfm=0:*.tfnt=0:*.tg=0:*.vcard=0:*.vcf=0:*.xln=0:*.iml=0:' -- cgit v1.2.3-70-g09d2