1

我经常发现自己想要重复一个命令,虽然!!有用,但我想将它绑定到 ctrl-w 或类似的东西。有没有办法做到这一点?

编辑:我知道向上箭头可以满足我的要求,但是我宁愿不必离开主行。作为一个狂热的 Vim 用户,我教会了我留在 home 键上的价值。

我查看了这篇关于添加访问info命令的快捷方式的帖子,并试图从中推断出一些东西,但没有成功。Zsh 对我大吼大叫 zle 不活跃之类的。

我知道这将依赖于我的 shell 是如何配置的知识,所以下面我粘贴了一些相关的代码,以及指向我的整个 .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/yramgicman/dotfiles

只是.zshrc:https ://github.com/yramagicman/dotfiles/blob/master/.zshrc

自定义插件:

4

2 回答 2

5

要从历史记录中获取最后一个命令,您可以使用up-history小部件。这在vicmd模式下默认绑定到Ctrl+ ,因此按+然后(调用小部件)可以解决问题。PEscCtrlPEnteraccept-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模式下自插入,而+已经绑定到viins。当然,如果您不使用默认绑定或仅在模式下绑定小部件,您可以覆盖默认绑定。CtrlWvi-backward-kill-word

于 2015-03-09T09:04:55.160 回答
0

编辑:不破坏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所以它不会打扰我,但可能会破坏交易。

于 2017-10-02T12:55:50.800 回答