当前位置: 首页 > news >正文

2502vim,vim文本对象中文文档

介绍

文本块用户(textobj-user)是一个可帮助你毫不费力创建自己的文本对象Vim插件.

因为有许多陷阱需要处理,很难创建文本对象.此插件隐藏了此类细节,并提供了声明式定义文本对象的方法.

你可用正则式定义简单的文本对象,或使用函数来定义复杂的文本对象.如…

文本对象用户简单示例

(a)定义"ad"/"id"以选择如"2013-03-16"日期,及定义"at"/"it"以选择如"22:04:21"的时间:

call textobj#user#plugin("datetime", {
\   "date": {
\     "pattern": "\<\d\d\d\d-\d\d-\d\d\>",
\     "select": ["ad", "id"],
\   },
\   "time": {
\     "pattern": "\<\d\d:\d\d:\d\d\>",
\     "select": ["at", "it"],
\   },
\ })

文本对象用户示例之间

(b)定义"aA"以选择从"<<"匹配">>"文本,及定义"iA"以选择"<<"和">>"中的文本:

call textobj#user#plugin("braces", {
\   "angle": {
\     "pattern": ["<<", ">>"],
\     "select-a": "aA",
\     "select-i": "iA",
\   },
\ })

文本对象用户示例之间

(c)定义"al"选择当前行,并且定义"il"以选择不带缩进的当前行:

call textobj#user#plugin("line", {
\   "-": {
\     "select-a-function": "CurrentLineA",
\     "select-a": "al",
\     "select-i-function": "CurrentLineI",
\     "select-i": "il",
\   },
\ })function! CurrentLineA()normal! 0let head_pos = getpos(".")normal! $let tail_pos = getpos(".")return ["v", head_pos, tail_pos]
endfunction
function! CurrentLineI()normal! ^let head_pos = getpos(".")normal! g_let tail_pos = getpos(".")let non_blank_char_exists_p = getline(".")[head_pos[2] - 1] !~# "\s"return\ non_blank_char_exists_p\ ? ["v", head_pos, tail_pos]\ : 0
endfunction

文本对象用户示例文件类型

(d)定义"a("来选择从"\left("到匹配的"\right)"中的文本,定义"i("选择从"\left("匹配"\right)"中的文本,但仅针对tex文件:

call textobj#user#plugin("tex", {
\   "parenmath": {
\     "pattern": ["\\left(", "\\right)"],
\     "select-a": [],
\     "select-i": [],
\   },
\ })
augroup tex_textobjsautocmd!autocmd FileType tex call textobj#user#map("tex", {\   "parenmath": {\     "select-a": "<buffer> a(",\     "select-i": "<buffer> i(",\   },\ })
augroup END

可如上例所示,定义自己的文本对象.

更多

一点哲学

为什么要定义它们?你必须相信它们是有用的,它们可提高你的生产力.
此类文本对象其他用户也很有用.但为何不按插件共享呢?
是,这就是textobjuser只提供一个textobj#user#plugin()函数的原因.它不仅为自定义文本对象(如aX/iX),定义了键映射,还按插件定义了要共享期望的一切.

如,对自定义文本对象,用户可能更喜欢aY/iY而不是aX/iX.因此,有必要此自定义提供一个方法,但手动定义它们有点乏味.

文本对象用户参考

textobj#user#plugin()

textobj#user#plugin({插件名}, {规范})

根据{规范}自定义文本对象,而定义也轻松按名叫{插件名}的插件共享了自定义文本对象.{插件名}是一个由英文字母组成的串.
此名用作各种键映射,Ex命令和变量.

{规范}自定义文本对象定义的字典.如:

call textobj#user#plugin("datetime", {
\   "date": {
\     "pattern": "\<\d\d\d\d-\d\d-\d\d\>",
\     "select": ["ad", "id"],
\   },
\   "time": {
\     "pattern": "\<\d\d:\d\d:\d\d\>",
\     "select": ["at", "it"],
\   },
\ })

许多东西都是用上面的定义定义的:

Textobj{Plugin}DefaultKeyMappings

(a)定义了一个Ex命令:TextobjDatetimeDefaultKeyMappings.
Ex命令对自定义文本对象定义了默认键映射.

但是它除非给出"!",它不会覆盖现有键映射.

此例中,Ex命令给自定义文本对象,按符号待定模式和可视模式下映射"ad","id","at""it".
如果{左边}以(如<C-d>)不可打印的符开头,则也会在选择模式下映射{左边}.

