首页 > 其他分享 >VimScript笔记

VimScript笔记

时间:2024-01-20 18:00:14浏览次数:30  
标签:文件名 安装 笔记 vim rtp var VimScript 目录

title: "VimScript笔记"
date: 2024-01-17T15:05:25+08:00
tags: ["Vim"]
categories: []
draft: false
toc: true

VimScript 五分钟入门(翻译) - 知乎
wsdjeg/vim-plugin-dev-guide: Vim 插件开发指南

基本语法

:source %: %表示当前文件的路径
e #: 切换到最近编辑的另一个文件

expand() 将具有特殊意义的标记(如%,#, 等)展开

文件名修饰

文件名修饰是指如何从一个文件名中获取其目录、全路径名、后缀名等相关的名字字符串。函数 fnamemodify({fname}, {mods}) 的第二参数就叫做修饰符,修饰符以冒号开头带一个单字母表示不同意义,且可连续使用。主要的修饰符如:

  • :p 文件全路径名
  • :h 父目录名(文件名头部,去除路径分隔符最后一部分)
  • :t 文件名尾部(一般是 ':h' 剩余部分,纯文件名)
  • :e 文件名后缀
  • :r 文件名主体(相对于 ':e' 而言,不包括后缀,但可能包含父目录)

变量

  • let 命令用来对变量进行初始化或者赋值。
  • unlet 命令用来删除一个变量。
  • unlet! 命令同样可以用来删除变量,但是会忽略诸如变量不存在的错误提示。

默认情况下,如果一个变量在函数体以外初始化的,那么它的作用域是全局变量;而如果它是在函数体以内初始化的,那它的作用于是局部变量。同时你可以通过变量名称前加冒号前缀明确的指明变量的作用域:

g:var - 全局
a:var - 函数参数
l:var - 函数局部变量
b:var - buffer 局部变量
w:var - window 局部变量
t:var - tab 局部变量
s:var - 当前脚本内可见的局部变量
v:var - Vim 预定义的内部变量

字符串比较

  • <string> == <string>: 字符串相等
  • <string> != <string>: 字符串不等
  • <string> =~ <pattern>: 匹配 pattern
  • <string> !~ <pattern>: 不匹配 pattern
  • <operator>#: 匹配大小写
  • <operator>?: 不匹配大小写

注意:设置选项 ignorecase 会影响 == 和 != 的默认比较结果,可以在比较符号添加 ? 或者 # 来明确指定大小写是否忽略。

函数

强制创建一个全局函数(使用感叹号),参数使用 ... 这种不定长的参数形式时,a:1 表示 ... 部分的第一个参数,a:2 表示第二个,如此类推,a:0 用来表示 ... 部分一共有多少个参数。

function! g:Foobar(arg1, arg2, ...)
    let first_argument = a:arg1
    let index = 1
    let variable_arg_1 = a:{index} " same as a:1
    return variable_arg_1
endfunction

插件开发

<SID>含义

Vim 脚本学习笔记 · 幽谷奇峰 | 燕雀鸣幽谷,鸿鹄掠奇峰

<SID><Plug> 都是用来避免映射的键序列和那些仅仅用于其它映射的映射起冲突。
<Plug> 在脚本外部是可见的。它被用来定义那些用户可能定义映射的映射,
<SID> 是脚本的 ID,用来唯一的代表一个脚本。

命令补全

wsdjeg/vim-plugin-dev-guide: Vim 插件开发指南

command! -nargs=* -complete=custom,helloworld#complete HelloWorld call helloworld#test()
其中 -complete=custom,helloworld#complete 表示,改命令的补全方式采用的是自定义函数 helloworld#complete。

vim运行时目录

插件的目录,可参考 vim 本身安装的运行时目录。所谓运行时目录,顾名思义,就是在 vim 运行时如果要加载 *.vim 脚本,应该到哪里找文件。
有两个相关的环境变量,可用如下命令查看:

:echo $VIM
:echo $VIMRUNTIME

如果从源码安装 vim ,且自定义安装于家目录的话,它们的值大概如下:

$VIM = ~/share/vim
$VIMRUNTIME = ~/share/vim/vim81

所以 \(VIM 指的是 vim 安装目录,而且不同版本的 vim 都将安装在该目录下,\)VIM-RUNTIME 就是具体当前运行的 vim 版本的安装目录。不过此安装目录不包括 vim 程序本身(那是被安装到 ~/bin 中的),主要是 vim 运行时所需的大量 *.vim 脚本,相当于“官方插件”。该目录有哪些文件目录,可用如下命令显示:

:!ls -F $VIMRUNTIME

$VIMRUNTIME 既是官方目录,显然是不建议用户在其内修改或增删的。如果不是自定义安装在个人家目录,使用系统默认安装的 vim 的话,普通用户也无权修改。于是 vim 提供了一个选项叫 &runtimepath (常简称 &rtp),那是类似系统 shell 的环境变量 $PATH,就是一组目录,只不过不用冒号分隔,而是用逗号分隔。可用如下命令查看 &rtp :

:echo &rtp
:echo split(&rtp, ',')

通常,~/.vim/ 目录会在 &rtp 列表中,而且往往是第一个。另外,官方目录 $VIMRUN-TIME 也在 &rtp 列表较后一个位置。当 vim 在运行时需要加载脚本时,就会依次从 &rtp列表中每个目录(及其子目录)中查找,有时查找第一个就会停止。所以 $VIMRUNTIME目录并不特殊,只是 &rtp 中一个优先级并不高的目录。对用户来说,~/.vim/ 目录才更特殊些,常被称为 vim 的用户目录。

一般建议用户将个人的 vimrc 及其他 vim 脚本放在 ~/.vim/ 目录中。可以用这个命令:

:echo $MYVIMRC

查看当前你运行的 vim 启动时读取 vimrc。如果显示是 ~/.vimrc ,则建议将其移至 ~/.vim/vimrc 或软链接指向它。vim 会尝试读取 vimrc 的几个位置及顺序,也可用如下命令查看:

:version

标签:文件名,安装,笔记,vim,rtp,var,VimScript,目录
From: https://www.cnblogs.com/devin1024/p/17976875

相关文章

  • 学习笔记——KMP模式匹配
    KMP模式匹配KMP算法能够在线性时间内判定字符串\(A\left[1\simN\right]\)是否是字符串\(B\left[1\simM\right]\)的字串,并求出字符串\(A\)在字符串\(B\)中各次出现的位置。详细来讲,KMP算法分为两步。对字符串\(A\)进行自我匹配求出一个数组\(next\),\(next\lef......
  • Check for balanced parentheses using stack【1月20日学习笔记】
    点击查看代码//Checkforbalancedparenthesesusingstack#include<iostream>#include<stack>//stackfromstandardtemplatelibrary(STL)#include<string>usingnamespacestd;boolarepair(charopening,charclosing){ if(opening=='(&#......
  • 关于SQL-case when最全面的学习笔记
    原文zhuanlan.zhihu.com/p/110198759?from_voters_page=truecasewhen推荐学习书籍:1、SQL基础教程6-32、SQL进阶教程1-1casewhen是SQL语法中提供的标准的条件分支。条件分支在MYSQL中即为IF函数,不同的数据库都会提供自己的一些函数,但是CASEWHEN更加通用。CASE语句......
  • 嵌入式系统开发笔记
    嵌入式概念:是应用为中心,以计算机技术为基础,软硬件可裁剪,对功耗、体积、可靠性、成本都有严格要求的专用计算机系统。内存寻址独立寻址:片内片外存储器只能选择其中一个(芯片内部有标志引脚,使用高低电平来表示读取片内或者片外)统一寻址:片内片外存储器都能使用,且使用的是同一片连续的寻......
  • 二项式反演学习笔记
    前置知识二项式定理:\((a+b)^n=\sum_{i=0}^n\binom{n}{i}a^ib^{n-i}\)。二项式反演反演公式1:\[f(n)=\sum_{i=0}^n\binom{n}{i}g(i)\iffg(n)=\sum_{i=0}^n(-1)^{n-i}\binom{n}{i}f(i)\]证明:\[\begin{aligned}\sum_{i=0}^n(-1)^{n-i}\binom{n}{i}f(i)&=\sum_{i=0......
  • 积性函数学习笔记
    积性函数定义积性函数:\(f(x)\)满足\(\forall\gcd(a,b)=1,f(ab)=f(a)f(b)\)若没有\(\gcd(a,b)=1\)的性质,则为完全积性函数。性质性质1:\(f(x),g(x)\)是积性函数\(\implies\)\(f\timesg\)是积性函数,\(f\divg\)是积性函数证明略。性质2:狄利克雷(Dirichlet)卷积\(......
  • 欧拉定理学习笔记
    费马小定理\(a,p\in\mathbb{Z_+}\),\(p\)为质数,\(\gcd(a,p)=1\)。定理:\(a^{p-1}\equiv1\pmodp\)。证明:考虑下面两个整数集合:\[A=\{x\in\mathbb{Z_+}|1\lex<p\}\]\[B=\{y\in\mathbb{Z_+}|y=ax,x\inA\}\]\(A\)中很明显每个数对\(p\)取余各不相同......
  • 莫比乌斯反演学习笔记
    前置知识狄利克雷卷积:\(f*g=\sum_{d|n}f(d)g(\frac{n}{d})\)。积性函数,线性筛。数论分块。单位函数:\(\varepsilon(n)=[n=1]\)。(积性函数)常数函数:\(1(n)=1\)。(积性函数)莫比乌斯函数引理1:\(f(n)\)是积性函数等价于\(g(n)=\sum_{d|n}f(d)\)是积性函数。证明:显然,\(g=......
  • 容斥学习笔记
    目录容斥原理Min-Max容斥广义容斥原理容斥原理原理:\[|\bigcup_{i=1}^nA_i|=\sum_{j=1}^n(-1)^{j-1}\sum_{a_k\not=a_{k+1}}\bigcap_{l=1}^mA_{a_i}\]这东西学过小学奥数就会了。一些有用的结论:\[|\bigcap_{i=1}^nA_i|=|\Omega|-|\bigcup_{i=1}^n\overline{A_i......
  • 杜教筛学习笔记
    原理前置知识:积性函数,狄利克雷卷积。杜教筛可以在亚线性的时间内算出某些函数的前缀和。假设我们要算出函数\(f\)的前缀和,我们要找到函数\(g\),记\(f*g=h\)。杜教筛的前提是\(g\)的前缀和与\(h\)的前缀和都可以快速计算,我们可以快速计算\(f\)的前缀和。首先,我们考......