Как может я история поиска с текстом, уже введенным при подсказке в zsh?

netcat прост, но не все версии закрывают соединение надежно.

Вот поток об использовании socat: socat надежная передача файлов по TCP

Подвести итог его:

Предложенный:

Файл отправки сервера:

server$ socat -u FILE:test.dat TCP-LISTEN:9876,reuseaddr
client$ socat -u TCP:127.0.0.1:9876 OPEN:out.dat,creat

Файл получения сервера:

server$ socat -u TCP-LISTEN:9876,reuseaddr OPEN:out.txt,creat && cat out.txt
client$ socat -u FILE:test.txt TCP:127.0.0.1:9876

Предложенные улучшения:

  • OPEN:out.txt,creat,trunc удалит все байты в out.txt прежде, чем записать в него. Эта опция подражает тому, из чего Вы ожидали бы cp, и, вероятно, что Вы хотите.
  • OPEN:out.txt,creat,excl откажется писать out.txt если это уже существует. Используйте эту опцию для дополнительной безопасности.
  • OPEN:out.txt,creat,append добавит данные к out.txt.

60
02.04.2018, 21:38
12 ответов

Можно использовать zle's history-search функциональность:

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

Это связывает Вверх и вниз (корректируйтесь для своих собственных escape-последовательностей) к поиску истории, назад и вперед, основанный на том, что было уже введено в подсказку.

Так, если необходимо было фиксировать "энергию" и совершить нападки, zsh пересечет назад через историю только для тех команд, начинающихся с "энергией".