(textobj-{plugin}-{object}-{operation})

(b)在符号待定(符号挂起)模式,可视(可视)模式和选择(选择)模式下,定义如<Plug>(textobj-datetime-date)接口键映射.

这些是为用户额外自定义而定义的.如,人们可能更喜欢"aT""iT"选择时间,因为默认,atit已用作非常有用选择标签块文本对象,一般覆盖它们不好.

此时,接口键映射的用法如下:

xmap aT  <Plug>(textobj-datetime-time)
omap aT  <Plug>(textobj-datetime-time)
xmap iT  <Plug>(textobj-datetime-time)
omap iT  <Plug>(textobj-datetime-time)

g:textobj_{plugin}_no_default_key_mappings

(c)最后,默认执行:TextobjDatetimeDefaultKeyMappings来定义默认键映射:"ad","id","at""it".如(b)中所述,有时用户不希望使用如"at""it"默认键映射.

如果按设置g:textobj_datetime_no_default_key_mappings,则不会定义默认键映射.为了后向兼容,如果{规范}包含键"*no-default-key-mappings*",则也不会定义默认键映射.

但此功能在未来的版本中会删除.

textobjuser规范

textobj#user#plugin()自定义文本对象{规范}.{规范}是一个字典,按一系列文本对象名,文本对象的规范的键值对对待它.

各种属性组成文本对象规范.按单个字典表示属性.每个键都是一个属性名.
以下属性可用:

"move-n" {左边}[{左边}, ...]"

该值必须为串或串列表.按默认键映射{左边}对待每个串,以移动光标下个文本对象.
目标文本对象由带单个正则式"模式"属性或"move-n函数"属性确定.

"move-p" {左边}[{左边}, ...]
"move-N" {左边}[{左边}, ...]
"move-P" {左边}[{左边}, ...]

"move-n"类似,但{左边}用作移动光标上个文本对象,下个文本对象结尾,或上个文本对象结尾默认键映射.

"select" {左边}[{左边}, ...]"

"move-n"类似,但{左边}用作选择光标下的文本对象默认键映射.由有单个正则式"模式"属性或"选择函数"属性确定目标文本对象.

"select-a" {左边}[{左边}, ...]
"select-i" {左边}[{左边}, ...]

"选择"类似,但为了选择"a"文本对象或"内部"文本对象,按默认键映射使用{左边},如ab,ip其他内置文本对象.

由带一对正则式"模式"属性,"select-a-函数"属性或"select-i-函数"属性确定目标文本对象.

“模式” {regexp}或[{regexp},{regexp}]

确定目标文本对象单个正则式两个正则式列表.
使用单个正则式:
目标文本对象对待正则式匹配的区域.
使用一对正则式:
目标文本对象对待两个部分间的区域,其中第1部分第1个正则式匹配,第2部分第2个正则式匹配.

文本对象用户区域类型

"regiontype" {符}(默认值:"v")
一个"模式"属性定义的用来指定区域类型的串.可能值如下:

值              意思
-------------------------------
"v"             按符
"V"             按行
"\<C-v>"        按块

文本对象用户扫描

"扫描" {串}(默认值:"前向")
一个用来指定如何为"选择"查找基于"模式"文本对象的串.可能的值为:
"光标":试从光标下的文本查找.
"前向":试从文本中查找:
(1)光标下
(2)光标后

"行":试从文本中查找:
(1)光标下方
(2)在当前行中和光标后
(3)在当前行中和光标前

"最近":试从文本中查找:
(1)光标下方
(2)在当前行中和光标后
(3)在当前行中和光标前
(4)当前行后
(5)当前行前

"{property}-函数" {fname}

如果定义了此属性,则使用名为{fname}函数,而不是"模式"属性,来确定"{属性}"操作的目标文本对象.
函数,必须无参,且必须返回一个表示目标文本对象占据区域列表,或必须返回0以表示没有文本对象.
表示区域列表格式如下:
[region_type,start_position,end_position].

"region_type"是用来指定区域类型的单符串.
"start_position"表示区域开始位置.
此值的细节与getpos()相同.
"end_position"类似"start_position",但它表示一个区域的结束位置.

“sfile” {串}

必须是expand("<sfile>").此值用来计算针对"{属性}函数"脚本本地函数<SNR>前缀.

过时属性

仍可用,但会从未来的版本中删除.强烈建议改用新属性.

