Изменить порядок извлечения истории команд оболочки Windows

7

Одна из вещей, которая сводит меня с ума в командной строке под MS-Windows - это порядок, в котором оболочка Windows (как стандартная, так и PowerShell) извлекает команды из истории при использовании клавиш со стрелками вверх и вниз.

Стандартный способ, который мне понравился, как это делается практически во всех других оболочках мира, заключается в том, что последняя команда помещается в стек истории, а затем нажатие вверх возвращает последнюю команду, которую я выполнил, «вверх». снова получит тот, что был до этого, и так далее. Если вы выбираете команду из истории и отправляете ее снова, команда копируется в верхнюю часть стека, и если вы нажимаете вверх в следующем приглашении, вы можете увидеть эту последнюю команду, а затем команду, предшествующую последней. Если после просмотра истории вы нажмете «вниз» после самой последней команды в стеке истории, вы вернетесь к пустому приглашению (или к тому, что у вас было до того, как вы начали просматривать историю).

В оболочке Windows это работает странно иначе: если у вас есть 3 команды в истории - например, давайте назовем их «A», «B» и «C» - и вы используете клавишу со стрелкой вверх, чтобы выбрать команду «B» и выполнить снова, а затем снова используйте клавишу со стрелкой вверх в следующем приглашении, оболочка отобразит «B». Но это не последняя команда, которую вы выполнили (хотя «B» действительно была снова скопирована в стек истории), так как если вы снова нажмете «вверх», вам будет показано «A», а не «C». Если вы перейдете вниз (к более поздним записям), вы снова увидите «B», затем «C», затем снова «B», что было последней введенной командой - но вы также не можете идти дальше: пути назад нет в пустое приглашение, кроме удаления всего, что у вас есть в строке или нажатия CTRL-C.

Мой вопрос - есть ли настройки, которые можно установить, чтобы изменить это поведение?

Я знаю о возможности просто получить bash или что-то в этом роде и использовать его в Windows, но из-за внешних ограничений (например, для этого мне нужно написать свои скрипты), я должен работать в PowerShell или другой Windows оболочка, которая может вызывать скрипты PowerShell.

Guss
источник
Я бы сказал, что ответ "вероятно, нет".
Я не могу решить вашу главную проблему, но хороший способ запомнить это нажать CRTL-Home, чтобы стереть текущую строку.
zdan
Кстати, это еще один пример того, почему делать PowerShell полностью объектно-ориентированным не было хорошей идеей: вводя новые сложные механизмы, вы также вводите новые разочаровывающие странные поведения и крайние случаи.
Guss
Я согласен, что это сводит с ума, когда вы привыкли к приглашению * nix, но я думаю, что есть обоснование. Я считаю, что это «возвращает вас» к команде в стеке, поэтому вы просто перемещаетесь вверх и вниз по списку. Он не добавляет новый элемент внизу и не приведет вас туда, если вы не измените что-либо или не введете что-то новое. Как только вы вспомните, что остались в истории, вы можете привыкнуть к этому. Но это очень тяжелый сдвиг для мышечной памяти!
scipilot

Ответы:

5

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

В Свойствах (или По умолчанию), когда вы щелкаете правой кнопкой мыши в верхнем левом углу, есть опция «Отменить старые дубликаты», отметьте ее, и стек изменит свое поведение.

в вашем примере выполнения "A", "B", "C", а затем дважды, чтобы выполнить "B", стек будет выглядеть: "B","C","A" (first up will be "B")

Ofir Luzon
источник
1
Это не именно так то, что я хотел, но это настолько близко, что это не имеет большого значения - моя главная претензия состояла в том, что нажатие клавиши СТРЕЛКА ВВЕРХ после выполнения команды из истории возвращает не «текущую запись истории» к «после последней записи», а к «после» запись, которую вы выбрали в последний раз "(но до следующей). Это исправляет это, сохраняя курсор виртуальной истории «после последней выбранной записи», но перемещая указанную запись в конец, в результате чего курсор истории также будет «после последней записи». Спасибо!
Guss
На полпути туда, но это СООО намного лучше. Спасибо Офир!
kmort
3

Также не забывайте F7, Это всплывает DOS -стиль меню, показывающий историю команд (ESC, чтобы она исчезла). «Последняя» команда, введенная или выбранная с помощью стрелки вверх, будет показана, поэтому вы сразу увидите, где находитесь в контексте стрелки вверх / вниз.

Видимо это от того, что называется DOSKEY , плохо документированная утилита. Например, помимо «вверх», «вниз» и затем ввода для выполнения команды, я обнаружил, что клавиша со стрелкой вправо или влево поместит ее в подсказку без выполнения (так что вы можете редактировать ее). PgUp / PgDn / Home / End будет перемещаться по списку очевидным способом, и я только что обнаружил (нигде не видел его документированного), что если вы нажмете первую букву команды, она будет переключаться между командами, начинающимися с этой буквы ( поэтому введите команду, как ze fun start now! легко перейти к этому моменту истории, нажав z в F7 ).

Возможно, хотя, если предвидеть оживление большей части истории, может лучше

doskey /history > editme.bat

чем перенести стропы и стрелки и скопировать / вставить из указанной записи (или пусть твои миньоны превращают это в сценарий).

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

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

toddkaufmann
источник
1. Спасибо - я не знал о F7, и это выглядит полезным - хотя бы для того, чтобы уменьшить ужасную путаницу, которую представляет собой навигация по истории консоли Windows. 2. doskey Команда не работает для меня, вероятно, потому что я использую PowerShell, а не cmd.exe (см. OP). 3. Ссылка, которую вы предоставили, предназначена не для Джоэла Спольски, а для его соучастника Джеффа Этвуда. Все еще удивительный чувак, и информация полезна, даже если она относится только к cmd.exe - так что еще раз спасибо. 4. Наконец, в отношении cygwin, см. Последний параграф OP. \ n \ n Похоже, у меня нет другой альтернативы, кроме как катить собственную консоль.
Guss
Это так великолепно ретро! Я люблю это. Так рад, что они удосужились сохранить его в PS.
scipilot