ZSH: история поиска на вверх и вниз по ключам?

У меня когда-то была точно эта проблема: Я хотел присоединиться к некоторым файлам, но имел недостаточно дискового пространства для содержания их вдвойне.

Таким образом, я записал набор программ:

  • один для "всасывания" файла путем чтения его, отправки его в stdout и, если закончено, удаления его
  • и один для буферизации данных "на лету".

Это позволило мне сделать что-то как

partto sourcefile | mybuffer 128M >>cumufile

и таким образом удаляя исходный файл, в то время как 128M было все еще не записано. Немного опасный, но если данные не настолько драгоценны, или они существуют где-то в другом месте также, это выполнимо.

В случае необходимости я могу обеспечить источник.

22
05.07.2011, 21:13
5 ответов

Это - зарегистрированное поведение:

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
9
27.01.2020, 19:42
  • 1
    Спасибо, Gilles, Ваши первые работы решения вполне прилично, но существуют одна проблема, и я надеюсь, что можно помочь мне разрешить его. Когда я call up-line-or-search-prefix на пустом входе, это дает мне последнюю команду выполнения - желаемое поведение. Однако, когда я выполняю up-line-or-search-prefix снова, он делает up-line-or-search на первом символе моего входа. Действительно ли возможно так или иначе изменить вещи так, чтобы нажатие стрелки вверх с пустым входом просмотрело мою историю путем прокрутки? –  rps 14.07.2011, 19:33
  • 2
    @rps, глюк, это брало первое слово, потому что аргумент отсутствовал (вместо того, чтобы быть пустым, как он должен иметь). Используйте мою отредактированную версию. –  Gilles 'SO- stop being evil' 15.07.2011, 02:02

Имейте также взгляд на zsh-history-substring-search проект.

Это предлагает то, что Вы ищете, и это может даже использоваться в качестве oh-my-zsh плагина.

1
27.01.2020, 19:42

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
и т.д.

34
27.01.2020, 19:42
  • 1
    Альтернатива для кодов клавиши, которые могли бы работать через различные терминалы, может быть найдена в zprezto [1]. <kbd> </kbd> $terminfo[kcuu1], <kbd> Вниз </kbd> $terminfo[kcud1]. –  Justin C 22.11.2015, 23:02

В этом сообщении в блоге от 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

Если $ key [Up] и $ key [Down] не работают на вашем компьютере, вы можете попробовать $ terminfo [kcuu1] и $ terminfo [kcud1] вместо этого.

9
27.01.2020, 19:42

Я нашел ответ на вопрос здесь , который я считаю идеальным.

Например, свяжите эти функции с клавишами «Page Up» и «Page Down», затем, когда я нажму «Page Up», он будет искать в истории, используя то, что я начал печатать, а не только первое слово.

т.е. если вы наберете sudo ls /etc, то sudo lsвызовет sudo ls /etc, но не sudo cat...и т. д.

Ниже приведена выдержка из моего файла zshrc.

## Page UP and Page Down through History
autoload -Uz history-search-end

zle -N history-beginning-search-backward-end \
                history-search-end
zle -N history-beginning-search-forward-end \
                history-search-end
bindkey "\e[5~" history-beginning-search-backward-end
bindkey "\e[6~" history-beginning-search-forward-end
1
04.01.2021, 14:56

Теги

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