旧属性名新属性名
"*模式*""模式"
"*{property}-function*""{property}-函数"
"*sfile*""sfile"
"*no-default-key-mappings*"不可用

注意,"*no-default-key-mappings*"仍可用,但不再支持.
请改用g:textobj_{plugin}_no_default_key_mappings.

textobj#user#map()

textobj#user#map({插件名}, {规范})

定义键映射以使用自定义文本对象.大多数文本对象插件都提供默认键映射使用自定义文本对象.但有时想改用其他键映射.
可在没有textobj#user#map()如下定义此键映射,如:

xmap aT  <Plug>(textobj-datetime-time)
omap aT  <Plug>(textobj-datetime-time)
xmap iT  <Plug>(textobj-datetime-time)
omap iT  <Plug>(textobj-datetime-time)

但这很无聊.你可用textobj#user#map()声明性的方式定义这些键映射.如:

call textobj#user#map("datetime", {
\   "time": {
\     "select": ["aT", "iT"],
\   }
\ })

{插件名}文本对象插件名.

{规范}是一个包含自定义文本对象的定义字典.与textobj#user#plugin()不同,只允许使用以下属性:

move-n      move-p      move-N      move-P
select      select-a    select-i

为了方便自定义,在调用textobj#user#map()时,可能未定义,{插件名}指定的文本对象插件.因为:
1,主要在vimrc中用textobj#user#map().文本对象插件一般在plugin/*.vim中.而vimrc在所有plugin/*.vim前加载.

2,有时在文件类型插件中使用textobj#user#map().特定文件类型文本对象插件ftplugin/*.vim中.一般,不可预测这些文件类型插件的加载顺序.

因此,textobj#user#map()无法检测{插件名}是否正确.这样实际是,当使用了textobj#user#map()定义的键映射,且此时没有相应的文本对象,则报错.

textobj#user#move()

textobj#user#move({模式}, {flags}, {上个模式})

移动光标{模式}定义的相应对象.
{标志}是一个可包含以下符标志的串:

含义
"b"后向搜索而不是向前搜索.
"e"移动匹配尾.

{上个模式},是一个表示"上个"模式的串,即哪种映射模式导致调用此函数.如,如果此函数是通过符号待定模式的映射调用的,则{上个模式}必须为"o".

含义
"n"普通模式
"o"符号待定模式
"v"可视模式

返回值searchpos()相同.

textobj#user#select()

textobj#user#select({模式}, {flags}, {prevous-mode})

选择由{模式}定义的适当对象.扫描以下位置查找合适的对象:
(1)光标下方
(2)在当前行里和光标后
(3)在当前行里和光标前
(4)当前行后
(5)当前行前

{标志}是一个可包含以下符标志的串:

含义
"b"(1),(3),(5)查找对象.
"c"(1)查找对象.
"f"(1),(2),(4)查找对象.(默认)
"l"(1),(2),(3)查找对象.
"n"(1),(2),(3),(4),(5)查找对象.
"v"按符选择对象.(默认)
"V"选择对象.
"\<C-v>"按块选择一个对象.
"N"查找范围但不选择.

{上个模式}的细节,见textobj#user#move().此函数返回对象开始位置和结束位置列表.每个位置都是[{lnum},{col}].如果没有合适的对象,则返回0.

textobj#user#select_pair()

textobj#user#select_pair({1模式}, {2模式}, {flags}, {上个模式})

选择以{1模式}开头,并以{2模式}结尾的相应对象.{标志}是一个可包含以下符标志的串:

含义
"a"选择包括{1模式}{2模式}的范围,如at.
"i"选择不包括{1模式}{2模式}的范围,与it一样.除非显式指定"a",否则这是默认.如果光标不在{1模式}{2模式}间的文本中,则此函数闲着.
"v"按符选择对象.(默认)
"V"选择对象.
"\<C-v>"按块选择一个对象.

有关{上个模式}的细节,见textobj#user#move().
未定义返回值.

问题

因为计数的含义根据每个自定义文本对象而变,vim-textobj-user不支持计数.如果要支持自定义文本对象计数,请使用"{属性}-函数"定义它,并使用v:count和/或v:count1实际计数.

内置文本对象(如aw,ip等),通过重复文本对象(如"vawawaw...")来扩展视觉选择的区域.vimtextobjuser不支持该扩展.
因为支持所有自定义文本对象很难.虽然某些文本对象(如aw)只是扩展当前选择,但其他文本对象(如ab)可能会根据环境覆盖当前选择.