Можно было дополнительно поместить курсор в конце строки, после того как Вы выбрали свою желаемую команду из истории zsh при помощи поисковой конечной функции истории (обычно расположенный в /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
44
27.01.2020, 19:32
  • 1
    Большой, спасибо. Я должен был удалить "-конец" для обоих команды bindkey, чтобы заставить их работать все же. Я не отредактировал Ваш ответ потому что, возможно, существует некоторая ситуация, в которой это необходимо? –  Sean Mackesey 28.10.2013, 01:55
  • 2
    Никакая проблема: обновленный ответ с деталью Вы хотели разъясненный. –  jasonwryan 28.10.2013, 02:07
  • 3
    Это раньше работало на меня до конца ноября, декабря 2015, когда я обновил до последней версии, о, своего zsh. Какие-либо идеи? предложение? кто-либо еще видящий это? как отладить? –  hani elabed 18.12.2015, 08:20
  • 4
    @hanielabed Oh-my-Zsh является clusterfsck; я нисколько не удивлен, что это повредило бы что-то столь же фундаментальное, как история ищет... –  jasonwryan 18.12.2015, 08:24
  • 5
    Существует ли путь к курсору, чтобы перейти в конец от пустого поиска истории, но остаться таким же положение для частичного поиска? Это - то, что в настоящее время происходит в ударе. –  CMCDragonkai 11.01.2017, 06:35

Другая полезная опция 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 

Я поместил этот псевдоним в свои точечные файлы.

19
27.01.2020, 19:32
  • 1
    Что делает hg напомните мне о... О, да, Подвижный! –   27.03.2015, 21:57

Вы могли бы хотеть использовать сценарий в https://github.com/zsh-users/zsh-history-substring-search

Где можно ввести в любой части любой ранее вводимой команды и нажать клавиши Up and Down для циклического повторения посредством команд соответствия.

7
27.01.2020, 19:32

Если вы используете 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, а затем нажмите клавишу, для которой вы хотите найти управляющую последовательность.

14
27.01.2020, 19:32

Как насчет использования zsh-autosuggestions?

Дело в том, что для каждой команды, которую вы вводите, этот плагин покажет вам несколько предложений, которые могут быть приняты или нет. Попробуйте его и дайте нам несколько отзывов.

Без плагинов мы можем нажать Ctrlr, чтобы выполнить обратный поиск в истории, как только вы начнете вводить команду, совпадающие команды появятся в виде предложений.

5
27.01.2020, 19:32

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

Небольшое вступление / обсуждение здесь

1
27.01.2020, 19:32

Я согласен с cheflo, что поиск "подстроки" более полезен. Я не могу комментировать там, поэтому я начал новый ответ. Я использую oh-my-zsh, и добавляю "history-substring-search" в plugins=(...) в ~/.zshrc. Затем создайте исходный текст ~/.zshrc. Больше ничего добавлять не нужно. Используйте "bindkey" для проверки:

"^[OA" history-substring-search-up
"^[OB" history-substring-search-down

Позже, если вы наберете "to" и стрелку вверх, появится "history" и "to" будет выделено (если вы использовали команду "history" до этого).

1
27.01.2020, 19:32

Поскольку я использую о -мой -zsh и решение подстроки от joelostblom, James, Я модифицирую.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
0
27.01.2020, 19:32

Не -Ой -Мой -Зш ответ

Это сработало для меня (на macOS ), чтобы легко получить доступ к истории подстрок с помощью стрелок вверх/вниз. Привязка ключей зависит от вас.

История поиска подстрок лучше, чем просто доступ к командам, начинающимся со строки. В большинстве случаев это больше похоже на ctrl -r, без совпадения глобусов или регулярных выражений.

Начиная с инструкций в zsh -пользователи/zsh -история -подстрока -поиск

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

Теперь наслаждаюсь этим полностью.

2
27.01.2020, 19:32

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

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

Это позволяет мне использовать ^Pи ^Nкак обычный поиск вперед и назад, если я не ввожу текст, и как фильтрованный поиск, если я это делаю.

3
27.01.2020, 19:32

Ни один из существующих ответов не начинает добавочный поиск с того, что уже было введено, как в заданном вопросе. Это действительно возможно:

_history-incremental-search-backward () {
    zle.history-incremental-search-backward $BUFFER
}
zle -N history-incremental-search-backward _history-incremental-search-backward

# this line is actually not necessary since this is default.
bindkey '^R' history-incremental-search-backward

  • мы создаем пользовательский виджет zle для переноса history-incremental-search-backwardи передаем переменную $BUFFER, которая содержит содержимое введенной на данный момент подсказки zsh. Затем вы можете продолжить ввод в минибуфер, чтобы еще больше сузить область поиска.

Скриншоты

  • начните вводить команду

enter image description here

  • понять, что вы хотите выполнить поиск в своей истории, нажмите Ctrl -R, откроется минибуфер и заполнится содержимым командной строки. Таким образом, он сначала соответствует только что введенной командной строке:

enter image description here

  • снова нажмите Ctrl -R, это соответствует предыдущей команде, Tab или Ctrl -E, чтобы принять результат.

enter image description here

  • или продолжайте печатать, чтобы уточнить поиск

enter image description here

2
24.05.2020, 23:36

Для тех, кто хочет узнать больше о ответ jasonwryan'а

Это упомянутый файл:

# function history-search-end {
#
# This implements functions like history-beginning-search-{back,for}ward,
# but takes the cursor to the end of the line after moving in the
# history, like history-search-{back,for}ward.  To use them:
#   zle -N history-beginning-search-backward-end history-search-end
#   zle -N history-beginning-search-forward-end history-search-end
#   bindkey '...' history-beginning-search-backward-end
#   bindkey '...' history-beginning-search-forward-end

integer cursor=$CURSOR mark=$MARK

if [[ $LASTWIDGET = history-beginning-search-*-end ]]; then
  # Last widget called set $MARK.
  CURSOR=$MARK
else
  MARK=$CURSOR
fi

if zle.${WIDGET%-end}; then
  # success, go to end of line
  zle.end-of-line
else
  # failure, restore position
  CURSOR=$cursor
  MARK=$mark
  return 1
fi
# }

zle -N widget [ function ] :Создайте пользовательский -виджет.
Когда новый виджет вызывается из редактора, вызывается указанная функция оболочки .
Если имя функции не указано, по умолчанию используется то же имя, что и у виджета .
Рекомендуется, чтобы виджеты, определяемые пользователем -, не имели имен, начинающихся с ..

# To make  history-beginning-search-{back,or}ward-end  an alias    for history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
# why `history-beginning-search-{back,or}ward-end` is chosen?
# There is widgets named `history-beginning-search-{back,or}ward`,
# so just add 'end' to them, showing their relevance.

Думаю, (не совсем уверен ), без этой строки if [[ $LASTWIDGET = history-beginning-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

можно заменить на:

bindkey "^[[A" history-search-end
bindkey "^[[B" history-search-end
# less word to type

(Просто чтобы показать использование zleи bindkey. Теперь, когда у нас есть строка if, не используйте упрощенную.)

команда zsh bindkey

bindkey -v:выберите раскладку viins и привяжите ее к основной
bindkey -e:выберите раскладку клавиатуры emacs и привяжите ее к основной

-A:создать псевдоним (или ссылку)
bindkey -A viins mainделает viinsпсевдонимом дляmain

С именем mainсвязано либо emacs, либо viins.

Если одна из переменных среды VISUALили EDITORсодержит строку viпри запуске оболочки,
тогда будет viins,
в противном случае будет emacs.

Создайте новую раскладку изemacs:

  • bindkey -N mymapname emacs

Для использования "mymap":

  • bindkey -A mymapname main
1
12.11.2021, 01:20

Теги

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