В zsh как привязать сочетание клавиш для выполнения последней команды?

Я часто замечаю, что хочу повторить команду, и хотя !! полезен, я бы хотел связать это с ctrl-w или чем-то в этом роде. Есть ли способ сделать это?

РЕДАКТИРОВАТЬ: Я знаю, что стрелка вверх делает то, что я хочу, однако я бы предпочел не покидать главную строку. Будучи заядлым пользователем Vim, я научился тому, как важно использовать домашние клавиши.

Я просмотрел этот пост о добавлении ярлыка для получить доступ к команде info и попытаться что-то экстраполировать, но безуспешно. Zsh кричал на меня о том, что zle неактивен или что-то в этом роде.

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

# oh-my-zsh plugins. zsh-aliases and drush are custom plugins.
plugins=( git z tmux web-search colored-man zsh-aliases drush)
ZSH_TMUX_AUTOSTART=true
#... $PATH, start background process (clipboard integration for tmux, 
# glances system monitor), history options, editor, all truncated for brevity.
# use vim mode
bindkey -v
#show insert/normal mode in prompt
function zle-line-init zle-keymap-select {
    RPS1="${${KEYMAP/vicmd/NORMAL}/(main|viins)/INSERT}"
    RPS2=$RPS1
zle reset-prompt
}
zle -N zle-line-init
zle -N zle-keymap-select
# rebind ctrl-r
bindkey -M vicmd '^R' history-incremental-search-backward
bindkey -M viins '^R' history-incremental-search-backward

Полные конфигурации: https://github.com/yramagicman/dotfiles

Только .zshrc: https://github.com/yramagicman/dotfiles/blob/master/.zshrc

кастомные плагины:


person Jonathan    schedule 02.03.2015    source источник


Ответы (2)


Чтобы получить последнюю команду из истории, вы можете использовать виджет up-history. По умолчанию это связано с Ctrl + P в режиме vicmd, поэтому нажатие Esc с последующим Ctrl + P, а затем Enter (который вызывает виджет accept-line) сделает свое дело.

Если вы хотите привязать его к одному ярлыку, вам нужно написать свой собственный виджет. Вы можете добавить это в свой ~/.zshrc:

# define function that retrieves and runs last command
function run-again {
    # get previous history item
    zle up-history
    # confirm command
    zle accept-line
}

# define run-again widget from function of the same name
zle -N run-again

# bind widget to Ctrl+X in viins mode
bindkey -M viins '^X' run-again 
# bind widget to Ctrl+X in vicmd mode
bindkey -M vicmd '^X' run-again

Для примера я выбрал Ctrl + X в качестве ярлыка, потому что по умолчанию он не привязан в режиме vicmd и самовставляется в viins , тогда как Ctrl + W уже привязан к vi-backward-kill-word в viins. Конечно, вы можете перезаписать привязку по умолчанию, если вы ее все равно не используете, или привязать виджет только в режиме.

person Adaephon    schedule 09.03.2015
comment
Отлично, спасибо. Ctrl-X - мой лидер tmux, так что у меня это не работает. У меня сейчас он привязан к ctrl-w, но мне нужно взглянуть на раскладку Zsh и посмотреть, есть ли разумный вариант, который не перезаписывает существующий ярлык. - person Jonathan; 09.03.2015

РЕДАКТИРОВАТЬ: Альтернатива, которая не нарушает поиск Esc /:

accept-line() { [ -z "$BUFFER" ] && zle up-history; zle ".$WIDGET"; }
zle -N zle-line-init

Переопределите команду по умолчанию Enter, чтобы она вставляла последнюю команду, если буфер пуст. На основе этого ответа.


ОРИГИНАЛ:

У меня в .zshrc есть это:

last_if_empty() {
  [ -z "$BUFFER" ] && zle up-history
  zle accept-line
}
zle -N last_if_empty
bindkey -M viins '^M' last_if_empty

Он переназначает Enter на Run last command, если на экране ничего не было напечатано.

К сожалению, поиск Esc / прерывается (клавиша Enter не работает). Я использую Ctrl + R, поэтому меня это не беспокоит, но может помешать сделке.

person gib    schedule 02.10.2017