mac instalar autosuggestions zsh

instalar - zsh-autosuggestions



Cómo editar la variable de ruta en ZSH (3)

En mi .bash_profile tengo las siguientes líneas:

PATHDIRS=" /usr/local/mysql/bin /usr/local/share/python /opt/local/bin /opt/local/sbin $HOME/bin" for dir in $PATHDIRS do if [ -d $dir ]; then export PATH=$PATH:$dir fi done

Sin embargo, intenté copiar esto en mi .zshrc y no se está configurando $PATH .

Primero puse sentencias echo dentro de la función "si el directorio existe" y descubrí que la sentencia if se estaba evaluando como falsa, incluso para directorios que claramente existían.

Luego eliminé la verificación del directorio existente, y la $PATH se estaba configurando incorrectamente de esta manera:

/usr/bin:/bin:/usr/sbin:/sbin: /usr/local/bin /opt/local/bin /opt/local/sbin /Volumes/Xshare/kburke/bin /usr/local/Cellar/ruby/1.9.2-p290/bin /Users/kevin/.gem/ruby/1.8/bin /Users/kevin/bin

Ninguno de los programas en los directorios inferiores fue encontrado o ejecutado.
¿Qué estoy haciendo mal?


¿Aún no está seguro de cuál fue el problema (quizás nuevas líneas en $ PATHDIRS)? pero cambiando a la sintaxis de matriz zsh lo arregló:

PATHDIRS=( /usr/local/mysql/bin /usr/local/share/python /usr/local/scala/scala-2.8.0.final/bin /opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin /opt/local/etc /opt/local/bin /opt/local/sbin $HOME/.gem/ruby/1.8/bin $HOME/bin)

y

path=($path $dir)


A diferencia de otros shells, zsh no realiza la división de palabras o el globo después de la sustitución de variables. Por lo tanto, $PATHDIRS expande a una sola cadena que contiene exactamente el valor de la variable, y no a una lista de cadenas que contiene cada parte separada del valor delimitada por espacios en blanco.

Usar una matriz es la mejor manera de expresar esto (no solo en zsh, sino también en ksh y bash).

pathdirs=( /usr/local/mysql/bin … ~/bin ) for dir in $pathdirs; do if [ -d $dir ]; then path+=$dir fi done

Debido a que probablemente no vaya a referirse a los pathdirs más adelante, podría escribirlo en línea:

for dir in / /usr/local/mysql/bin / … / ~/bin ; do if [[ -d $dir ]]; then path+=$dir; fi done

Incluso hay una forma más corta de expresar esto: agregue todos los directorios que le gustan a la matriz de path , luego seleccione los que existen.

path+=/usr/local/mysql/bin … path=($^path(N))

El calificador N glob selecciona solo las coincidencias que existen. Agregue el -/ a la lista de calificadores (es decir, (-/N) o (N-/) ) si le preocupa que uno de los elementos pueda ser algo más que un directorio o un enlace simbólico a uno (por ejemplo, un enlace simbólico roto) ). El indicador de expansión del parámetro ^ garantiza que el calificador global se aplique a cada elemento del arreglo por separado.

También puede usar el calificador N para agregar un elemento solo si existe. Tenga en cuenta que necesita que se realicen globos, por lo que la path+=/usr/local/mysql/bin(N) no funcionaría.

path+=(/usr/local/bin/mysql/bin(N-/))


Puedes poner

setopt shwordsplit

en su .zshrc . Entonces zsh realizará la división del mundo como lo hacen todos los shells de Bourne. Que el valor predeterminado parezca ser noshwordsplit es una característica errónea que causa que muchos se rasquen la cabeza. Me sorprendería si no fuera un FAQ. Veamos ... yup: http://zsh.sourceforge.net/FAQ/zshfaq03.html#l18 3.1: ¿Por qué $ var donde var = "foo bar" no hace lo que espero?