mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 18:10:56 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			129 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #compdef dos2unix unix2dos mac2unix unix2mac
 | |
| 
 | |
| local variant ret=1
 | |
| local -a context expl line state state_descr cp_opts xl_opts args
 | |
| local -A opt_args
 | |
| 
 | |
| # Code-page options for ISO translation (use group `cp`)
 | |
| cp_opts=(
 | |
|   '(-7 -ascii)-437[use DOS code page 437 (US) for ISO translation]'
 | |
|   '(-7 -ascii)-850[use DOS code page 850 (Western European) for ISO translation]'
 | |
|   '(-7 -ascii)-860[use DOS code page 860 (Portuguese) for ISO translation]'
 | |
|   '(-7 -ascii)-863[use DOS code page 863 (French Canadian) for ISO translation]'
 | |
|   '(-7 -ascii)-865[use DOS code page 865 (Nordic) for ISO translation]'
 | |
| 
 | |
|   '(-7 -ascii)-1252[use Windows code page 1252 (Western European) for ISO translation]'
 | |
| )
 | |
| # Translation/conversion options (use group `xl`)
 | |
| xl_opts=(
 | |
|   '(cp)-7[also replace 8-bit characters by 7-bit spaces]'
 | |
|   '(cp)-ascii[convert only line breaks (CRLF<->LF)]'
 | |
|   '-iso[also convert between DOS and ISO character sets]'
 | |
| 
 | |
|   {-c,--convmode}'[specify conversion mode]:conversion mode:((
 | |
|     7bit\:"also replace 8-bit characters by 7-bit spaces"
 | |
|     ascii\:"convert only line breaks (CRLF<->LF)"
 | |
|     iso\:"also convert between DOS and ISO character sets"
 | |
|     mac\:"convert only line breaks (CR<->LF)"
 | |
|   ))'
 | |
|   {-ub,--assume-utf16be}'[assume input file format is UTF-16BE]'
 | |
|   {-ul,--assume-utf16le}'[assume input file format is UTF-16LE]'
 | |
| )
 | |
| 
 | |
| # `dos2unix` here is the dos2unix package provided by many Linux distributions,
 | |
| # Homebrew, &al. `unix2dos` is the unix2dos package provided by FreeBSD, &al.
 | |
| # Some implementations (Solaris) don't bother with any kind of argument
 | |
| # validation, so we pass in /dev/null to make sure they never hang
 | |
| _pick_variant -r variant \
 | |
|   dos2unix='(#i)waterlan' \
 | |
|   unix2dos='-p' \
 | |
|   $OSTYPE \
 | |
|   --version /dev/null{,}
 | |
| 
 | |
| case $variant in
 | |
|   dos2unix)
 | |
|     # -D and -gb are omitted, since they only make sense on Windows
 | |
|     args=(
 | |
|       '(: * -)'{-h,--help}'[display help information]'
 | |
|       '(: * -)'{-L,--license}'[display license information]'
 | |
|       '(: * -)'{-V,--version}'[display version information]'
 | |
|       '(-l --newline)'{-l,--newline}'[write two line breaks to output for each converted line break]'
 | |
|       '(-u --keep-utf16)'{-u,--keep-utf16}'[write output in same UTF-16 encoding as input]'
 | |
|       '*:: :->file'
 | |
|       + '(qv)' # Verbosity options
 | |
|       {-q,--quiet}'[reduce output verbosity]'
 | |
|       {-v,--verbose}'[increase output verbosity]'
 | |
|       + '(cp)' # Code-page options
 | |
|       $cp_opts
 | |
|       + '(xl)' # Translation/conversion options
 | |
|       $xl_opts
 | |
|       + bm # BOM options
 | |
|       '(-b -r --keep-bom --remove-bom)'{-b,--keep-bom}'[write existing BOM to output]'
 | |
|       '(-m -r --add-bom --remove-bom)'{-m,--add-bom}'[write new BOM to output]'
 | |
|       '(bm)'{-r,--remove-bom}"[don't write BOM to output]"
 | |
|       + '(ch)' # chown options
 | |
|       '--allow-chown[allow file-ownership changes in old-file mode]'
 | |
|       "--no-allow-chown[don't allow file-ownership changes in old-file mode]"
 | |
|       + '(fs)' # Force/safe options
 | |
|       {-f,--force}'[force conversion of binary files]'
 | |
|       {-s,--safe}'[skip binary files]'
 | |
|       + '(in)' # Info options
 | |
|       {-i-,--info=-}'[display (specified) file information]:: :->info'
 | |
|       + '(ln)' # Symlink options
 | |
|       {-F,--follow-symlink}'[follow symbolic links]'
 | |
|       {-R,--replace-symlink}'[replace symbolic links]'
 | |
|       {-S,--skip-symlink}'[skip symbolic links]'
 | |
|       + '(no)' # File-mode options
 | |
|       {-n,--newfile}'[convert each input file to specified output file]'
 | |
|       {-o,--oldfile}'[convert input files in place]'
 | |
|     )
 | |
|     # No stacking!
 | |
|     _arguments -S -A '-*' : $args && ret=0
 | |
| 
 | |
|     case $state in
 | |
|       file)
 | |
|         if (( CURRENT % 2 == 0 )) && [[ -n ${opt_args[(I)*-(-n|--newfile)]} ]]; then
 | |
|           _description files expl 'output file'
 | |
|         else
 | |
|           _description files expl 'input file'
 | |
|         fi
 | |
|         _files "${(@)expl}" && ret=0
 | |
|         ;;
 | |
|       info)
 | |
|         _values -s '' 'information flag [dumbt]' \
 | |
|           '0[end each output line with NUL instead of newline]' \
 | |
|           'b[show BOM type]' \
 | |
|           'c[show only files that would be converted]' \
 | |
|           'd[show number of DOS line breaks (CRLF)]' \
 | |
|           'h[show header]' \
 | |
|           'm[show number of Mac line breaks (CR)]' \
 | |
|           'p[show file names without paths]' \
 | |
|           't[show whether file is text or binary]' \
 | |
|           'u[show number of UNIX line breaks (LF)]' \
 | |
|         && ret=0
 | |
|         ;;
 | |
|     esac
 | |
| 
 | |
|     return ret
 | |
|     ;;
 | |
|   unix2dos)
 | |
|     _arguments -s -S -A '-*' : \
 | |
|       '-p[preserve access and modification times]' \
 | |
|       '*:input file:_files'
 | |
|     return
 | |
|     ;;
 | |
|   solaris*)
 | |
|     _arguments -A '-*' : \
 | |
|       '1:input file:_files' \
 | |
|       '2:output file:_files' \
 | |
|       + '(cp)' \
 | |
|       ${(@M)cp_opts:#(|\([^\)]#\))-(437|850|860|863|865)(|\[*)} \
 | |
|       + '(xl)' \
 | |
|       ${(@M)xl_opts:#(|\([^\)]#\))-(7|ascii|iso)(|\[*)}
 | |
|     return
 | |
|     ;;
 | |
|   *)
 | |
|     _default
 | |
|     return
 | |
|     ;;
 | |
| esac
 |