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"来选择时间,因为默认,at和it已用作非常有用的选择标签块的文本对象,一般覆盖它们不好.
此时,接口键映射的用法如下:
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插件. 因为有许多陷阱需要处理,很难创建文本对象.此插件隐藏了此类细节,并提供了声明式定义文本对象的方法. 你可用正则式来定义简单的文本对象,或使用函数来定义复杂的文本对象.如… 文本对…...
【AI论文】直接对齐算法之间的差异模糊不清
摘要:直接对齐算法(DAAs)通过在对齐人类反馈的强化学习(RLHF)中用直接策略优化替代强化学习(RL)和奖励建模(RM),简化了语言模型对齐过程。DAAs可以根据其排序…...
(9)gdb 笔记(2):查看断点 info b,删除断点 delete 3,回溯 bt,
(11) 查看断点 info b: # info b举例: (12)删除断点 delete 2 或者删除所有断点: # 1. 删除指定的断点 delete 3 # 2. 删除所有断点 delete 回车,之后输入 y 确认删除所有断点 举…...
中间件的概念及基本使用
什么是中间件 中间件是ASP.NET Core的核心组件,MVC框架、响应缓存、身份验证、CORS、Swagger等都是内置中间件。 广义上来讲:Tomcat、WebLogic、Redis、IIS;狭义上来讲,ASP.NET Core中的中间件指ASP.NET Core中的一个组件。中间件…...
什么是ce认证
CE认证,即只限于产品不危及人类、动物和货品的安全方面的基本安全要求,而不是一般质量要求,协调指令只规定主要要求,一般指令要求是标准的任务。因此准确的含义是:CE标志是安全合格标志而非质量合格标志。是构成欧洲指令核心的&qu…...
S4 HANA手工记账Tax Payable – FB41
本文主要介绍在S4 HANA OP中手工记账Tax Payable – FB41。具体请参照如下内容: 手工记账Tax Payable – FB41 该事务代码用于手工处理税码统驭科目的记账,一般税码科目需要设置为只能自动记账,因此无法手工对税码统驭科目记账,但…...
Java 大视界 -- Java 大数据在智慧文旅中的应用与体验优化(74)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
[leetcode]两数之和等于target
源代码 #include <iostream> #include <list> #include <iterator> // for std::prev using namespace std; int main() { int target 9; list<int> l{ 2, 3, 4, 6, 8 }; l.sort(); // 确保列表是排序的,因为双指针法要求输入是…...
老游戏回顾:G2
一个老的RPG游戏。 剧情有独到之处。 ------- 遥远的过去,古拉纳斯将希望之光给予人们,人类令希望之光不断扩大,将繁荣握在手中。 但是,暗之恶魔巴鲁玛将光从人类身上夺走。古拉纳斯为了守护人类与其展开了一场激战,…...
行为驱动开发(BDD)如何提高自动化测试效率
在软件开发的过程中,自动化测试一直扮演着至关重要的角色。随着需求变化日益复杂、开发周期不断压缩,如何提升自动化测试的效率和准确性成为了现代软件开发团队的核心挑战之一。行为驱动开发(BDD,Behavior Driven Development&…...
大语言模型的「幻觉」(Hallucination)是指模型在生成内容时
大语言模型的「幻觉」(Hallucination)是指模型在生成内容时,输出看似合理但实际错误、虚构或与事实不符的信息。这种现象并非模型有意欺骗,而是由其底层技术原理和训练方式导致的必然结果。 幻觉的核心特征 类型示例事实性错误生…...
[25] cuda 应用之 nppi 实现图像色彩调整
[25] cuda 应用之 nppi 实现图像色彩调整 在 NPPI(NVIDIA Performance Primitives)中,图像色彩调整通常包括以下几种操作: 亮度调整:增加或减少图像的亮度。对比度调整:增强或减弱图像的对比度。饱和度调…...
Redis常见数据类型与编码方式
⭐️前言⭐️ 本小节围绕Redis中常见的数据类型与编码方式展开。 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 🍉博客中涉及源码及博主日常练习代码均已上传GitHu…...
inter i5 6300U 可以干嘛
Intel Core i5-6300U 是一款发布于 2015 年的双核四线程处理器,属于 Intel 第六代 Skylake 架构的低功耗移动处理器(TDP 15W)。虽然它不是最新的处理器,但在日常使用中仍然可以胜任许多任务。以下是它适合的用途: 1. 日…...
不可控的内存分配(CWE-789)
漏洞描述:内存分配的大小受外部控制的输入数据影响,且程序没有指定内存分配大小的上限 漏洞风险:攻击者可以使程序分配大量的内存,程序可能会因为内存资源不足而奔溃。 修复或规避建议: 设定合理的内存分配上限&…...
大型三甲医院算力网络架构的深度剖析与关键技术探索
一、引言 1.1 研究背景与意义 1.1.1 医疗信息化发展趋势 随着信息技术的迅猛发展,全球医疗行业正经历着深刻的数智化转型。数字化转型已成为医疗行业提升服务质量、优化运营效率、推动医学科研创新的关键驱动力。从电子病历系统的普及到远程医疗的广泛应用&#…...
获取要素类或表中的字段列表
要素类和表中往往包含一个或多个属性信息,可以通过ListFields()函数获取要素类中的字段列表. 操作方法: 1.打开IDLE,新建一个脚本窗口 2.导入arcpy模块 3.设置工作空间 arcpy.env.workspace "" 4.在try语句中对<>要素调用ListFields()方法 try:fieldlis…...
Android原生开发入门
1. 资源地址 Android官方教程Android参考手册 2. 必看基础模块 应用基础知识View 绑定 :绑定相当于Qt中的ui文件生成界面代码的机制,Qt中的ucc会自动将ui文件编译成ui_xxxx.h文件,Android开发中也一样。 Android中自动生成的代码在&#x…...
网络设备的安全加固
设备的安全始终是信息网络安全的一个重要方面,攻击者往往通过控制网络中设备来破坏系统和信息,或扩大已有的破坏。网络设备包括主机(服务器、工作站、PC)和网络设施(交换机、路由器等)。 一般说来ÿ…...
验证工具:VCS与Verdi介绍
VCS和Verdi都是Synopsys公司旗下的工具,在集成电路设计和验证领域发挥着重要作用。 VCS VCS,全称Verilog Compile Simulator,是Synopsys公司的一款Verilog仿真工具。它具有以下主要功能: 编译和仿真:VCS能够对Verilog设计代码和testbench进行编译,生成simv二进制可执行…...
CSV数据分析智能工具(基于OpenAI API和streamlit)
utils.py: from langchain_openai import ChatOpenAI from langchain_experimental.agents.agent_toolkits import create_csv_agent import jsonPROMPT_TEMPLATE """你是一位数据分析助手,你的回应内容取决于用户的请求内容。1. 对于文…...
【Day31 LeetCode】动态规划DP Ⅳ
一、动态规划DP Ⅳ 1、最后一块石头的重量II 1049 这题有点像脑筋急转弯,尽量让石头分成重量相同的两堆(尽可能相同),相撞之后剩下的石头就是最小的。明白这一点,就与上一篇博客里的划分等和数组很相似。划分等和数组…...
产品经理的人工智能课 02 - 自然语言处理
产品经理的人工智能课 02 - 自然语言处理 1 自然语言处理是什么2 一个 NLP 算法的例子——n-gram 模型3 预处理与重要概念3.1 分词 Token3.2 词向量化表示与 Word2Vec 4 与大语言模型的交互过程参考链接 大语言模型(Large Language Models, LLMs)是自然语…...
华为手机nova9,鸿蒙系统版本4.2.0.159,智慧助手.今天版本是14.x,如何卸载智慧助手.今天?
手欠,将手机鸿蒙系统升级到4.2.0.159后,出现了负一屏,负一屏就是主页向左滑,出现了,如图的界面: 华为鸿蒙系统负一屏的界面 通过在手机中我的华为-搜索“开启或关闭智慧助手.今天(负一屏&#…...
C#面试常考随笔13: 泛型的主要约束和次要约束是什么?
在 C# 泛型中,主要约束和次要约束用于限制泛型类型参数的使用,确保类型参数满足一定的条件,从而提高代码的可靠性和可维护性。以下是主要约束和次要约束的详细介绍: 主要约束 引用类型约束(class)&#x…...
win32汇编环境,窗口程序中自定义工具栏的使用示例
;运行效果 ;win32汇编环境,窗口程序中自定义工具栏的使用示例 ;工具栏一般放在菜单下面,相当于一个个小的对话框,当然你放在其它地方也可以。 ;原理是,创建一张BMP位图,比如下例用一张168*24的图,平均分成7部分&#x…...
【PyQt】pyqt小案例实现简易文本编辑器
pyqt小案例实现简易文本编辑器 分析 实现了一个简单的文本编辑器,使用PyQt5框架构建。以下是代码的主要功能和特点: 主窗口类 (MyWindow): 继承自 QWidget 类。使用 .ui 文件加载用户界面布局。设置窗口标题、状态栏消息等。创建菜单栏及其子菜单项&…...
2024最新版Node.js详细安装教程(含npm配置淘宝最新镜像地址)
一:Node.js安装 浏览器中搜索Nodejs,或直接用网址:Node.js — 在任何地方运行 JavaScript 建议此处下载长期支持版本(红框内): 开始下载,完成后打开文件: 进入安装界面,在此处勾选,再点击n…...
DeepSeek R1的隐藏提问技巧?
deepseek属于推理模型,而不是指令模型,R1对提示词非常敏感。 1、需要更加真诚地与deepseek进行对话。 在用r1时,需要将此前的问答方式改变。 例如: 你现在是一个新能源汽车的市场研究分析师,这里有一份调研报告总结…...
【HTML入门】Sublime Text 4与 Phpstorm
文章目录 前言一、环境基础1.Sublime Text 42.Phpstorm(1)安装(2)启动Phpstorm(3)“启动”码 二、HTML1.HTML简介(1)什么是HTML(2)HTML版本及历史(3)HTML基本结构 2.HTML简单语法(1)HTML标签语法(2)HTML常用标签(3)表格(4)特殊字符 总结 前言 在当今的软件开发领域,…...
