Mac 使用ZSH终端设置问题,解决command not found

可参考网址:https://stackoverflow.com/questions/8299610/zsh-command-not-found-for-editor

说明:此网站加载很慢,这里拷贝了一份,方便大家参考



For whatever reason, zsh doesn't like me setting command-line arguments for my $EDITORvariable, but from what I can tell, it's not supposed to be this way. I've seen people use

export EDITOR='open -Wn'

in their ~/.zshrc file, but when I try to do that, I just get a complaint.

zsh: command not found: open -Wn

Any reason why this might be happening? Setting the $EDITOR to 'mate''vim' or 'open'seems to work just fine, but 'mate -w' and 'open -Wn' don't work.

I'm running zsh inside screen on Mac OS X, and my ~/.zshrc is as follows:

# -----------------------------------------------
# Screen Settings
# -----------------------------------------------

# If screen isn't already running, turn it on.
if [[ $STY == '' ]]; then
    # Execute screen.
    exec screen -aADRU
fi

# -----------------------------------------------
# Startup Scripts
# -----------------------------------------------

cd ~/Desktop
[[ -s "~/.rvm/scripts/rvm" ]] && source "~/.rvm/scripts/rvm"

# -----------------------------------------------
# Environment Variables
# -----------------------------------------------

export HISTFILE=~/.zsh_history
export HISTSIZE=10000
export HISTCONTROL=ignoredups
export SAVEHIST=10000

export PATH=.:/usr/local/bin:/usr/local/sbin:/usr/local/narwhal/bin:/bin:/sbin:/usr/bin:/usr/local/share:/usr/sbin:/usr/local/texlive/2011/bin/universal-darwin
export EDITOR='open -Wn'
export LC_TYPE=en_US.UTF-8
export LSCOLORS=exFxcxdxAxexbxHxGxcxBx

# -----------------------------------------------
# Prompt
# -----------------------------------------------

## Root Prompt
[ $UID = 0 ] && export PROMPT="%~ +=> " && export RPROMPT="%*"

## General Prompt
[ $UID != 0 ] && export PROMPT="%~ => " && export RPROMPT="%*"

# -----------------------------------------------
# Aliases
# -----------------------------------------------

## Command Aliases
alias ..='cd ..'
alias ...='cd ../..'
alias internet='lsof -P -i -n | cut -f 1 -d " " | uniq'
alias restart='sudo shutdown -r NOW'
alias ls='ls -@1AFGph'
alias tree='tree -alCF --charset=UTF-8 --du --si'
alias mate='mate -w'
alias zshrc='$EDITOR ~/.zshrc && source ~/.zshrc'
alias vimrc='$EDITOR ~/.vimrc.local'
alias gvimrc='$EDITOR ~/.gvimrc.local'

## Root Aliases
[ $UID = 0 ] && \
    alias rm='rm -i' && \
    alias mv='mv -i' && \
    alias cp='cp -i'

# -----------------------------------------------
# User-defined Functions
# -----------------------------------------------

# Usage: extract <file>
# Description: extracts archived files / mounts disk images.
# Note: .dmg/hdiutil is Mac OS X-specific.
extract () {
    if [ -f $1 ]; then
        case $1 in
            *.tar.bz2)  tar -jxvf $1        ;;
            *.tar.gz)   tar -zxvf $1        ;;
            *.bz2)      bunzip2 $1          ;;
            *.dmg)      hdiutul mount $1    ;;
            *.gz)       gunzip $1           ;;
            *.tar)      tar -xvf $1         ;;
            *.tbz2)     tar -jxvf $1        ;;
            *.tgz)      tar -zxvf $1        ;;
            *.zip)      unzip $1            ;;
            *.Z)        uncompress $1       ;;
            *)          echo "'$1' cannot be extracted/mounted via extract()." ;;
        esac
    else
        echo "'$1' is not a valid file."
    fi
}


# Usage: pman <manpage>
# Description: opens up the selected man page in Preview.
pman () {
    man -t $@ | open -f -a /Applications/Preview.app
}

# Usage: fp <name>
# Description: find and list processes matching a case-insensitive partial-match string.
fp () {
    ps Ao pid,comm|awk '{match($0,/[^\/]+$/); print substr($0,RSTART,RLENGTH)": "$1}'|grep -i $1|grep -v grep
}

# Usage: fk <name>
# Description: find and kill a process matching a case-insensitive partial-match string.
fk () {
    IFS=$'\n'
    PS3='Kill which process? (1 to cancel): '
    select OPT in "Cancel" $(fp $1); do
        if [ $OPT != "Cancel" ]; then
            kill $(echo $OPT|awk '{print $NF}')
        fi
        break
    done
    unset IFS
}

# Usage: create <file>
# Description: creates and opens a file for editing.
create () {
    touch $1 && open $1
}

# Usage: reset
# Description: 'resets' the terminal by changing the current working directory
# to the desktop and clearing the screen.
reset () {
    cd ~/Desktop; clear
}

# Usage: quit
# Description: exits the terminal.
quit () {
    killall Terminal
}

# -----------------------------------------------
# zsh Options
# -----------------------------------------------

# Directories
setopt                  \
    AUTO_CD             \
    AUTO_PUSHD          \
    CD_ABLE_VARS        \
    CHASE_DOTS          \
    CHASE_LINKS         \