相关文章:

2502vim,vim文本对象中文文档

介绍 文本块用户(textobj-user)是一个可帮助你毫不费力地创建自己的文本对象的Vim插件. 因为有许多陷阱需要处理,很难创建文本对象.此插件隐藏了此类细节,并提供了声明式定义文本对象的方法. 你可用正则式来定义简单的文本对象,或使用函数来定义复杂的文本对象.如… 文本对…...

spring security与gateway结合进行网关鉴权和授权

在Spring Cloud Gateway中集成Spring Security 6以实现鉴权和认证工作&#xff0c;可以在网关代理层完成权限校验和认证。这种架构通常被称为“边缘安全”或“API网关安全”&#xff0c;它允许你在请求到达后端服务之前进行集中式的安全控制。 以下是如何配置Spring Cloud Gat…...

LabVIEW在电机自动化生产线中的实时数据采集与生产过程监控

在电机自动化生产线中&#xff0c;实时数据采集与生产过程监控是确保生产效率和产品质量的重要环节。LabVIEW作为一种强大的图形化编程平台&#xff0c;可以有效实现数据采集、实时监控和自动化控制。详细探讨如何利用LabVIEW实现这一目标&#xff0c;包括硬件选择、软件架构设…...

log4j2日志配置文件

log4j2配置文件每个项目都会用到,记录一个比较好用的配置文件,方便以后使用时调取,日志输出级别为debug,也可以修改 <?xml version"1.0" encoding"UTF-8"?> <Configuration monitorInterval"180" packages""><prope…...

用Deepseek做EXCLE文件对比

背景是我想对比两个PO系统里的一个消息映射&#xff0c;EDI接口的mapping有多复杂懂的都懂&#xff0c;它还不支持跨系统版本对比&#xff0c;所以我费半天劲装NWDS&#xff0c;导出MM到excle&#xff0c;然后问题来了&#xff0c;我需要对比两个excel文件里的内容&#xff0c;…...

Tailwind CSS v4.0 升级与 Astro 5.2 项目迁移记录

本文博客链接 https://ysx.cosine.ren/tailwind-update-v4-migrate 自用小记。 Tailwind CSS v4.0 - Tailwind CSS 新的高性能引擎 - 完整构建的速度速度快 5 倍&#xff0c;增量构建的速度快于 100 倍以上 —— 以微秒为单位进行测量。为现代 Web 设计 - 建立在前沿的 CSS 特…...

TongSearch3.0.4.0安装和使用指引(by lqw)

文章目录 安装准备手册说明支持的数据类型安装控制台安装单节点(如需集群请跳过这一节)解压和启动开启X-Pack Security和生成p12证书&#xff08;之后配置内置密码和ssl要用到&#xff09;配置内置用户密码配置ssl&#xff08;先配置内置用户密码再配ssl&#xff09;配置控制台…...

低代码产品表单渲染架构

在React和Vue没有流行起来的时候&#xff0c;低代码产品的表单渲染设计通常会使用操作Dom的方式实现。 下面是一个表单的例子&#xff1a; 产品层 用户通过打开表单&#xff0c;使用不同业务场景业务下的表单页面&#xff0c;中间的Render层就是技术实现。 每一个不同业务的表单…...

windows 剪切板的写入、读取,包括图片,文本内容

介绍 在windows开发过程中&#xff0c;我们可能会需要对系统剪切板进行操作&#xff0c;其中包括读取剪切板数据和将数据写入到剪切板中 设置剪切板内容 /*** brief 设置剪切板内容* param[in] pszData 指向缓冲区的指针* param[in] nDataLen 缓冲区长度* return 成功返回TRU…...

Matplotlib 高级图表绘制与交互式可视化(mpld3)

我们先重新回忆一下它的主要作用: 一、Matplotlib 简介 Matplotlib 是 Python 中一个非常强大的可视化库,广泛用于数据可视化、科学计算和工程领域。它提供了丰富的绘图功能,可以生成各种静态、动态和交互式的图表。以下是 Matplotlib 的主要功能及其详细讲解。 二、基本…...

(9)gdb 笔记(2):查看断点 info b,删除断点 delete 3,回溯 bt,

&#xff08;11&#xff09; 查看断点 info b&#xff1a; # info b举例&#xff1a; &#xff08;12&#xff09;删除断点 delete 2 或者删除所有断点&#xff1a; # 1. 删除指定的断点 delete 3 # 2. 删除所有断点 delete 回车&#xff0c;之后输入 y 确认删除所有断点 举…...

