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)可能会根据环境覆盖当前选择.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AUTOSAR面试题集锦(1)

最基础概念 目录 最基础概念 什么是AUTOSAR?AUTOSAR到底做了什么? AUTOSAR的结构是什么样的?分为哪几层? MCAL开发 什么是MCAL? 使用过EB吗?怎样使用EB配置MCAL工程? autosar4.3.1和4.4.0有什么区别? 什么是复杂驱动? 为什么使用多核?AUTOSAR提供了几种多核…

【算法】动态规划专题⑧ —— 分组背包问题 python

目录 前置知识进入正题实战演练总结 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 python 进入正题 分组背包问题的详细解析 1. 问题定义 在 分组背包问题 中&#xff0c;物品被划分为若干组&#xff0c;每组内的物品 互斥&#xff08;只能选择其中一个或…

LLM:DeepSeek 系列(二)

原文链接 3、DeepSeek-V2 DeepSeek-V2 发布于 2024 年 5 月&#xff0c;为多领域专家&#xff08;MoE&#xff09;语言模型&#xff0c;包含总共 2360 亿个参数&#xff0c;其中每个词元激活 210 亿个参数&#xff0c;并支持 12.8 万个词元的上下文长度。DeepSeek-V2 采用包括…

AtCoder Beginner Contest 391(A~E题题解)

A - Lucky Direction 思路&#xff1a;纯模拟的一个水题 #include <bits/stdc.h> using namespace std; #define int long long string s; signed main() { cin>>s;for(int i0;i<s.size();i){char cs[i];if(cN){cout<<"S";}else if(c…

redis中的hash结构

hash类型也叫散列&#xff0c;其中value是一个无序字典&#xff0c;不用像string类型中的value用jason结构去存储&#xff0c;他的value可以将对象中的每个字段独立存储&#xff0c;而且有个好处&#xff0c;方便修改value值 类似于这样 hash类型的常见命令&#xff1a;

USB子系统学习(四)使用libusb读取鼠标数据

文章目录 1、声明2、HID协议2.1、描述符2.2、鼠标数据格式 3、应用程序4、编译应用程序5、测试 1、声明 本文是在学习韦东山《驱动大全》USB子系统时&#xff0c;为梳理知识点和自己回看而记录&#xff0c;全部内容高度复制粘贴。 韦老师的《驱动大全》&#xff1a;商品详情 …

02.08 多路文件IO

思维导图1&#xff1a; 思维导图2&#xff1a; 高效处理多路文件IO&#xff1a;select、poll和epoll模型详解 在现代网络编程中&#xff0c;高效地监视多个文件描述符的IO状态&#xff08;如可读、可写、异常&#xff09;是至关重要的。本文将详细介绍三种常用的多路文件IO模…

opentelemetry-collector 配置elasticsearch

一、修改otelcol-config.yaml receivers:otlp:protocols:grpc:endpoint: 0.0.0.0:4317http:endpoint: 0.0.0.0:4318 exporters:debug:verbosity: detailedotlp/jaeger: # Jaeger supports OTLP directlyendpoint: 192.168.31.161:4317tls:insecure: trueotlphttp/prometheus: …

基于联合概率密度与深度优化的反潜航空深弹命中概率模型研究摘要

前言:项目题材来自数学建模2024年的D题,文章内容为笔者和队友原创,提供一个思路。 摘要 随着现代军事技术的发展,深水炸弹在特定场景下的反潜作战效能日益凸显,如何最大化的发挥深弹威力也成为重要研究课题。本文针对评估深弹投掷落点对命中潜艇概率的影响进行分析,综合利…

fps动作系统2:手臂动画

文章目录 角色蓝图pawn自动控制玩家 动画蓝图事件图表动画图表状态机时长 随机序列播放器混合空间播放器权重速度 角色蓝图 pawn 自动控制玩家 设置玩家控制器控制此pawn。 动画蓝图 事件图表 更新角色的相关数值 动画图表 设置角色相关动画以及切换规则 状态机 状态…

使用 ElementUI 和 Spring 实现稳定可靠的文件上传和下载功能

前端(ElementUI) 1. 文件上传 使用 el-upload 组件配置上传接口处理上传成功和失败<template><div><el-uploadclass="upload-demo"action="http://your-server-url/upload":on-success="handleSuccess":on-error="handle…

Docker安装pypiserver私服

Docker安装pypiserver私服 1 简介 Python开源包管理工具有pypiserver、devpi和Nexus等&#xff0c;pypiserver安装部署比较简单&#xff0c;性能也不错。 搭建pypiserver私服&#xff0c;可以自己构建镜像&#xff0c;也可以使用官网的docker镜像。 # Github地址 https://g…

[ Spring ] Integrate Spring Boot Service Monitor Prometheus and Grafana

文章目录 Install Prometheus ServerInstall Grafana ServerSpring Prometheus ProjectSpring Prometheus PropertiesSpring Prometheus ApplicationSpring Prometheus ConfigurationSpring Prometheus ControllerConfigure Grafana Dash Board Install Prometheus Server # d…

“现代C++ RAII库:设计、优化及实战应用“

文章目录 代码 示例raii 类的使用示例代码&#xff1a;解释&#xff1a; raii_var 类的使用示例代码&#xff1a;解释&#xff1a; 结合线程使用示例代码&#xff1a;解释&#xff1a; make_raii 函数签名&#xff1a;示例&#xff1a;解释&#xff1a; raii_bind_var 函数签名…

代码随想录day06

242.有效的字母异位词 刚学哈希表想着使用unordered_set来实现&#xff0c;结果无法通过&#xff0c;原因是对字母异位词理解有问题&#xff0c;字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语&#xff0c;并使用所有原字母一次。对字母出现的次数有要求&am…

Java_双列集合

双列集合特点 存放的是键值对对象&#xff08;Entry&#xff09; Map 因为都是继承Map&#xff0c;所以要学会这些API&#xff0c;后面的类就都知道了 put 有两个操作&#xff0c;添加&#xff08;并返回null&#xff09;或者覆盖&#xff08;返回被覆盖的值&#xff09…

MHTML文件如何在前端页面展示

MHTML文件如何在前端页面展示 需求背景&#xff1a; 目前在给证券公司做项目&#xff0c;但是在使用新系统的过程中&#xff0c;甲方还希望之前之前系统的历史记录可以看到。 最初制定的计划是项目组里面做数据的把原系统页面爬取下来&#xff0c;转成图片&#xff0c;直接给…

解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException

解决Spring Boot中MySQL数据库报错“Bad SQL Grammar”的问题 目录 解决Spring Boot中MySQL数据库报错“Bad SQL Grammar”的问题 问题描述解决步骤解决方案结论附&#xff1a;MySql常用配置参数及使用场景 在使用Spring Boot连接MySQL数据库时&#xff0c;有时候会遇到“B…

【AI日记】25.02.08

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】【AI应用】 探索 AI 应用探索周二有个面试&#xff0c;明后天打算好好准备一下&#xff0c;我打算主要研究下 AI 如何在该行业赋能和应用&#xff0c;以及该行业未来的发展前景和公司痛点&#…

【AI学习】关于 DeepSeek-R1的几个流程图

遇见关于DeepSeek-R1的几个流程图&#xff0c;清晰易懂形象直观&#xff0c;记录于此。 流程图一 来自文章《Understanding Reasoning LLMs》&#xff0c; 文章链接&#xff1a;https://magazine.sebastianraschka.com/p/understanding-reasoning-llms?continueFlagaf07b1a0…