Это запрос на разъяснение или ссылку на документацию.
Я пользователь KornShell93 ( ksh
на Mac OS X или ksh93
где-то еще). Мне нравится эта оболочка за ее относительную простоту в качестве интерактивной оболочки и за ее возможности скриптования, и я использую ее с тех пор, как код стал более свободным в 2000 году. Я использую ее в vi
режиме редактирования, с установленными параметрами vi
и viraw
.
Есть удобная функция, ksh93
которая позволяет вам начать вводить команду в командной строке, а затем нажать Up-arrow, чтобы получить последнюю соответствующую командную строку из истории командной строки. Я могу найти документацию для этого и как это связано [count][A
в vi
режиме редактирования, без проблем.
Однако, если я нажимаю Up-arrowна пустую подсказку, он сначала выдает мне последнюю выполненную команду, а затем начинает циклически проходить по любому префиксу команды, который я искал ранее. Это меня раздражает бесконечно.
Пример:
Я выполняю эти три команды:
$ ls -l
$ ls -ld test
$ ls -ld testdir
Ввод ls
и последующее Up-arrowтрехкратное нажатие переключат их в обратном порядке.
Позже, с большим количеством команд, но без поиска в истории и без ls
вызовов:
$ cc -o testrun mytest.c
$ man strncmp
Если я сейчас нажму Up-arrowодин раз, я получу man strncmp
. Если я нажму Up-arrowеще раз, я получу ls -ld testdir
и затем ls -ld test
вместо команды cc -o testrun mytest.c
и затем предыдущей до нее.
Я ищу указатели на то, как "исправить" это так, чтобы Up-arrowбез предварительного ввода чего-либо в командной строке циклически проходить по самой последней истории, не пытаясь искать ранее использованный префикс. Даже указатель на место, где поведение выше задокументировано, был бы хорош.
РЕДАКТИРОВАТЬ:
В ksh93
руководстве говорится:
[count]k
Выбрать предыдущую команду. Каждый разk
при вводе осуществляется доступ к предыдущей команде во времени.
/string
Поиск в обратном направлении по истории для предыдущей команды, содержащейstring
.String
заканчивается наRETURN
илиNEW LINE
. Еслиstring
предшествует^
, совпадающая строка должна начинаться сstring
. Если равно null, будет использованаstring
предыдущая .string
[count][A
Если курсор находится в конце строки, то это эквивалентно/
сstring
установкой на содержимое текущей строки. В противном случае это эквивалентноk
.
Это делаетнетобъясните, почему япервыйполучить man strncmp
(как будто нажимаяk ) изатемget ls -ld testdir
в моем примере выше. Учитывая текст руководства, я бы ожидал получить ls -ld testdir
при первом нажатии Up-arrow(что, кстати, было бы еще более раздражающим).
решение1
Оказывается, это задокументированное поведение. Из страницы руководства ksh93:
Команды редактирования поиска Эти команды получают доступ к вашей истории команд.
[count]k
Выбрать предыдущую команду. Каждый раз при вводе k осуществляется доступ к предыдущей команде назад во времени.
[count]-
Эквивалентно к.
[count][A
Если курсор находится в конце строки, то это/
эквивалентнонитьустановить на содержимое текущей строки. В противном случае это эквивалентноk
.
[count]j
Выбрать следующую команду. Каждый разj
при вводе осуществляется доступ к следующей команде вперед по времени.
/
нить Поиск в истории предыдущей команды, содержащейнить. НитьзавершаетсяRETURN' or
НОВОЙ СТРОКОЙ. Еслинитьпредшествует^
, сопоставляемая строка должна начинаться снить. Еслинитьравно нулю, будет использована предыдущая строка.
Примечание: При использовании клавиши «Стрелка вверх» после ввода строки, строка поиска будетякорьв начало строки, как будто ^
она была напечатана спереди.
Пример:
$ ls[Up-Arrow]
эквивалентно
$ [ESC]/^ls