如何扩展bash的vi模式

时间:2014-03-22 04:49:40

标签: bash shell unix vi

我想在bash中自定义vi模式。我想做的两件事非常糟糕。

  1. 将Esc映射到CAPS_LOCK,将CAPS_LOCK映射到SHIFT + CAPS_LOCK
  2. 使用'm'将当前目录标记为字符'a-z'并使用'cd到该目录。
  3. 一般来说,有没有办法在bash中扩展vi模式?

2 个答案:

答案 0 :(得分:2)

Bash使用GNU readline提供可用的命令行提示符。 Readline支持vi模式,为其提供一组基本密钥和模态接口。

大写锁定和其他人的映射不是bash或readline的工作。如果您愿意将这些绑定设为全局,则可以使用Xmodmap来获得满意的结果。

至于第二个问题:遗憾的是,readline的可配置性非常有限。但是你可以通过编写通过循环初始化的函数来实现类似的功能。 以下类型的作品:

Set_Ma () {
    DIR_a=`pwd`
}
Go_Ma (){
    cd "$DIR_a"
}
set -o vi
bind -m vi-command -x '"ma":"Set_Ma"'
bind -m vi-command -x '"'"'"'a":"Go_Ma"'

在输入'a后,您不会立即看到任何效果,因为它不会重新绘制提示以匹配新的CWD。您也可以使用关联数组来存储标记,但我不会去那里。

我建议跳进ZSH的行列。 Zsh没有使用readline。相反,他们编写了一个更灵活的行编辑库,可以通过普通的zsh函数正确编写脚本。

答案 1 :(得分:-2)

您可以使用ex命令在set中更改选项:set。此外,每当启动vi时,它会读取主目录中名为.exrc的文件以获取进一步的操作说明。通过在此文件中放置:set命令,您可以修改vi在使用时的行为方式。

您还可以在本地目录中设置.exrc文件,以初始化要在不同环境中使用的各种选项。例如,您可以定义一组用于编辑英文文本的选项,另一组用于编辑源程序。首先执行主目录中的.exrc文件,然后执行当前目录中的.exrc文件。

最后,存储在shell变量EXINIT中的任何命令都将在启动时由vi执行。如果.exrc和EXINIT中的设置之间存在冲突,则.exrc中的设置优先。

希望这可以帮到你

由于