如何在xonsh中禁用并重新启用括号粘贴模式
xonsh 括号粘贴(bracketed paste)模式开关方法
xonsh 没有内置与 fish 中__fish_disable_bracketed_paste、__fish_enable_bracketed_paste完全同名的函数,但可以通过标准终端控制序列实现完全等效的开关操作,解决快捷键启动交互式工具时的粘贴异常问题。
手动临时开关
括号粘贴模式是终端提供的标准特性,通过发送固定转义序列即可控制状态,在xonsh中直接执行对应命令即可:
- 禁用括号粘贴模式:执行
效果与fish下执行print("\x1b[?2004l", end="")__fish_disable_bracketed_paste完全一致。 - 重新启用括号粘贴模式:执行
效果与fish下执行print("\x1b[?2004h", end="")__fish_enable_bracketed_paste完全一致。
自定义快捷命令
如果需要和fish一样通过短命令快速调用,可以把以下配置写入~/.xonshrc配置文件:
def disable_bracketed_paste(): print("\x1b[?2004l", end="", flush=True) def enable_bracketed_paste(): print("\x1b[?2004h", end="", flush=True) # 自定义别名,可根据自己的习惯修改命令名 aliases["bp_off"] = disable_bracketed_paste aliases["bp_on"] = enable_bracketed_paste
保存后重载xonsh配置,后续直接输入bp_off即可关闭括号粘贴,输入bp_on即可重新开启。
自动适配TUI工具场景
如果需要在启动vim、fzf、htop这类交互式终端工具时自动临时关闭括号粘贴、退出工具后自动恢复,可以给xonsh添加命令执行钩子,同样写入~/.xonshrc即可:
# 先定义开关函数 def disable_bracketed_paste(): print("\x1b[?2004l", end="", flush=True) def enable_bracketed_paste(): print("\x1b[?2004h", end="", flush=True) # 命令执行前触发:如果是TUI类程序就关闭括号粘贴 @events.on_command_pre def auto_disable_bp(cmd): # 可根据自己的使用习惯增删需要适配的程序名 tui_list = {"vim", "nvim", "fzf", "htop", "less", "man"} if cmd.cmd[0] in tui_list: disable_bracketed_paste() # 命令执行后触发:TUI程序退出后恢复括号粘贴 @events.on_command_post def auto_enable_bp(cmd): tui_list = {"vim", "nvim", "fzf", "htop", "less", "man"} if cmd.cmd[0] in tui_list: enable_bracketed_paste()
注意:如果你的终端本身配置了强制开启括号粘贴的规则,上述命令执行后可能被终端配置覆盖,需要先检查终端自身的相关设置。
内容的提问来源于stack exchange,提问作者Kossak
相关产品推荐
相关产品推荐

