我最初的问题是我想要一种方法来区分我在vi模式下使用bash时是处于vi-command模式还是vi-insert模式。据我所知,从GNU readline 7.0开始,有一种方法可以在命令提示符中设置一个指标;但是,我想要的是更改光标的形状(即在插入模式下为垂直线,在命令模式下为实体块)。
注意: 我已经尝试将以下内容放在我的.inputrc中,这样做了,但是在命令模式下回到行尾时会引起一些问题,所以我总结了这不是一个好的选择。
set show-mode-in-prompt on
set vi-cmd-mode-string "\e[2 q"
set vi-ins-mode-string "\e[6 q"
我遇到了一篇由同样问题的人撰写的文章,并最终决定自己修补GNU readline库,链接如下:
http://blog.mkoskar.com/2010/10/gnu-readline-vi-mode-visualization.html http://blog.mkoskar.com/2010/11/gnu-readline-vi-mode-visualization-2.html
到目前为止,我已经能够成功应用补丁并编译/安装库(本地......我更愿意保留未修补版本以防万一我想切换回来),但bash似乎仍然是使用原文。
以下是重要细节:
1)已修补的库文件(静态和动态)位于我的计算机上 $ HOME / .local / lib / 。
2)我确定的原始库文件(仅动态)位于 / lib / x86_64-linux-gnu / 。
3)我的.bashrc中的LD_LIBRARY_PATH环境变量设置为$HOME/.local/lib:
。
即使安装了修补版本并且我的LD_LIBRARY_PATH变量设置正确,Bash似乎仍然没有使用我修补的GNU readline库。我想知道我做错了什么?
我希望问题不在于Bash带有已经静态链接的readline库,我想,我需要重新安装Bash(以及使用此库的任何其他程序,如iPython),手动链接readline的修补版本。
的解
虽然不是标题中列出的问题的解决方案,但这是我遇到的原始问题的解决方案。浏览了Readline的手册页后,我看到了vi-cmd-mode-string
和vi-ins-mode-string
的以下说明:
vi-cmd-mode-string ((cmd))
This string is displayed immediately before the last line of the primary prompt when vi editing mode is active and in command mode. The value is expanded like a key binding, so the
standard set of meta- and control prefixes and backslash escape sequences is available. Use the \1 and \2 escapes to begin and end sequences of non-printing characters, which can be
used to embed a terminal control sequence into the mode string.
vi-ins-mode-string ((ins))
This string is displayed immediately before the last line of the primary prompt when vi editing mode is active and in insertion mode. The value is expanded like a key binding, so the
standard set of meta- and control prefixes and backslash escape sequences is available. Use the \1 and \2 escapes to begin and end sequences of non-printing characters, which can be
used to embed a terminal control sequence into the mode string.
关于 \ 1 和 \ 2 逃脱的部分是重要的事情......
所以基本上,将以下内容放在我的.inputrc中允许我根据当前的vi模式设置光标形状:
set show-mode-in-prompt on
set vi-cmd-mode-string "\1\e[2 q\2"
set vi-ins-mode-string "\1\e[6 q\2"