Завершение первого аргумента cd OLD NEW

Вы путаете два разных оператора оболочки.

Перенаправление > перенаправляет вывод в файл. Поэтому, чтобы ваш пример работал, вы можете использовать:

awk 'NR == 2 {print $3}' a.txt > price
cat price   # display contents of file named price

Оператор $ ссылается на переменную, поэтому, чтобы ваш echo вывел переменную, вы должны сначала установить ее из вывода предыдущего оператора. Например, так:

price=$(awk 'NR == 2 {print $3}' a.txt)
echo "$price"
22
11.11.2016, 09:48
1 ответ

Я думаю, вы могли бы добавить компоненты $PWDв список завершения cd, хотя для этого, похоже, потребуется возиться с _cd; то есть настроенная версия _cdдолжна появиться первой в $fpath.

% cd && mkdir zcomp
% cp $fpath[-1]/_cd zcomp
% fpath=(~/zcomp $fapth)

Затем вверху ~/zcomp/_cdдобавьте функцию

_our_pwd() {
  _values ourpwd ${(ps:/:)PWD}
}

, а затем непосредственно перед строкой _alternativeдобавьте то, что она возвращает, в список альтернатив

  ...
  alt=("$service-options:$service option:_cd_options" "$alt[@]")
fi

alt=(ourpwd:pwd:_our_pwd "$alt[@]")

_alternative "$alt[@]" && ret=0

return ret
...

. ] хотя это всегда будет добавлять компоненты pwdк завершениям cd:

% cd
Users    jdoe    Applications/  Desktop/  Documents/  Downloads/  Library/
...

с дополнительной логикой вы можете добавлять компоненты $PWDтолько тогда, когда уже есть второй аргумент присутствует вместо всегда.

Однако! Это всегда портит завершение cdи требует, чтобы мы исправили восходящее завершение _cd. Другим вариантом может быть создание нового имени для функции с двумя аргументами cd, возможно называемой cdsub, и иметь только завершение компонентов PWD. появиться для этого. Добавьте это в ~/.zshrc

function cdsub { builtin cd "$@" }

А затем завершение _cdдля _cdsubдля размещения где-то в $fpath:

#compdef cdsub
#
# Modified version of _cd from ZSH 5.3.1 with specific support for the
# `cd old new` form whereby PWD elements are provided for completion.

_cd_options() {
  _arguments -s \
  '-q[quiet, no output or use of hooks]' \
  '-s[refuse to use paths with symlinks]' \
  '(-P)-L[retain symbolic links ignoring CHASE_LINKS]' \
  '(-L)-P[resolve symbolic links as CHASE_LINKS]'
}

setopt localoptions nonomatch

local expl ret=1 curarg
integer argstart=2 noopts

if (( CURRENT > 1 )); then
  # if not in command position, may have options.
  # Careful: -<-> is not an option.
  while [[ $words[$argstart] = -* && argstart -lt CURRENT ]]; do
    curarg=$words[$argstart]
    [[ $curarg = -<-> ]] && break
    (( argstart++ ))
    [[ $curarg = -- ]] && noopts=1 && break
  done
fi

if [[ CURRENT -eq $((argstart+1)) ]]; then
  # cd old new: look for old in $PWD and see what can replace it
  local rep
  # Get possible completions using word in position 2
  rep=(${~PWD/$words[$argstart]/*}~$PWD(-/))
  # Now remove all the common parts of $PWD and the completions from this
  rep=(${${rep#${PWD%%$words[$argstart]*}}%${PWD#*$words[$argstart]}})
  (( $#rep )) && _wanted -C replacement strings expl replacement compadd -a rep
else
  _values ourpwd ${(ps:/:)PWD} && ret=0
  return ret
fi
1
27.01.2020, 19:43

Теги

Похожие вопросы