Существует ли оболочка, позволяющая быстро переупорядочивать аргументы?

Хотя вы можете использовать непрямой доступ, как указано в другом ответе , другим способом (в 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был массивом указателей, а не указателем на массив.

10
19.01.2020, 10:07
5 ответов

Чтобы решить конкретный случай, который вы упомянули о пути, вам не нужно использовать сложный «порядок переключения», вам потребуется управление недавней историей пути, такое как fzf для нечеткой истории поиска. Zsh archwiki должен упомянуть о каталогах,Вы должны проверить это.

Я обнаружил, что очень часто я захожу на путь, а затем мне нужно выполнить какие-то действия над чем-то внутри этого пути, который в настоящее время находится вне пути. Управление историей пути повысит эффективность, как в случае с fzf.

-1
27.01.2020, 20:01

Я понял, что режим vim zsh немного более продвинут, чем я думал раньше. Имеется текстовый объект a, который соответствует аргументу. Таким образом, я мог бы воспользоваться некоторой мышечной памятью, набрав такую ​​последовательность, как EscdaaBPiПробел . Но вы также можете видеть, что 8 нажатий клавиш далеки от идеала. Учитывая, что эта операция требует элегантных плагинов для Vim, то же самое можно сказать и о линейном редакторе zsh.

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

3
27.01.2020, 20:01

В 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 рамки конфигурации.

0
27.01.2020, 20:01

Я несколько раз сталкивался с похожей проблемой и не верю, что существует чистое решение. Вы должны быть в состоянии сделать некоторые хакеры, чтобы сделать это. Самый хакерский подход, вероятно, состоит в том, чтобы просто сбросить команду в историю, не выполняя ее, добавив к ней префикс echo и затем отбросив ! :0, после чего ваше вышеуказанное решение будет работать.

Лучшим подходом было бы подключение к ZSH-версии readline (zle, если я правильно помню ). Это намного мощнее, чем обычная строка чтения, и вы, вероятно, можете манипулировать ею на месте, даже не записывая плохую команду в историю. Я бы посоветовал взглянуть на существующие плагины, которые автоматически расширяют строку в месте -в качестве отправной точки. Хорошим примером является этот плагин :https://github.com/wazum/zsh-directory-dot-expansion(, который расширяет ...до ../..при вводе ). На самом деле, глядя на этот репозиторий, вы, вероятно, сможете получить плагин для этой логики, изменив 1 -2 строки исходного сценария автора.

Обратите внимание, что вы не будете автоматически -расширять zleпо мере того, как пользователь вводит текст, а будете реагировать на некоторую последовательность клавиш пользователя (, аналогичную комбинации alt+T, которую вы упоминаете ). Таким образом, ваш плагин будет больше похож на завершение табуляции -, чем на простое автоматическое расширение -.

2
27.01.2020, 20:01

Does such a plugin exist for zsh?

Да, такой плагин существует! Я поддерживаю подключаемый модуль Zsh Edit , который (среди прочего )дает вам привязки клавиш для пропуска и вырезания целых слов оболочки ,плюс средство просмотра буфера обмена:

Команда emacsраскладка клавиатуры mainраскладка клавиатуры mainраскладка клавиатуры
Обратное подслово АльтВCtrlАльт
Обратное слово оболочки CtrlAltBCtrlАльт
Подслово вперед АльтFУправл.Альт
Слово оболочки вперед CtrlAltFCtrlАльт
Подслово обратного уничтожения AltBackspaceCtrlBackspaceAltBackspace
Слово оболочки уничтожения в обратном направлении Управл.ЗShiftCtrlBackspaceCtrlAltBackspace
Символ удаления вперед Удалить
Подслово прямого уничтожения АльтDКонтр.УдалитьАльтУдалить
Слово оболочки прямого уничтожения CtrlAltDShiftCtrlУдалитьCtrlAltУдалить
Начало строки Управл.АГлавная
Конец строки CtrlEКонец
Начало буфера Альт<CtrlГлавнаяPageUp
Конец буфера Альт>Контр.КонецPageDn
Обратная линия поражения CtrlUСменаДомСдвиг
Передняя линия поражения CtrlКСдвигКонецСдвиг
0
05.11.2021, 09:51

Теги

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