Хотя вы можете использовать непрямой доступ, как указано в другом ответе , другим способом (в ksh и Bash 4.3 и новее )будет использование имен. Особенно в случае массивов это может быть более полезным, поскольку вы можете индексировать массив через nameref и не нужно помещать индекс в переменную, используемую в качестве ссылки.
arr1=(a b c)
arr2=(x y z)
typeset -n p=arr1 # or 'declare -n'
echo "${p[1]}" # prints 'b'
Непрямой доступ не работает:
q=arr2
echo "${!q}" # prints 'x', the same as $arr2
echo "${!q[1]}" # doesn't work, it tries to take q[1] as a reference
Как мог бы сказать программист на C, ${!q[1]}
здесь действует так, как если бы q
был массивом указателей, а не указателем на массив.
Чтобы решить конкретный случай, который вы упомянули о пути, вам не нужно использовать сложный «порядок переключения», вам потребуется управление недавней историей пути, такое как fzf для нечеткой истории поиска. Zsh archwiki должен упомянуть о каталогах,Вы должны проверить это.
Я обнаружил, что очень часто я захожу на путь, а затем мне нужно выполнить какие-то действия над чем-то внутри этого пути, который в настоящее время находится вне пути. Управление историей пути повысит эффективность, как в случае с fzf.
Я понял, что режим vim zsh немного более продвинут, чем я думал раньше. Имеется текстовый объект a
, который соответствует аргументу. Таким образом, я мог бы воспользоваться некоторой мышечной памятью, набрав такую последовательность, как EscdaaBPi
Пробел . Но вы также можете видеть, что 8 нажатий клавиш далеки от идеала. Учитывая, что эта операция требует элегантных плагинов для Vim, то же самое можно сказать и о линейном редакторе zsh.
Кроме того, перевод zsh в режим vim нарушает уже имеющиеся привязки, хотя их должно быть легко воспроизвести. Иногда было бы неплохо иметь привязки vim в оболочке. Но я все еще склоняюсь к тому, что иметь дело с оболочкой, которая, возможно, находится в режиме вставки, не стоит заморачиваться.
В Bash нажмите Ctrl -XCtrl -E , чтобы открыть текущий ввел командную строку в свой $EDITOR
. Отредактируйте его, как вам нравится, затем сохраните и выйти, чтобы выполнить его.
Например, если вашим редактором по умолчанию является Vim, <C-x><C-e>f dE$p:wq
будет преобразовать исходную командную строку в желаемую командную строку и выполнить его. Конечно, если у вас есть такой плагин, как sideways.vim
, вы можете используйте и это.
Это более общее средство, чем просто быстрое переупорядочивание аргументов. так что это полезно для многих преобразований. Обратите внимание, что вы можете ввести это режиме при запуске с пустой командной строки.
Если вы решите отменить эту операцию, находясь в редактор, либо выйдите из редактора с не -нулевым кодом состояния (Vim::cq
)или просто замените команду пустой строкой, сохраните и выйдите.
Техническое название этой операции — edit-and-execute-command
. Ты можете переназначить -комбинацию клавиш в вашем .inputrc
или узнать больше в man bash
.
Вы спрашивали о Zsh; похоже похожая функциональность есть доступно и может быть включено по умолчанию в некоторых Zsh рамки конфигурации.
Я несколько раз сталкивался с похожей проблемой и не верю, что существует чистое решение. Вы должны быть в состоянии сделать некоторые хакеры, чтобы сделать это. Самый хакерский подход, вероятно, состоит в том, чтобы просто сбросить команду в историю, не выполняя ее, добавив к ней префикс echo и затем отбросив ! :0, после чего ваше вышеуказанное решение будет работать.
Лучшим подходом было бы подключение к ZSH-версии readline (zle, если я правильно помню ). Это намного мощнее, чем обычная строка чтения, и вы, вероятно, можете манипулировать ею на месте, даже не записывая плохую команду в историю. Я бы посоветовал взглянуть на существующие плагины, которые автоматически расширяют строку в месте -в качестве отправной точки. Хорошим примером является этот плагин :https://github.com/wazum/zsh-directory-dot-expansion(, который расширяет ...
до ../..
при вводе ). На самом деле, глядя на этот репозиторий, вы, вероятно, сможете получить плагин для этой логики, изменив 1 -2 строки исходного сценария автора.
Обратите внимание, что вы не будете автоматически -расширять zle
по мере того, как пользователь вводит текст, а будете реагировать на некоторую последовательность клавиш пользователя (, аналогичную комбинации alt+T
, которую вы упоминаете ). Таким образом, ваш плагин будет больше похож на завершение табуляции -, чем на простое автоматическое расширение -.
Does such a plugin exist for zsh?
Да, такой плагин существует! Я поддерживаю подключаемый модуль Zsh Edit , который (среди прочего )дает вам привязки клавиш для пропуска и вырезания целых слов оболочки ,плюс средство просмотра буфера обмена:
Команда | emacs раскладка клавиатуры | main раскладка клавиатуры | main раскладка клавиатуры |
---|---|---|---|
Обратное подслово | АльтВ | Ctrl← | Альт← |
Обратное слово оболочки | CtrlAltB | Ctrl↑ | Альт↑ |
Подслово вперед | АльтF | Управл.→ | Альт→ |
Слово оболочки вперед | CtrlAltF | Ctrl↓ | Альт↓ |
Подслово обратного уничтожения | AltBackspace | CtrlBackspace | AltBackspace |
Слово оболочки уничтожения в обратном направлении | Управл.З | ShiftCtrlBackspace | CtrlAltBackspace |
Символ удаления вперед | Удалить | ||
Подслово прямого уничтожения | АльтD | Контр.Удалить | АльтУдалить |
Слово оболочки прямого уничтожения | CtrlAltD | ShiftCtrlУдалить | CtrlAltУдалить |
Начало строки | Управл.А | Главная | |
Конец строки | CtrlE | Конец | |
Начало буфера | Альт< | CtrlГлавная | PageUp |
Конец буфера | Альт> | Контр.Конец | PageDn |
Обратная линия поражения | CtrlU | СменаДом | Сдвиг← |
Передняя линия поражения | CtrlК | СдвигКонец | Сдвиг→ |