1 #
   2 # CDDL HEADER START
   3 #
   4 # The contents of this file are subject to the terms of the
   5 # Common Development and Distribution License (the "License").
   6 # You may not use this file except in compliance with the License.
   7 #
   8 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9 # or http://www.opensolaris.org/os/licensing.
  10 # See the License for the specific language governing permissions
  11 # and limitations under the License.
  12 #
  13 # When distributing Covered Code, include this CDDL HEADER in each
  14 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15 # If applicable, add the following below this CDDL HEADER, with the
  16 # fields enclosed by brackets "[]" replaced with your own identifying
  17 # information: Portions Copyright [yyyy] [name of copyright owner]
  18 #
  19 # CDDL HEADER END
  20 #
  21 
  22 #
  23 # Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  24 # Use is subject to license terms.
  25 #
  26 
  27 #
  28 # This file is sourced by interactive ksh93 shells before ${HOME}/.kshrc
  29 #
  30 
  31 # Enable "gmacs"+"multiline" editor mode if the user did not set an
  32 # input mode yet (for example via ${EDITOR}, ${VISUAL} or any
  33 # "set -o" flag)
  34 if [[ "$(set +o)" != ~(Er)--(gmacs|emacs|vi)( .*|) ]] ; then
  35         set -o gmacs
  36         # enable multiline input mode
  37         set -o multiline
  38         # enable globstar mode (match subdirs with **/)
  39         set -o globstar
  40 fi
  41 
  42 # Set a default prompt (<username>@<hostname>:<path><"($|#) ">) if
  43 # then variable does not exist in the environment.
  44 #
  45 # Algorithm:
  46 # 1. Define "ellipsis", either Unicode #2026 for unicode locales
  47 # and "..." otherwise
  48 # ([[ "${LC_ALL}/${LANG}" = ~(Elr)(.*UTF-8/.*|/.*UTF-8) ]]
  49 # ensures that the pattern matches the leftmost sequence
  50 # containing *.UTF-8, allowing to match either LC_ALL or
  51 # LANG when LC_ALL is not set)
  52 # 2. If PWD is within HOME replace value of HOME with '~'
  53 # If the PWD is longer than 30 charatcers shorten it to 30 chars
  54 # print '#' for user "root" and '$' for normal users
  55 # Notes:
  56 # - printf "%*s\r%s" COLUMNS "") # is used at the beginning to
  57 #   work around a bug in the "multiline" handling code which
  58 #   causes the shell to override its own prompt when the edit
  59 #   line overflows (this happens if the terminal cursor
  60 #   position is not 0 when PS1 is printed).
  61 # - PS1 will initially be empty until either...
  62 #   a) ... someone sets the variable
  63 #       or
  64 #   b) ... the prompt is displayed for the first time (default is
  65 #     '$ ' for normal users and '# ' for user "root")
  66 # - The statement below will not work if someone sources /etc/ksh.kshrc
  67 #   unless PS1 gets "unset" first.
  68 # - Make sure to use absolute paths (e.g. /usr/bin/hostname) to make
  69 #   sure PS1 works in cases where PATH does not contain /usr/bin/
  70 if [[ "$(set)" != ~(E)PS1= && "${PS1}" == '' ]] ; then
  71         PS1='$(set +o xtrace +o errexit
  72                 printf "%*s\r%s" COLUMNS ""
  73                 printf "%s@%s:" "${LOGNAME}" "$(/usr/bin/hostname)"
  74                 ellip="${
  75                         [[ "${LC_ALL}/${LANG}" == ~(Elr)(.*UTF-8/.*|/.*UTF-8) ]] &&
  76                                 printf "\u[2026]\n" || print "..." ; }"
  77                 p="${PWD/~(El)${HOME}/\~}"
  78                 (( ${#p} > 30 )) &&
  79                         print -r -n -- "${ellip}${p:${#p}-30:30}" ||
  80                         print -r -n -- "${p}"
  81                 [[ "${LOGNAME}" == "root" ]] && print -n "# " || print -n "\$ "
  82                 )'
  83 fi