2012-02-15 1 views
2

Можно ли заставить zsh отображать фактические команды, на которые ссылаются все псевдонимы, когда они используются?Эхо все псевдонимы в zsh

Например, говорят, что у меня есть следующие псевдонимы набор:

# List direcory contents 
alias lsa='ls -lah' 
alias l='ls -la' 
alias ll='ls -l' 

Когда я исполняю их, я хотел бы видеть каждый из них печатать фактическую команду, которая выполняется. Например, я хотел бы видеть следующее:

$ ll 
executing: 'ls -l' 
total 0 
-rw-r--r-- 1 person staff 0 Feb 15 13:46 cool.txt 
-rw-r--r-- 1 person staff 0 Feb 15 13:46 sweet.html 
-rw-r--r-- 1 person staff 0 Feb 15 13:46 test.md 

Скорее, чем следующее:

$ ll 
total 0 
-rw-r--r-- 1 person staff 0 Feb 15 13:46 cool.txt 
-rw-r--r-- 1 person staff 0 Feb 15 13:46 sweet.html 
-rw-r--r-- 1 person staff 0 Feb 15 13:46 test.md 

Есть ли одна команда, которую я могу добавить к моему zshrc, чтобы это произошло для всех псевдонимов? Я бы предпочел не изменять каждый псевдоним.

+0

'set -vx; myAlias ​​args; set + vx' не дает то, что вы wnat (за исключением префикса 'executing:'. Удачи. – shellter

+0

К сожалению, нет. Я ищу что-то, что я могу установить один раз, который будет применяться ко всем псевдониму, не связанным с ними. Кроме того, даже если бы я сделал это для каждого псевдонима, он все равно оставил бы кучу информации о псевдонимах и функциях, используемых для создания моего пользовательского приглашения zsh. Спасибо за комментарий, хотя! Я определенно ценю помощь. –

ответ

6

Если вы отлично с наличием псевдонимов отображаются, если псевдоним является первым словом присутствует в командной строке вы можете попытаться поместить следующий код в .zshrc:

_-accept-line() { 
    emulate -L zsh 
    local -a WORDS 
    WORDS=(${(z)BUFFER}) 
    # Unfortunately ${${(z)BUFFER}[1]} works only for at least two words, 
    # thus I had to use additional variable WORDS here. 
    local -r FIRSTWORD=${WORDS[1]} 
    local -r GREEN=$'\e[32m' RESET_COLORS=$'\e[0m' 
    [[ "$(whence -w $FIRSTWORD 2>/dev/null)" == "${FIRSTWORD}: alias" ]] && 
     echo -nE $'\n'"${GREEN}Executing $(whence $FIRSTWORD)${RESET_COLORS}" 
    zle .accept-line 
} 
zle -N accept-line _-accept-line 

Описания (некоторые тривиальные вещи пропускаются):

emulate -L zsh # Reset some options to zsh defaults (locally). 
       # Makes function immune to user setup. 

local -a WORDS # Declare WORDS as an array local to function 

${(z)VARNAME} # Split VARNAME using command-line parser. 
       # Things like “"first word" "second word"” get split into 2 words: 
       # “"first word"” “"second word"” 

$BUFFER  # Variable containing the whole command-line. Can be modified 

local -r V  # Declare variable “V” as read-only 

$'\e[32m'  # Escape code for green foreground color in most terminals 
$'\e[0m'  # Sequence that being echoed to terminal clears out color information 

whence -w cmd # Display type of the command in format “cmd: type” 
whence cmd  # If “cmd” is an alias, then this command outputs alias value 

zle .accept-line # Call internal zle “accept-line” widget. This must be done or 
       # every command will turn to no-op. You can, of course, replace 
       # this with “eval $BUFFER” but I can’t say what will break in this case 

zle -N accept-line _-accept-line # Associate widget “accept-line” with function 
       # “_-accept-line”. This makes this function responsible for accepting 
       # lines. 

Более подробную информацию в man zshbuiltins (emulate, whence, local), man zshzle (zle, $BUFFER), man zshparam (${(z)}).

+0

Отличная работа! я согласился на это как на ответ, но мне бы это понравилось, если бы ты тоже меня пропустил. Я не уверен, как ты это сделал, но я бы хотел учиться. Спасибо в любом случае! –

+0

Это супер, супер Спасибо за объяснения! Они очень ценятся. :-) –