mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-30 17:50:58 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			187 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			187 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| # Accented characters.  Inputs two keys.  There are two types: those
 | |
| # with a base character followed by an accent (see below for codes for
 | |
| # accents), and those with a two-character mnemonic for the composed
 | |
| # character.  These are (with the exception of the Euro) the codes
 | |
| # given by RFC 1345.  Note that some codes in RFC 1345 require three
 | |
| # characters to be input; none of these are handled.
 | |
| #
 | |
| # For best results zsh should have been built with support for
 | |
| # multibyte characters (--enable-multibyte), but single character sets
 | |
| # also work.
 | |
| #
 | |
| # Outputs the character converted from Unicode into the local representation.
 | |
| # (The conversion is done within the shell, using whatever facilities
 | |
| # the C library provides.)
 | |
| #
 | |
| # When used as a zle widget, the character is inserted at the cursor
 | |
| # position.  With a numeric argument, preview in status line; outside zle,
 | |
| # print character (and newline) to standard output.
 | |
| #
 | |
| # The set of accented characters is reasonably complete up to U+0180, the
 | |
| # set of special characters less so.  However, it mostly gives up at that
 | |
| # point.  Adding new Unicode characters is easy, however.  Please send any
 | |
| # additions to zsh-workers@zsh.org .
 | |
| #
 | |
| # Some of the accent codes are a little more obscure than others.
 | |
| #  !   Grave
 | |
| #  '   Acute
 | |
| #  >   Circumflex
 | |
| #  ?   Tilde
 | |
| #  -   Macron.  (A horizonal bar over the letter.)
 | |
| #  (   Breve.  (A shallow dish shape over the letter.)
 | |
| #  .   Dot above, or no dot with lower case i, or dot in the middle of L or l.
 | |
| #  :   Diaeresis (Umlaut)
 | |
| #  ,   Cedilla
 | |
| #  _   Underline (none of these currently)
 | |
| #  /   Stroke through character
 | |
| #  "   Double acute
 | |
| #  ;   Ogonek.  (A little forward facing hook at the bottom right
 | |
| #      of the character.)
 | |
| #  <   Caron.  (A little v over the letter.)
 | |
| #  0   Circle
 | |
| #  2   Hook
 | |
| #  9   Horn
 | |
| # Hence A! is upper case A with a grave, c, is lower case c with cedilla.
 | |
| #
 | |
| # Some other composed charaters:
 | |
| # Various ligatures:
 | |
| #  AE ae OE oe IJ ij
 | |
| #
 | |
| # ASCII characters not on all keyboards:
 | |
| #  <(           [
 | |
| #  //           \
 | |
| #  )>           ]
 | |
| #  (!           {
 | |
| #  !!           |
 | |
| #  !)           }
 | |
| #  '?           ~
 | |
| #
 | |
| # Special letters:
 | |
| #  ss		Eszett (schafes S)
 | |
| #  D- d- TH th  Eth and thorn
 | |
| #  kk           kra
 | |
| #  'n           'n
 | |
| #  NG ng        ng
 | |
| #  OI oi        OI
 | |
| #  yr           yr
 | |
| #  ED           ezh
 | |
| #
 | |
| # Currency symbols:
 | |
| #  Ct           Cent
 | |
| #  Pd           Pound sterling
 | |
| #  Cu           Currency
 | |
| #  Ye           Yen
 | |
| #  Eu           Euro (not in RFC 1345 but logical)
 | |
| #
 | |
| # Punctuation
 | |
| #  !I           Inverted !
 | |
| #  BB           Broken vertical bar
 | |
| #  SE           Section
 | |
| #  Co           Copyright
 | |
| #  -a           Spanish feminine ordinal indicator
 | |
| #  <<           Left guillemet
 | |
| #  --           Soft hyphen
 | |
| #  Rg           Registered trade mark
 | |
| #  PI           Pilcrow (paragraph)
 | |
| #  -o           Spanish masculine ordinal indicator
 | |
