Bash:使用Vim模式而不是vi模式

5

我注意到在Bash的vi模式下(即使用“set -o vi”启用的模式),一些命令(如“diw”)在Vim中有效,但在vi中无效,在Bash命令行上也是如此。有没有一种简单的方法来配置Bash,使其键绑定支持Vim命令?

我希望能够在命令行上输入Vim命令,而不必实际启动Vim程序,就像this question中描述的那样。


6
bash不支持vivim命令,而是使用类似于vi键绑定的键绑定来控制其自己的命令集。 - chepner
我已经编辑了这个问题。 - plafratt
4个回答

5

我所知道的最好方法是使用Athame

在某些情况下,它可以是一个令人惊讶的强大体验。我特别喜欢它与REPL交互。

Athame通过将您的按键通过实际的Vim进程路由来为您的shell添加完整的Vim支持。 Athame目前可用于修补readline(由bash、gdb、python等使用)和/或zsh(不使用readline)。

Enter image description here

另外,我发现使用eshell的Spacemacs是一个相当实用但有些奇怪的解决方案。


2
如果这是问题所寻求的答案类型,那么该问题就是不适合讨论的(来自https://stackoverflow.com/help/on-topic,在“一些问题仍然是不适合讨论的”列表中,请注意“推荐或查找书籍、工具、软件库或其他离线资源”条目)。 - Charles Duffy
1
@CharlesDuffy 我认为这并不使它离题。他在寻找解决方案,而一个潜在的解决方案是这个工具。他并没有特别寻找工具。 - axwr
1
同意。问题被视为不在主题范围内的更具有说服力的原因是,它与编写代码、开发脚本或其他软件开发相关的内容无关(正如上面链接所指定的那样),而是关于“交互式”shell配置和使用——这是[unix.se]SE或SuperUser的主题。 - Charles Duffy

3
首先,通过set -o vi获取的“vi模式”并不是vi本身。它是内置在readline中的vi行为的不完整近似版本,而bash在底层使用此命令行编辑库。
其次,由于它是不完整的,因此没有任何理由期望每个vi命令都能工作。
第三,没有“vim模式”,因此更没有理由期望任何vim命令能够工作。
第四,如果您绝对想使用类似于Vim的命令编辑当前命令行,请干脆一点…直接使用Vim:
<C-x><C-e>

话虽如此,$ man readline 告诉你一切你需要自定义它的行为和添加绑定的内容。


6
如果您已经在 vi 模式下,那么 <C-x><C-e> 的等价操作是按下 ESC 键然后再按下 v 键。 - Mark Reed

3

通过将以下内容添加到您的~/.inputrc文件中,可以将vi命令模式diw应用于任何使用readline的软件(如Bash):

教授vi命令模式diw

set keymap vi-command
"diw": "bde"

请问您能给我解释一下吗?我在简短的搜索中没有找到相关的含义。谢谢。 - undefined
1
阅读https://tiswww.case.edu/php/chet/readline/rluserman.html#Readline-Init-File-Syntax中的“Key Bindings”部分。简而言之:该配置行告诉readline将键序列“diw”解释为您键入了“bde”(跳转到单词开头,删除到单词结尾)。 - undefined
非常感谢,卢克。祝你一切顺利,度过愉快的一天 :) - undefined

1
你可以使用 ble.sh。它是用纯 Bash 编写的命令行编辑器,可替代默认的 GNU Readline。我喜欢称之为“ BASH 的 zsh”。
除了 vim 风格的导航外,它还提供了:
- 增强的自动完成 - 语法高亮 - 其他有趣的功能 安装后,请不要忘记将 (推荐) 添加到您的 .bashrc
# at the start of your .bashrc file
[[ $- == *i* ]] && source /usr/share/blesh/ble.sh --noattach

...

#for vim-style mode
set -o vi

...

#at the end of your .bashrc file
[[ ${BLE_VERSION-} ]] && ble-attach

或者你可以这样做:

# at the start of your .bashrc file
source /usr/share/blesh/ble.sh

但这可能不会按预期工作 - 阅读此内容


谢谢,这就是我设定的,但我不知道如何去掉“--INSERT--”。有人知道怎么做吗? - undefined
1
哦,没关系,我发现解决办法是创建一个.blerc文件,并从这里中添加一些内容。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接