Як я можу шукати історію з текстом, який уже введений під запитом в zsh?


58

У zsh я знаю, що можу шукати історію за допомогою Ctrl+ r. Однак часто я починаю набирати команду безпосередньо під запит, але потім розумію, що мені слід шукати історію. Коли я натискаю Ctrl+ r, він відображає такий пустий рядок пошуку історії:

Запит на пошук історії не заповнений

Зауважте, як є текст у моєму підказці, але не в запиті пошуку історії. Як запустити пошук історії з текстом, який вже є в підказці, щоб він виглядав так:

Запрошення пошуку історії попередньо заповнене

Відповіді:


44

Ви можете використовувати функціональність zlehistory-search :

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

Це пов'язує Upта Down(підлаштовує під свої власні послідовності втечі) для пошуку історії, назад та вперед, виходячи з того, що вже було введено під час запиту.

Отже, якщо ви ввели "vim" і натиснули Up, zsh пройде назад через вашу історію лише для тих команд, що починаються з "vim".

Ви можете додатково розмістити курсор у кінці рядка, як тільки ви вибрали потрібну команду з історії zsh, використовуючи функцію search-end-end (як правило, розміщена в /usr/share/zsh/functions/Zle/) та додавши -endдо кінця кожного рядка, наприклад:

autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^[[A" history-beginning-search-backward-end
bindkey "^[[B" history-beginning-search-forward-end

Чудово, дякую. Мені довелося видалити "-end" для обох команд bindkey, щоб вони працювали. Я не відредагував вашу відповідь, тому що, можливо, є якась ситуація, в якій вони потрібні?
Шон Маккейз

Немає проблем: оновив відповідь детально, яку ви хотіли уточнити.
jasonwryan

Це працювало для мене до кінця листопада 2015 року, коли я перейшов до останньої версії ой мій zsh. Будь-які ідеї? пропозиція? хтось ще бачив це? як налагодити?
Хані уточнила

2
@hanielabed Oh-my-Zsh - це clusterfsck; Я зовсім не здивований, що це зламає щось таке принципове, як пошук історії ...
jasonwryan

1
Чи є спосіб, щоб курсор стрибнути до кінця з порожнього пошуку історії, але залишитися в тій же позиції для часткового пошуку? Це те, що відбувається в bash зараз.
CMCDragonkai

19

Ще один корисний варіант history | grep

Присвоїти псевдонім, наприклад

alias hg='history | grep'

тоді ви можете ввести hg whateverдля пошуку використовувані команди, наприклад

$ hg chmod                                                                                                       
 1309  chmod +x rotate_files.sh 
 1385  chmod +x rotate_files_270.sh 
 1512  chmod +x testy.sh 
 1528  chmod +x act_on_2_numbers.sh 
 2142  chmod +x ~/bin/display_tmux_pane_pwd.sh
 4532  chmod +x cat_files.rb 

Я помістив цей псевдонім у свої точкові файли.


17
Що hgмені нагадує ... О так, Меркуріал!

12

Якщо ви використовуєте oh-my-zsh , додайте history-substring-searchдо plugins=(...)рядка.

Потім додайте

bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down

десь під рядком, який читав source $ZSH/oh-my-zsh.sh. Збережіть і запустіть новий термінал або запустіть source ~/.zshrcу поточному терміналі.

Примітка: ^[[A це послідовність втечі стрілки вгору в терміналі, який я використовую (kitty) та багато інших. Щоб зареєструватися у вибраному вами терміналі, введіть showkey -aта натисніть клавішу, для якої потрібно знайти послідовність виходу.


Незрозуміло, що робить ця клавіша, відповідь вище пояснює "Це пов'язує вгору та вниз (підлаштовуйте під свої власні послідовності втечі) для пошуку історії, назад та вперед, виходячи з того, що вже було введено під час запиту".
Колін Д

@ColinD Додав замітку для уточнення
joelostblom

1
Пошук підрядків найкраще, починаючи з його набору команд. щоб реалізовувати, не будучи ой-мі-zsh користувачем, я brew install zsh-history-substring-searchперевірив репо-readme для вказівок, я просто продовжую і створять відповідь, я дуже задоволений результатом.
Мерлін


4

Я настійно рекомендую використовувати "$terminfo[kcuu1]"або "$key[Up]"замість того, щоб жорстко закодовані речі, "^[[A"які можуть працювати або не працювати в будь-якій конкретній системі.

Ознайомтеся з /etc/zsh/zshrcдодатковими ключами. Ось як це виглядає в моїй системі. Я думаю, terminfoключі швидше визначаються.

key=(
    BackSpace  "${terminfo[kbs]}"
    Home       "${terminfo[khome]}"
    End        "${terminfo[kend]}"
    Insert     "${terminfo[kich1]}"
    Delete     "${terminfo[kdch1]}"
    Up         "${terminfo[kcuu1]}"
    Down       "${terminfo[kcud1]}"
    Left       "${terminfo[kcub1]}"
    Right      "${terminfo[kcuf1]}"
    PageUp     "${terminfo[kpp]}"
    PageDown   "${terminfo[knp]}"
)

4

Що з використанням zsh-autosuggestions?

Вся справа в тому, що для кожної команди, яку ви вводите, цей плагін покаже вам кілька пропозицій, які можна прийняти чи ні. Спробуйте це і дайте нам відгуки.

Не маючи плагінів, ми можемо натискати, Ctrlrщоб виконати зворотний пробіг історії, як тільки ви почнете вводити відповідні команди, з'являться як пропозиції.


2

Я використовую плагін vi-mode . І тоді в моєму ~ / .zshrc у мене є такі прив'язки:

bindkey "^P" history-beginning-search-backward
bindkey "^N" history-beginning-search-forward

Це дозволяє мені використовувати ^Pі ^Nяк звичайний назад, і вперед, якщо я не ввожу жоден текст, і як фільтруваний пошук, якщо так.


1

Я погоджуюсь з шеф-кухарем, що пошук у підрядках є кориснішим. Я не можу там коментувати, тому я почав нову відповідь. Я використовую oh-my-zsh і додаю "history-substring-search" до плагінів = (...) ~ / .zshrc. Тоді джерело ~ / .zshrc. Більше нічого не потрібно додавати. Використовуйте "bindkey" для підтвердження:

"^ [OA" історія-підрядка-пошук-пошук
"^ [OB" історія-підрядка-пошук-вниз

Пізніше ви вводите "до" та стрілку вгору, з'явиться "історія" та "виділено" (якщо ви раніше використовували команду "історія").


1

Ви можете замість цього використовувати zaw , який повністю замінює ваш пошук набагато кращим мульти ключовим словом супер пошуку, а також виправляє вашу проблему - історія пошуку лише одна з речей, за якими може вести пошук.

Невелике вступ / дискусія тут


0

Оскільки я використовую oh-my-zsh і використовую рішення підрядки від joelostblom, Джеймс, я змінюю .zshrc так: (який у рядку 13 знайдіть рядок "source $ ZSH / oh-my-zsh.sh" , а потім змінити код навколо нього.)

plugins=(
  git
  history-substring-search
)

source $ZSH/oh-my-zsh.sh

bindkey -v
bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down

bindkey -vпорушить ctrl-a, ctrl-e. Швидше за все, всі команди ctrl.
Михайло Озерянський

0

Відповідь не-О-Мій-Зш

Це працювало для мене (на macOS), щоб отримати історію підрядків, легко доступну за допомогою стрілки вгору / вниз. Ключова прив'язка залежить від вас.

Історія пошуку підрядків краще, ніж просто доступ до команд, які починаються з рядка. У більшості випадків це більше схоже на ctrl-r, у тих, що не відповідають глобусам або регулярним виразам.

Починаючи з інструкцій на zsh-users / zsh-history-substring-search

brew install zsh-history-substring-search

# add the following to .zshrc
source /usr/local/share/zsh-history-substring-search/zsh-history-substring-search.zsh
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down

Тепер насолоджуйтесь цим.

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