我知道如何将 ZSH 的默认行编辑器设置为使用类似 vi 的键绑定...
bindkeys -v
Run Code Online (Sandbox Code Playgroud)
...甚至默认每个新提示都处于命令模式而不是默认插入 mod ...
zle-line-init() { zle -K vicmd; }
zle -N zle-line-init
Run Code Online (Sandbox Code Playgroud)
...大多数时候我更喜欢这种行为。然而,这让一些事情变得非常尴尬。例如,将多行命令粘贴到终端中以立即执行几乎是不可能的。
我如何配置它以便模式是持久的?我希望我执行一行时的任何模式都应该是下一行的默认模式。
在默认 (emacs) 模式下使用 bash 当我点击Esc,? ..
$ echo hello
hello
$ hello # I hit `<ESC>.` to insert this
Run Code Online (Sandbox Code Playgroud)
请注意hello,当我点击时插入的单词前没有空格Esc,?..
如果我切换到 vi 模式并进行配置,.我会得到一个前导空格:
$ set -o vi
$ bind -m vi-command ".":yank-last-arg
$ echo hello
hello
$ hello # I hit `<ESC>.` to insert this. Note the leading space.
Run Code Online (Sandbox Code Playgroud)
有没有办法配置 bash/readline 来避免这个前导空间?
看来,如果我在里面运行以下内容vim:
:w !wc -w
我得到了文件的字数。但我不明白语法。这是如何工作的,我将如何指定我想要一个段落的字数而不是整个文件的字数?
ksh当 shell 处于 Vi 命令行编辑模式时,我试图让 Bash 模仿 KornShell93 ( )的行为。
KornShell 默认为“Vi 正常模式”(又名“命令”模式),并且在回退命令行历史记录时,它还会将光标置于命令行的最开头。这与 Bash 形成对比,后者将您置于“Vi 插入模式”并位于命令行的末尾。
在“ Bash vi 模式配置默认为命令模式”的答案中,几乎可以得出结论,当启用 Vi 命令行编辑时,无法让 Bash 默认为“Vi 普通模式”。
这已经是五年多前的事了,我想知道从那时起是否发生了变化?
那么自动将光标放在命令行的开头呢?是否有一些我不知道的 Readline 魔法可以帮助我解决这个问题?
我shells/bash在 OpenBSD-current(2017 年 1 月)上使用从源代码(OpenBSD端口)编译的 Bash 版本 4.4.5(1)-release 。
tldr: 有谁知道如何配置 vi 模式 bash 使用哪个缓冲区进行拉取(复制)和粘贴?
长版本:
我set editing-mode vi在我的.inputrc, 中使用该readline库的程序(即 bash)使用类似 vi 的键绑定。与此无关,我已经设置了 vim 和 tmux 以使用系统剪贴板进行拉取和粘贴。我想对 bash 做同样的事情。这似乎没有必要,因为我主要通过 tmux 使用 bash,但即便如此,能够使用p(在正常模式下)从剪贴板复制而不是C-a P或类似的东西(带有 tmux 前缀)也会很好。但是,我找不到任何有关如何配置 bash 这方面的信息,甚至找不到 bash 默认使用什么缓冲区进行拉取和粘贴的信息。当我在vim中执行时我没有看到它:registers,所以它似乎不是vim看到的任何寄存器。
可能的重复:
更改光标形状(或颜色)以指示 bash 中的 vi 模式
我在 bash shell 中使用 vi-mode,每当我处于插入模式时,我都想更改 PS1 变量。当我运行时bind -v | awk '/keymap/ {print $3}',结果是vi-insert插入模式和vi正常模式。
我想要一些我处于哪种模式的视觉指示器,例如黄色提示或点,如下所示:

我希望这种视觉变化在模式改变后立即发生,即使没有运行任何命令。是否可以更改当前进程的 PS1 值并更新提示而不按 Enter 键?
是否可以配置 Z shell 的 vi 模式,以便退格键可以删除插入操作开始位置之前的字符?
基本上可以通过添加以下行来实现 vim 的行为 ~/.vimrc
set backspace=start
Run Code Online (Sandbox Code Playgroud)
– 是否可以在 Z shell vi 模式下使用它?
我是使用 Tmux 的新手。我发现在 Tmux 中复制粘贴非常困难。所以我寻找一种更简单的方法。有些网站建议我应该使用 vim 模式,因为我对 vim 非常熟悉。但是,vim 模式复制粘贴不起作用。我不知道我做错了什么。这是我的 ~/.tmux.conf 文件。
# Improve colors
set -g default-terminal 'screen-256color'
# Set scrollback buffer to 10000
set -g history-limit 10000
# Customize the status line
set -g status-fg green
set -g status-bg black
set -g mouse on
bind P paste-buffer
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi r send-keys -X rectangle-toggle
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'
# remap prefix to Control + …Run Code Online (Sandbox Code Playgroud) 我只是把我zsh给vi模式,因为我觉得这个词/ WORD(w/ b W/ B)跳过键绑定会帮我比平原快的工作^a ^e在Emacs结合模式。但是,我想set backspace=2或set backspace=eol, start; 我有这个,我.nvimrc现在已经习惯了。
有什么办法可以设置这个变量zsh吗?
我有一个包含制表符分隔格式记录的文件,但在两行中,我想使用 vim 编辑器模式匹配将记录与制表符分隔值排列在一行中。
前任。
Abc PQR XYZ NMW
XYX PQR LMW
PLX PXQ LPN PWF
XYQ PLP PMQ LWP
Run Code Online (Sandbox Code Playgroud)
我想将记录的每第二行添加到第一行记录。我想要的输出格式是这样的。
Abc PQR XYZ NMW XYX PQR LMW
PLX PXQ LPN PWF XYQ PLP PMQ LWP
Run Code Online (Sandbox Code Playgroud)
我尝试了以下命令来解决我的问题。
:%s/\n(\w\+.*)/\t\1/cgi
Run Code Online (Sandbox Code Playgroud)
这是用除第一行之外的前面的制表符替换每行数据。
我们如何使用 vim 模式匹配和替换来解决这个问题?
是否有类似于 Vim 的 Bash 的“命令行窗口”,我可以在其中查看/编辑/执行历史记录中的项目?
在 Vim 中,当我按下:然后Ctrl-F它会打开显示整个命令历史记录的窗口:
7. Command-line window *cmdline-window* *cmdwin*
*command-line-window*
In the command-line window the command line can be edited just like editing
text in any window. It is a special kind of window, because you cannot leave
it in a normal way.
OPEN *c_CTRL-F* *q:* *q/* *q?*
[..]
When the window opens it is filled with the command-line history. The last
line contains the command as typed so far. The left …Run Code Online (Sandbox Code Playgroud)