我只是在阅读 readline 手册页,发现了一堆我不知道的很棒的命令。但是,有几个没有默认的键绑定。有没有办法从 shell 执行未绑定的命令?
我不是在问如何在 ~/.inputrc 中绑定命令,而是如何从 shell 或 bash 脚本中“一次性”执行它。
例如,“转储变量”命令。是否有一些命令我可以提供“转储变量”作为参数来执行它?
我是新来的UNIX系统,并且发现很有意思的设定文件来创建自定义的功能和配置像.bashrc
和.inputrc
。
但是,我不明白两者之间的区别。例如,当我创建别名时,我将它们放在.bashrc
.
Example 1: alias ...='cd ../../'
Run Code Online (Sandbox Code Playgroud)
当我创建诸如使用箭头键查找上一个或下一个命令之类的操作时,我将命令放在.inputrc
.
Example 2: "\e[A": history-search-backward
Run Code Online (Sandbox Code Playgroud)
为什么我需要将它们放在不同的设置文件中?我如何区分什么时候放什么地方?
先感谢您!
我希望能够使用 Emacs 默认使用的相同键盘绑定(即使用C-space
for set-mark
、M-w
复制文本、C-y
、M-y
粘贴它等)在 Bash 的命令行中复制和粘贴文本。
在GNU Bash的文件说,猛砸附带了一些默认设置了这些键绑定。
例如,yanking ( C-y
) 默认在我的终端上工作。但是,我无法使set-mark
和copy
命令起作用,并且默认情况下它们似乎没有绑定到任何键。
通常,用户定义自己的键绑定的方式是将它们添加到.inputrc
. 所以我在文档中查看并发现了以下 bash 函数,我认为这些函数可以帮助我定义我想要的类似 Emacs 的行为(即set-mark
withC-space
和copy
with M-w
)。
copy-region-as-kill ()
Run Code Online (Sandbox Code Playgroud)
将区域中的文本复制到终止缓冲区,以便立即将其拉出。默认情况下,此命令是未绑定的。
和
set-mark (C-@)
Run Code Online (Sandbox Code Playgroud)
将标记设置为点。如果提供了数字参数,则标记设置为该位置。
如果我理解正确的话,上面的意思copy-region-as-kill
是默认情况下不绑定到任何键盘序列,而默认情况下set-mark
绑定到C-@
。
我C-@
在我的终端上试过,但我认为它没有运行,set-mark
因为当我移动光标时我没有看到任何突出显示的文本。无论如何,我尝试将键盘绑定(M-w
和C-
)添加到my 中的函数 copy-region-as-kill
及set-mark
以上.inputrc
,然后使用 重新加载它C-x C-r
,但这不起作用。我知道我的其他条目正在.inputrc
工作,因为我在其中定义了其他用户定义的键绑定。 …
我的只~/.bashrc
包含一行:
source my_config/my_actual_bashrc.sh
Run Code Online (Sandbox Code Playgroud)
是否有等价的.inputrc
,所以我的自定义可以在一个单独的位置,并“调用” ~/.inputrc
?
看来clear
和 bash Ctrl-L是有很大不同的;clear
完全删除以前的所有终端信息(因此您无法向上滚动) while Ctrl-L只是滚动屏幕,使光标位于页面顶部,以便您仍然可以向上滚动并查看以前的信息。我更喜欢Ctrl-L系统。有没有办法覆盖,clear
以便它执行Ctrl-L而不是擦除所有以前的终端信息?这不是一个大问题,但我只是出于好奇而想知道是否有一种方法可以使用别名clear
来指向我喜欢的Ctrl功能L。
顺便说一句,我刚刚注意到 PowerShell 也有一个绑定Ctrl-并且它的执行方式与-在 bash 上L相同;看起来 PowerShell 设计者从 bash 中借鉴了很多,而控制台没有这个功能。CtrlLcmd.exe
使用^W
(unix-word-rubout) 我可以轻松地从 bash shell 的当前命令中删除单个“单词”。
但是,当处理包含空格的引用参数(或包含反斜杠转义空格的未引用参数)时,这不会很好地工作,因为它只删除一个单词而不是整个参数。
所以我正在寻找一种删除整个论点的方法。
示例(光标总是在最后):
$ foo --bar "foo bar" meow
[black magic]
$ foo --bar "foo bar"
[black magic]
$ foo --bar
[black magic]
$ foo
Run Code Online (Sandbox Code Playgroud) 我注意到.bashrc
和.inputrc
文件中的一些设置看起来相同或相似,例如:
shopt -s nocaseglob
对比set completion-ignore-case
export HISTSIZE
对比set history-size
export HISTFILESIZE
对比set history-size
.inputrc
设置是否也会影响 python shell 中的完成和历史大小(如果在终端内运行)?
是HISTSIZE
通过限制history-size
或它覆盖它?
我无法让 tmux 识别Ctrl-Left-arrow序列与左箭头不同,右箭头也相同。在我的 中~/.inputrc
,我已经映射了这些序列(由 2 个不同的终端模拟器发出,即 putty 和 mobaxterm)以跳过命令行中的单词:
"\eOD": backward-word
"\e[1;5D": backward-word
Run Code Online (Sandbox Code Playgroud)
这在 ssh 会话中工作得很好,但是 screen 和 tmux 都不区分箭头和控制箭头。自然,推荐的解决方案是通过将全局选项添加到 tmux 中启用选项 xterm-keys ~/.tmux.conf
,并且有直接证据(除了对上述解决方案的“感谢”评论)这对其他人有效。但对我来说,Ctrl-Left-arrow发送相同的代码,ESC D
,Left-arrow。
我已经确认该选项确实是通过检查 tmux 选项设置的
:show-window-options -g
Run Code Online (Sandbox Code Playgroud)
甚至手动设置它以防万一当前窗口
:set-window-option xterm-keys on
Run Code Online (Sandbox Code Playgroud)
但这一切都无济于事。tmux 报告版本号为 1.8,带有tmux -V
.
我还可以检查什么来解决此问题?
当我在 bash 命令行中按下某些键(例如德语变音符号)时,我会得到转义序列。例如,ß给我\303
. 这些转义序列被视为单个字符,因此一个退格键会删除整个序列。该字符只是在命令行上显示错误,但它被正确解释,例如键入echo
ß给出:
$ echo \303
ß
Run Code Online (Sandbox Code Playgroud)
我猜它有非 7 位 ASCII 字符的问题。然而,在其他所有地方,这些都可以正常工作。我可以在 vim 中使用它们或用 cat 显示它们,而且 unicode 字符也可以正常工作。
如何让 bash 正确显示这些字符?
作为记录,
TERM=xterm-256color
LANG=en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)
从我的.inputrc:
set input-meta on # Enable Meta input with eighth bit set
set meta-flag on # Synonym for the above
set convert-meta off # Do NOT strip the eighth bit
set output-meta on # Enable Meta output with eighth bit set
Run Code Online (Sandbox Code Playgroud)
输出 stty -a
speed 38400 baud; rows …
Run Code Online (Sandbox Code Playgroud) 使用bash的vi模式(set -o vi)时,是否可以恢复上次执行命令的最后一个参数?这是在 emacs 模式下用ESC+ 完成的.,我也想在 vi 模式下完成。
我知道 bash 提供了!$
and $_
,但它们没有扩展,我发现直接使用它们很危险。
我已经尝试过(但没有成功)我在 Stack Overflow 上找到的一些关于编辑.inputrc
和添加的解决方案:
set editing-mode vi
set keymap vi-insert
"\e.": yank-last-arg
"\e_": yank-last-arg
Run Code Online (Sandbox Code Playgroud)
我正在 bash 中切换到 vi 模式,但我已经习惯了ESC+.并且能够使用它或找到快速简便的替代品会很好。
编辑:此问题已被标记为类似问题的重复,该问题询问如何使用 Alt+S 恢复最后一个参数。我专门询问有关 ESC+ 的问题。(这是我习惯的快捷方式,其他答案未涵盖)。
编辑:补充@chaos 的解决方案:以下绑定使 ESC+。(好吧,真的是 '.')粘贴最后一个参数,但是你失去了 Vi 的点 (.) 功能:
bind -m vi-command ".":insert-last-argument
Run Code Online (Sandbox Code Playgroud) inputrc ×10
bash ×8
bashrc ×3
readline ×3
line-editor ×1
shell ×1
shell-script ×1
terminal ×1
tmux ×1