# Completion
setopt                  \
    AUTO_LIST           \
    AUTO_MENU           \
    AUTO_PARAM_SLASH    \
    COMPLETE_IN_WORD    \
    LIST_TYPES          \
    MENU_COMPLETE       \
    REC_EXACT           \

# History
setopt                  \
    APPEND_HISTORY      \
    EXTENDED_HISTORY    \

# Input/Output
setopt                  \
    CORRECT             \

# Scripts and Functions
setopt                  \
    MULTIOS             \

# Other
setopt                  \
    NO_BEEP             \
    ZLE

# Key Bindings
bindkey "^[[3~" delete-char

# -----------------------------------------------
# zsh Autocompletion
# -----------------------------------------------

# Turn on auto-completion.
autoload -U compinit && compinit -C && autoload -U zstyle+

# Attempt to complete as much as possible.
zstyle ':completion:*' completer _complete _list _oldlist _expand _ignored _match _correct
zstyle ':completion:*::::' completer _expand _complete _ignored _approximate

# Sort files by name.
zstyle ':completion:*' file-sort name

# Allow for case-insensitive completion.
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

# Color completions.
zstyle ':completion:*' list-colors ${LSCOLORS}
zstyle ':completion:*:*:kill:*:processes' command 'ps -axco pid,user,command'
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31'

# Set the amount of completions that triggers the menu.
zstyle ':completion:*' menu select=long

# Ignore certain patterns.
zstyle ':completion:*:functions' ignored-patterns '_*'
zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~'
zstyle ':completion:*:*:(^rm):*:*files' ignored-patterns '*?.(o|c~|old|pro|zwc)'

# Cache completions.
zstyle ':completion::complete:*' use-cache 1
zstyle ':completion::complete:*' cache-path ~/.zcompcache/$HOST

# Allow errors.
zstyle -e ':completion:*:approximate:*' max-errors 'reply=( $(( ($#PREFIX+$#SUFFIX)/2 )) numeric )'

# Insert all expansions for expand completer (eh, don't know what this does).
zstyle ':completion:*:expand:*' tag-order all-expansions

# Formatting and messages.
zstyle ':completion:*' list-prompt '%SAt %p: Hit TAB for more, or the character to insert%s'
zstyle ':completion:*' verbose yes
zstyle ':completion:*:descriptions' format '%B%d%b'
zstyle ':completion:*:messages' format '%d'
zstyle ':completion:*:warnings' format 'No matches for: %d'
zstyle ':completion:*:corrections' format '%B%d (errors: %e)%b'
zstyle ':completion:*' group-name ''

# Offer indexes before parameters in subscripts.
zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
share improve this question
 

3 Answers

up vote 7 down vote accepted

In zsh, when you write $EDITOR, it expands to a single word. Unlike other Bourne-style shells, zsh does not split words when it expands unquoted expansions. You can make it happen with the =modifier on parameter expansion.

$=EDITOR $file

A more portable method is to ensure that EDITOR does not contain any space. Most applications treat $EDITOR as a shell snippet or as a whitespace-separated list of words, but I've encountered a few that treat it as a command name. Make EDITOR point to a shell script.

% cat ~/bin/EDITOR
#!/bin/sh
open -Wn -- "$@"
% grep EDITOR ~/.profile
export EDITOR=~/bin/EDITOR
share improve this answer
 
 
Thanks! Just ran in to this trying to set EDITOR=emacsclient -c in zsh; I had no idea about this difference between zsh and Bash. –  DGrady  Jan 13 '16 at 0:08

How are you invoking the EDITOR? If you have EDITOR set with options, then you would get an error with:

$ $EDITOR file

but it should work if you do:

$ eval $EDITOR file
share improve this answer
 
 
This works. Thanks! –  Itai Ferber  Nov 28 '11 at 18:46
4  
Rather than call eval, you can turn on word splitting specifically on this expansion: $=EDITOR file. –  Gilles  Nov 28 '11 at 21:34
 
Wow, didn't know that was possible. Great tip! –  Itai Ferber  Nov 29 '11 at 4:14
 
@Gilles: is there a reason you didn't put that in as an answer? It seems to be the best answer to me, and I'd gladly up-vote it. I'm tempted to put it in myself as an answer, but if I told people to up-vote your comment instead, the answer wouldn't be seen easily, as it would fall to the bottom. And if people just up-voted my answer, I'd feel like I was stealing points that rightfully are yours. –  iconoclast  Jun 4 '12 at 19:22 
 
@iconoclast I suppose I felt that William's answer was close enough. Oh well, I've posted an answer now. –  Gilles  Jun 4 '12 at 22:18

Programs that invoke the editor defined by $EDITOR may assume that the whole string referenced by it is the name of the command. So they will try to find an executable file called open -Wn.

Another issue is that open merely opens the file with an application that the operating system deems appropriate. If there is no application associated with the file type, the command will fail.

share improve this answer
 
 
Alright, that makes sense, but why would this work for other people, but not me? –  Itai Ferber  Nov 28 '11 at 18:45
 
@Itai: I don't know. Frankly, I'm amazed that other people have got it to work. –  JeremyP  Nov 29 '11 at 11:01
2  
Simply setting EDITOR="open -Wn" will work in bash, since word splitting is on by default. Perhaps the "other people" are not using zsh? –  William Pursell  Nov 29 '11 at 13:31
 
That's most likely it. Thanks, William. –  Itai Ferber  Nov 29 '11 at 14:10




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值