ZSH: історія пошуку на клавішах вгору та вниз?


22

Наразі в моєму .zshrc є наступне:

bindkey '^[[A' up-line-or-search
bindkey '^[[B' down-line-or-search

Однак це, здається, відповідає вмісту мого поточного входу до появи символу пробілу. Наприклад, sudo ls /буде відповідати кожен рядок моєї історії, який починається з того часу sudo, хоча я хотів би, щоб він відповідав лише рядкам, які відповідають моєму вкладенню. (тобто sudo ls /etcвідповідатиме, але ні sudo cat /var/log/messages)

Що потрібно змінити, щоб отримати бажану поведінку?

Ось мій весь .zshrc на випадок, коли це доречно: https://gist.github.com/919566

Відповіді:


9

Це документально підтверджена поведінка :

down-line-or-search
Перемістіть рядок у буфері або, якщо він вже знаходиться в нижньому рядку, пошукайте в історії історію рядка, що починається з першого слова в буфері.

Здається, не існує жодного віджета, який виконує саме те, що ви хочете, тому вам доведеться зробити свій власний. Ось як визначити віджет, який веде себе так up-line-or-search, але використовуючи початок рядка (до курсору), а не перше слово як рядок пошуку. Не дуже перевірено, особливо не на багаторядковому вході.

up-line-or-search-prefix () {
  local CURSOR_before_search=$CURSOR
  zle up-line-or-search "$LBUFFER"
  CURSOR=$CURSOR_before_search
}
zle -N up-line-or-search-prefix

Альтернативний підхід полягає у використанні history-beginning-search-backward, але викликати його лише у випадку, якщо курсор знаходиться на першому рядку. Неперевірений.

up-line-or-history-beginning-search () {
  if [[ -n $PREBUFFER ]]; then
    zle up-line-or-history
  else
    zle history-beginning-search-backward
  fi
}
zle -N up-line-or-history-beginning-search

Дякую, Жиле, твоє перше рішення працює добре, але є одна проблема, і я сподіваюся, що ти можеш допомогти мені вирішити це питання. Коли я викликаю префікс up-line-or-search на порожньому вході, він дає мені останню команду запуску - бажану поведінку. Однак, коли я знову запускаю префікс up-line-or-search-on, він виконує пошук за першим символом мого введення. Чи можна якось змінити речі, щоб натискання стрілки вгору з порожнім входом прокручувало мою історію?
rps

@rps Ах, ось, воно набирало перше слово, оскільки аргумент відсутній (замість того, щоб він був порожнім, як повинен бути). Використовувати мою відредаговану версію.
Жил "ТАК - перестань бути злим"

33

zsh надають цю функціональність за допомогою

history-beginning-search-backward
history-beginning-search-forward

Вих.

bindkey "^[[A" history-beginning-search-backward
bindkey "^[[B" history-beginning-search-forward

Знайти точний код ключа за допомогою
ctrl+vKEY

Вих.
ctrl+ vUP
ctrl+ vDOWN
ctrl+ vPageUp
ctrl+ vPageDown
і т.д.


1
Альтернативу для клавішних кодів, які можуть працювати через різні термінали, можна знайти в zprezto [ 1 ]. <kbd> Вгору </kbd> є $terminfo[kcuu1], <kbd> Вниз </kbd> є $terminfo[kcud1].
Джастін C

8

У цій публікації щоденника з 2013 року рекомендовано пару клавіш, які відповідають усім словам перед курсором.

# Cycle through history based on characters already typed on the line
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "$key[Up]" up-line-or-beginning-search
bindkey "$key[Down]" down-line-or-beginning-search

(У попередній версії цієї відповіді я використовував, $terminfoяк було рекомендовано, в одному з коментарів до публікації в блозі. Тут перераховані деякі значення terminfo .)


1
ЗШ також дає ці нешкідливі псевдоніми (принаймні в пакеті Ubuntu) в /etc/zsh/zshrc, наприклад $key[Up].
zzxyz

При використанні $terminfoвам потрібно буде змінити режими терміналу. Дивіться тут .
Том Хейл

Я змінив відповідь, яку потрібно використовувати $key[]замість $terminfo[]. Сподіваюся, це добре працює для читачів!
joeytwiddle

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.