| #  >>           Right guillemet
 | |
| #  ?I           Inverted question mark
 | |
| #  -1           Hyphen
 | |
| #  -N           en dash
 | |
| #  -M           em dash
 | |
| #  -3           horizontal bar
 | |
| #  :3           vertical ellipsis
 | |
| #  .3           horizontal midline ellipsis
 | |
| #  !2           double vertical line
 | |
| #  =2           double low line
 | |
| #  '6           Left single quote
 | |
| #  '9           Right single quote
 | |
| #  .9           "Right" low quote
 | |
| #  9'           Reversed "right" quote
 | |
| #  "6           Left double quote
 | |
| #  "9           Right double quote
 | |
| #  :9           "Right" low double quote
 | |
| #  9"           Reversed "right" double quote
 | |
| #  /-           Dagger
 | |
| #  /=           Double dagger
 | |
| #
 | |
| # Mathematical
 | |
| #  DG           Degree
 | |
| #  +-           +/-
 | |
| #  2S           Superscript 2
 | |
| #  3S           Superscript 3
 | |
| #  My           Micro
 | |
| #  .M           Middle dot
 | |
| #  1S           Superscript 1
 | |
| #  14           Quarter
 | |
| #  12           Half
 | |
| #  34           Three quarters
 | |
| #  *X           Multiplication
 | |
| #  -:           Division
 | |
| #  %0           Per mille
 | |
| #
 | |
| # Accents with no base character
 | |
| # '>            Circumflex (caret)
 | |
| # '!            Grave (backtick)
 | |
| # ',            Cedilla
 | |
| # ':            Diaeresis (Umlaut)
 | |
| # 'm            Macron
 | |
| # ''            Acute
 | |
| 
 | |
| emulate -L zsh
 | |
| setopt cbases extendedglob printeightbit
 | |
| 
 | |
| local accent basechar ochar error
 | |
| 
 | |
| if [[ -n $WIDGET ]]; then
 | |
|   error=(zle -M)
 | |
| else
 | |
|   error=print
 | |
| fi
 | |
| 
 | |
| if (( ${+zsh_accented_chars} == 0 )); then
 | |
|   # Save quite a lot of memory by running and then erasing
 | |
|   # the function that defines the characters.
 | |
|   autoload -Uz define-composed-chars
 | |
|   define-composed-chars
 | |
|   unfunction define-composed-chars
 | |
| fi
 | |
| 
 | |
| if (( $# )); then
 | |
|   basechar=${1[1]}
 | |
|   if [[ $1 = ? ]]; then
 | |
|     shift
 | |
|   else
 | |
|     1=${1[2,-1]}
 | |
|   fi
 | |
| else
 | |
|   read -k basechar || return 1
 | |
| fi
 | |
| 
 | |
| if (( $# )); then
 | |
|   accent=${1[1]}
 | |
| else
 | |
|   read -k accent || return 1
 | |
| fi
 | |
| 
 | |
| local -A charmap
 | |
| # just in case someone is monkeying with IFS...
 | |
| charmap=(${(s. .)zsh_accented_chars[$accent]})
 | |
| 
 | |
| if [[ ${#charmap} -eq 0 || -z $charmap[$basechar] ]]; then
 | |
|   $error "Combination ${basechar}${accent} is not available."
 | |
|   return 1
 | |
| fi
 | |
| 
 | |
| if [[ -z $WIDGET ]]; then
 | |
|   [[ -t 1 ]] && print
 | |
|   print "\U${(l.8..0.)charmap[$basechar]}"
 | |
| else
 | |
|   ochar="$(print -n "\U${(l.8..0.)charmap[$basechar]}")"
 | |
| 
 | |
|   if (( ${+NUMERIC} )); then
 | |
|     $error "Character ${(l.8..0.)charmap[$basechar]}: $ochar"
 | |
|   else
 | |
|     LBUFFER+=$ochar
 | |
|   fi
 | |
| fi
 |