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

来源:互联网 发布:数据库笔试题及答案 编辑:程序博客网 时间:2024/06/04 22:06

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

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



Ask Question
up vote5down votefavorite
1

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 -aADRUfi# -----------------------------------------------# Startup Scripts# -----------------------------------------------cd ~/Desktop[[ -s "~/.rvm/scripts/rvm" ]] && source "~/.rvm/scripts/rvm"# -----------------------------------------------# Environment Variables# -----------------------------------------------export HISTFILE=~/.zsh_historyexport HISTSIZE=10000export HISTCONTROL=ignoredupsexport SAVEHIST=10000export 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-darwinexport EDITOR='open -Wn'export LC_TYPE=en_US.UTF-8export LSCOLORS=exFxcxdxAxexbxHxGxcxBx# -----------------------------------------------# Prompt# -----------------------------------------------## Root Prompt[ $UID = 0 ] && export PROMPT="%~ +=> " && export RPROMPT="%*"## General Prompt[ $UID != 0 ] && export PROMPT="%~ => " && export RPROMPT="%*"# -----------------------------------------------# Aliases# -----------------------------------------------## Command Aliasesalias ..='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# -----------------------------------------------# Directoriessetopt                  \    AUTO_CD             \    AUTO_PUSHD          \    CD_ABLE_VARS        \    CHASE_DOTS          \    CHASE_LINKS         \# Completionsetopt                  \    AUTO_LIST           \    AUTO_MENU           \    AUTO_PARAM_SLASH    \    COMPLETE_IN_WORD    \    LIST_TYPES          \    MENU_COMPLETE       \    REC_EXACT           \# Historysetopt                  \    APPEND_HISTORY      \    EXTENDED_HISTORY    \# Input/Outputsetopt                  \    CORRECT             \# Scripts and Functionssetopt                  \    MULTIOS             \# Othersetopt                  \    NO_BEEP             \    ZLE# Key Bindingsbindkey "^[[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 _correctzstyle ':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 1zstyle ':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 yeszstyle ':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
shareimprove this question
 

3 Answers

activeoldestvotes
up vote7down voteaccepted

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/shopen -Wn -- "$@"% grep EDITOR ~/.profileexport EDITOR=~/bin/EDITOR
shareimprove 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
up vote3down vote

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
shareimprove 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
up vote2down vote

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.

shareimprove 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




原创粉丝点击