专业学习|通过案例了解蒙特卡罗模拟实操步骤与含义

一、蒙特卡罗模拟介绍 蒙特卡罗模拟&#xff08;Monte Carlo Simulation&#xff09;是一种基于随机采样的数值计算方法&#xff0c;用于解决具有不确定性或复杂概率分布的问题。其核心思想是通过多次随机抽样来逼近系统的行为或目标函数的真实值&#xff0c;进而对系统进行评估…...

云端智慧:创业公司如何以全球视野选择最佳平台,实现业务新高度

​2016年8月&#xff0c;一个名叫Bryce Adams的人辞去了自己原本很稳定的工作&#xff0c;开始追逐梦想&#xff1a;为使用WooCommerce&#xff08;一种开源的WordPress数字商务插件&#xff09;的公司开发一种能提供各类报表解决方案的应用。为此他成立了Metorik公司&#xff…...

【工具变量】中国省级八批自由贸易试验区设立及自贸区设立数据(2024-2009年)

一、测算方式&#xff1a;参考C刊《中国软科学》任晓怡老师&#xff08;2022&#xff09;的做法&#xff0c;使用自由贸易试验区(Treat Post) 表征&#xff0c;Treat为个体不随时间变化的虚拟变量&#xff0c;如果该城市设立自由贸易试验区则赋值为1&#xff0c;反之赋值为0&am…...

猫眼Java开发面试题及参考答案(上)

详细介绍项目,像项目中如何用 Redis,用到 Redis 哪些数据类型,项目中遇到哪些问题,怎么解决的 在我参与的一个电商项目中,Redis 发挥了至关重要的作用。这个电商项目主要是为用户提供商品浏览、购物车管理、订单处理等一系列功能。 在项目中使用 Redis 主要是为了提升系统…...

WSL2中安装的ubuntu开启与关闭探讨

1. PC开机后&#xff0c;查询wsl状态 在cmd或者powersell中输入 wsl -l -vNAME STATE VERSION * Ubuntu Stopped 22. 从windows访问WSL2 wsl -l -vNAME STATE VERSION * Ubuntu Stopped 23. 在ubuntu中打开一个工作区后…...

Linux抢占式内核:技术演进与源码解析

一、引言 Linux内核作为全球广泛使用的开源操作系统核心,其设计和实现一直是计算机科学领域的研究热点。从早期的非抢占式内核到2.6版本引入的抢占式内核,Linux在实时性和响应能力上取得了显著进步。本文将深入探讨Linux抢占式内核的引入背景、技术实现以及与非抢占式内核的…...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.28 NumPy+Matplotlib:科学可视化的核心引擎

2.28 NumPyMatplotlib&#xff1a;科学可视化的核心引擎 目录 #mermaid-svg-KTB8Uqiv5DLVJx7r {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KTB8Uqiv5DLVJx7r .error-icon{fill:#552222;}#mermaid-svg-KTB8Uqiv5…...

C#面试常考随笔12:游戏开发中常用的设计模式【C#面试题(中级篇)补充】

C#面试题&#xff08;中级篇&#xff09;&#xff0c;详细讲解&#xff0c;帮助你深刻理解&#xff0c;拒绝背话术&#xff01;-CSDN博客 简单工厂模式 优点&#xff1a; 根据条件有工厂类直接创建具体的产品 客户端无需知道具体的对象名字&#xff0c;可以通过配置文件创建…...

【深度学习入门_机器学习理论】朴素贝叶斯(NaiveBayes)

本部分主要为机器学习理论入门_熟悉朴素贝叶斯算法&#xff0c;书籍参考 “ 统计学习方法&#xff08;第二版&#xff09;”。 学习目标&#xff1a; 熟悉条件概率、先验概率、后验概率、全概率&#xff0c;熟悉朴素贝叶斯算法原理与推判断过程&#xff1b;熟悉参数估计&#…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

【QT控件】显示类控件

目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏&#xff1a;QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...

Shell 解释器​​ bash 和 dash 区别

bash 和 dash 都是 Unix/Linux 系统中的 ​​Shell 解释器​​&#xff0c;但它们在功能、语法和性能上有显著区别。以下是它们的详细对比&#xff1a; ​​1. 基本区别​​ ​​特性​​​​bash (Bourne-Again SHell)​​​​dash (Debian Almquist SHell)​​​​来源​​G…...