当我按下Ctrl-V Ctrl-J外壳(在 下urxvt
)时,它会开始一个新行(将光标定位在新行的开头),而不是打印^J
.
在vim
它打印^@
。
同样的情况也出现在虚拟控制台中。
显然有些东西预处理Ctrl-J。它是什么,我如何影响它?
$ stty -a
speed 38400 baud; rows 26; columns 101; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc
$ echo $TERM
rxvt-unicode-256color
$ urxvt --help |& head -1
rxvt-unicode (urxvt) v9.26 - released: 2021-05-14
UPD我正在配置tmux
,这种行为让我认为这bind-key C-j send-keys C-j
不起作用。
Bash 中的 Cv 由 readline 处理:
如 readline(3) 中所述:
您可以使用 Cv 插入其他字符,例如 Cv Ci 将插入制表符。要知道哪个字母产生给定的字符 open
man ascii
:如您所见,J 与新行位于同一行,而 I 与水平制表符位于同一行。
您可以使用其他示例来检查自己,例如 Cv Cg 会产生 bell:
正如 Arkadiusz Drabczyk 所说,
readline
负责处理C-v
. 特别是C-v C-j
。它只是以不同的方式处理它们。据说是因为( ) 可以在没有符号的情况下以有意义的方式表示。如果您好奇的话,该符号中的字母是通过对字符代码进行或运算获得的。或者您可能会说,对应于,to ,等等。C-j
Enter
^*
0x40
0x01
^A
0x02
^B
至于
vim
那个 (^@
) 也是它表示换行符的方式。文档中提到了几点:https://github.com/vim/vim/blob/v8.2.4027/runtime/doc/cmdline.txt#L652-L653
https://github.com/vim/vim/blob/v8.2.4027/runtime/doc/pattern.txt#L1273-L1280
可能它与将空字节作为换行符存储在内存中有关。