首页
归档
友情链接
关于
Search
1
在wsl2中安装archlinux
80 阅读
2
nvim番外之将配置的插件管理器更新为lazy
58 阅读
3
2018总结与2019规划
54 阅读
4
PDF标准详解(五)——图形状态
33 阅读
5
为 MariaDB 配置远程访问权限
30 阅读
心灵鸡汤
软件与环境配置
博客搭建
从0开始配置vim
Vim 从嫌弃到依赖
archlinux
Emacs
MySQL
Git与Github
AndroidStudio
cmake
读书笔记
菜谱
编程
PDF 标准
从0自制解释器
qt
C/C++语言
Windows 编程
Python
Java
算法与数据结构
PE结构
登录
Search
标签搜索
c++
c
学习笔记
windows
文本操作术
编辑器
NeoVim
Vim
win32
VimScript
Java
emacs
linux
文本编辑器
elisp
反汇编
OLEDB
数据库编程
数据结构
内核编程
Masimaro
累计撰写
308
篇文章
累计收到
27
条评论
首页
栏目
心灵鸡汤
软件与环境配置
博客搭建
从0开始配置vim
Vim 从嫌弃到依赖
archlinux
Emacs
MySQL
Git与Github
AndroidStudio
cmake
读书笔记
菜谱
编程
PDF 标准
从0自制解释器
qt
C/C++语言
Windows 编程
Python
Java
算法与数据结构
PE结构
页面
归档
友情链接
关于
搜索到
33
篇与
的结果
2022-07-11
从零开始匹配vim(2)——快捷键绑定
如果说 vim有什么最吸引人,我想vim允许你自由的定义各种快捷键算是一个原因吧。你可以通过绑定各种快捷键来使经常使用的功能更加便利。通俗的讲,快捷键映射就是我按下某个键,我想让vim将它当成另一个键,例如我按下 k,我想让vim把它当做 c 来使用(当然这么映射会把人逼疯)快捷键映射我们使用 :map 命令来进行快捷键的映射,例如我们输入如下内容:map - dd通过这个命令,我们将 - 映射为 dd ,也就是说现在我们按下 - 就可以删除光标所在行了。针对功能键,例如 Ctrl 、空格、Tab键 等,在 vim 中使用 <keyname> 的形式,其中 keyname 是按键名称,下面列举出一些常用的控制键的表示方式:Ctrl 键对应 <c>空格 键对应 <space>alt 键对应 <a> esc 键对应 <esc>退格键对应 <bs>回车键对应 <cr>shift 键对应 <shift>f1 到 f12 对应 <f1> 到 <f12>这些功能键与普通字母做配合时,将字母键放入到 <> 中,并以 - 和 功能键做分割,比如 :map <c-d> dd 来将 <Ctrl +d> 映射为 dd当然有时候为了可读性,我们可以将这些功能键以大写字母来表示,例如 <C-d> 就表示 <Ctrl +d>快捷键映射就是这么简单,接下来要做的就是思考如何进行映射能提升我们的效率,即提取常用的操作将他们映射为快捷键。我们来通过几个小例子来给小伙伴们提供一些思路。定义 -为将当前行往下移动移动我们知道,在普通模式下要将当前行往下移动,可以首先执行 dd 删除一行,然后执行 p 来拷贝到下一行,因此我们可以这样定义快捷键:map - ddp定义 _ 为将当前行往上移动移动在这个例子中,第一步仍然是执行删除,但是与上一个例子不同的是,我们要将删除部分往上一行粘贴。如果往上一行粘贴呢,在之前介绍的时候我们并没有提到如何执行这么一个操作。如果你的第一反应是要去翻用户手册或者去查其他的资料,那么我建议你仔细去阅读一下我之前写的内容。体会一下vim的一些思想和技巧。仔细回想一下 o(小写)和 O (大写) 的区别,而且我们曾经提到过,普通模式下,大写字母和小写字母功能类似。说到这我想你应该知道答案了。我们使用 P来粘贴到上一行。因此这里的映射可以写成:map _ ddP如果你觉得这两个映射对你有用,你可以将它放入你的 vimrc 中,或者先记下来,等我们介绍完使用 lua 配置之后,再写到 init.lua 中。其他模式下的映射map 可以定义映射,但是各位小伙伴可以做一下试验,map 命令定义的快捷键在 visual 模式下仍然有效。这样就会带来一个问题,如果我想在多个模式下都对 - 这个键进行了定义,而且定义成了不同的快捷键,这该怎么处理呢?其实 vim 针对不同的模式有不同的快捷键定义命令,例如 :nmap 负责在普通模式下定义快捷键, :vmap 负责在 visual 模式下定义快捷键。这个时候你肯定已经猜到了,:imap 可以在插入模式下定义快捷键,或者使用 :cmap 定义命令行模式下的快捷键。这些命令的格式与 :map 一样。下面还是以例子为主吧例1: 重新在普通模式下定义 -例如我们使用 :nmap 重新定义 - 为 ddp ,这个时候我们发现它只在普通模式下有用,而在选择模式下无效。例2: 定义 为复制粘贴不知道有没有小伙伴在初学vim的时候希望也能像在Windows中那样,使用 <Ctrl+c> 和 <Ctrl+v> 来进行复制粘贴。学到现在我们终于有能力自己动手实现这个需求了。虽然不推荐这么干,但是还是满足各位折腾的欲望吧。仔细回想一下,<Ctrl+c> 实际上是拷贝选中的文本,而<Ctrl+v> 是在输入的时候直接粘贴的。因此我们知道映射 <Ctrl+c> 应该是在 可视模式下。而<Ctrl+v> 应该是在插入模式下。另外在插入模式下是不支持使用 p 来进行粘贴的。还记得我们在插入模式下介绍的那些技巧吗?其中有一个快速从寄存器中粘贴的技巧。正好可以在这里用到。而复制操作会将复制的文本拷贝到寄存器中(也就是 0寄存器)。结合这两个知识点,我们可以很方便的映射出这两个快捷键:vmap <C-c> y :imap <C-v> <C-r>0虽然它仍有一些不完美,但是已经够用了。最后还是不推荐这么干,毕竟使用 y 等操作就能搞定的事情没必要弄的这么麻烦。而且在linux平台,特别是在终端上,这些键都另有用途。例如 <C-c> 在vim中可以退回到普通模式。例3: 定义 <c-d> 为在插入模式下删除一行我们再举一个例子,我想在插入模式下使用 <C-d> 来删除光标所在行。vim 在插入模式下并没有提供快捷键来删除一行,需要使用退格键一个个的删除,想要快速删除可以回到普通模式使用dd。那么我们可以使用 :imap <c-d> <esc>dd 。我们会发现按下 <c-d> 之后它成功删除了一行,但是它自己退回到普通模式去了,我们想要的是它能在删除一行后仍然处于插入模式,这样我们就可以直接输入了,因此我们可以在后面新加一个再次进入插入模式的步骤,即 :imap <c-d> <esc>ddi 。再次尝试,我们发现它已经满足我们的需求了。例4: 在插入模式下定义快捷键快速转换单词为全大写我们定义一个在插入模式下能快速将光标所在单词改为全大写字母。例如 C/C++ 语言的编程规范中都会讲到宏或者常量最好以大写字母命名。例如 #define MAX_CONNECTIONS_QUEUE 100 这样长的宏定义,我们在输入的时候要一直按着 shift 键是很痛苦的事情。我们需要有这么一个快捷键我们可以先输入小写字母然后使用快捷键将它改为全大写。首先我们思考一下,不使用快捷键该是如何操作呢?首先我们将光标移动到单词所在位置并退回到普通模式,接着使用 viw选中,然后使用 U来改为大写。根据这一串操作命令,我们可以就知道了该如何定义快捷键了,:imap <c-u> <esc>viwU 。根据上面的一个例子我们知道,这样它最终会停留在普通模式下面,我们还是希望能够回到插入模式,考虑到我的使用场景是,我在写完整个单词之后会立马将它转化为大写,然后再编辑后面的其他部分,因此我将光标移动到被大写的单词的尾部,并且进入插入模式。现在命令就变成了 :imap <c-u> <esc>viwUwa。这里你可以根据需要灵活的进行调整,例如可以改为 :imap <c-u> <esc>viwUA,在行尾进入插入模式。最后做一个总结。本篇提到的比较重要的定义快捷键的命令有:map: 定义所有模式下的通用快捷键imap: 定义插入模式下的快捷键 (insert)nmpa: 定义普通模式下的快捷键 (normal)vmap: 定义选择模式下的快捷键 (visual)
2022年07月11日
7 阅读
0 评论
0 点赞
2022-07-11
从零开始匹配vim(1)——选项设置
前面我们算是对 vimscript 做了一个入门,并且实现了一个 输出 hello world 的语句。现在我们继续进行 vimscript 的学习。set语句之前在介绍 vim 基础的时候,我们说要开启或者关闭某个属性,并且给出了相关的配置代码。那个时候已经接触了 set 语句了。例如我们使用 set number 来显示行号。这里我们可以知道 set的第一个用法:set attribute其中这个 attribute 是一个属性名称,用于开启/关闭属性。设置布尔值一般在程序设计中将开启或者关闭某个特性的变量设置为 bool 值。在 vim 中也是如此,但是它的特殊性在于它并不是将这个变量设置为 true 或者 false 而是设置为 name 或者 noname 的样子。举个例子,设置显示行号使用 set number 设置不显示行号使用 set nonumber 。另外对于 bool 类型的属性值还可以使用 ! 来对现有值进行取反,使用 ? 来查看当前使用的值。例如,如果当前不显示行号 set number! 会显示行号,再次执行则 :set number! 则不会执行。我们可以使用 set number? 来查看当前是否显示行号下面我们来执行这么一个例子set number set number? set number! set number?第一个 set number? 应该会返回 number 而第二个应该会返回 nonumber设置键值对有些值是属于 bool 类型,我们只需要 set 某一选项即可。但是有些属性并不适合设计成 bool 类型,例如窗口宽度、高度等等。他们更适合做成一个键值对的形式。针对这种形式的属性,我们直接使用 set key=value 的形式。例如 set columns=80 。对于这种类型的属性仍然可以使用 ? 来显示当前的值。例如 set columns? 来显示当前每行的最大字符长度。当然,与其他编程语言类似,我们也可以使用 set 语句,一次性给多个属性进行赋值,例如set number columns=80只是一般编程语言多个变量的赋值使用 , 作为分割,但是 vimscript 中使用 空格。使用 lua 设置vim属性作为一门更加规范的编程语言,lua 提供了多种方式来对这些变量进行赋值。目前有如下办法能对这些属性进行赋值。使用neovim提供的全局函数进行设置neovim 中提供了一组函数来设置这些属性。常见的分为三类:设置全局属性 a. vim.api.nvim_set_option() :设置值 b. vim.api.nvim_get_option() : 获取值设置窗口相关属性 a. vim.api.nvim_win_set_option() : 设置值 b. vim.api.nvim_win_get_option(): 获取值设置缓冲区相关属性 a. vim.api.nvim_buf_set_option() :设置值 b. vim.api.nvim_buf_set_option() : 获取值例如我们可以使用 vim.api.nvim_set_option('number', true) 来设置 显示行号。使用这些函数时需要严格区分对应属性是 bool、数字或者字符串类型。在 vimscript 中则没有这么严格的区分。使用元访问器进行设置neovim 的接口针对上述这些函数进行了一定的封装,提供了一组元访问器,以便我们能够像使用普通变量一样使用这些属性值。至于什么是元访问器暂时不用关心,只需要知道我们可以像使用变量一样来设置和获得这些属性,但是本质上还是在调用上述那些函数。针对上述函数,我们可以使用如下几种访问对象:vim.o: 全局属性,我们可以利用 options来记忆vim.bo: 缓冲区属性,我们可以利用 buffer-option来记忆vim.wo: 窗口属性, 我们可以利用 window-option来记忆例如我们可以使用 vim.o.number = true 或者 vim.o.columns = 80 来设置对应选项。等效于 vim.api.nvim_set_option("number", true) 和 vim.api.nvim_set_option("columns", 80)总结通过这篇文章,我们讨论了使用 set 来设置一些选项,并且给出了对应的使用 lua 来设置的方法。下面小伙伴们要做的就是读一下 vim 的用户手册,根据自己的喜好尝试着设置一些其他选项。例如我喜欢的基本配置如下:vim.o.syntax = "enable" vim.o.relativenumber = true vim.o.number = true vim.o.wrap = true vim.o.ruler = true vim.o.incsearch = true vim.o.softtabstop = 4 vim.o.shiftwidth = 4 vim.o.expandtab = true如果是vim可能需要的配置更多,但是 neovim 没有历史包袱,默认的已经很好用了最后,目前教程采取这种 vimscript 穿插着 lua 的方式进行讲解,后续配置虽然主要以 lua 为主,但是有时候又离不开 vimscript,neovim并没有完全开放 vim 的内置功能,有些功能只能使用 vimscript 来实现。目前我不太确定是继续采用这种 vimscript 穿插着 lua 进行讲解还是采用将 vimscript 和 lua 分开进行讲述。各位小伙伴觉得哪种方式更能接受呢?
2022年07月11日
7 阅读
0 评论
0 点赞
2022-07-06
从零开始匹配vim(0)——vimscript 简介
通过之前一系列的文章,相信各位小伙伴应该已经对vim产生了浓厚的兴趣,可能不少小伙伴通过慢慢的使用变的跟我一样,离开vim就不会写代码了。如果你希望继续长时间使用vim,甚至将vim作为主要的代码编辑器,那么花一定的时间来学习vim的配置是很有用的。如果你只是因为 linux 平台默认安装了 vi/vim ,平时又主要用它改改配置文件,临时用用,那么还是赶紧退出这个文章,免得耽误时间吧。标题上说从零基础打造vim多少有点标题党,要理解后面一系列文章的内容至少要了解vim里面的一些基本概念,我认为在阅读本系列专栏之前,你应该了解以下内容知道vim,并且知道 vim 的基本操作,例如进入插入模式、移动光标,并且知道如何保存退出知道vim的相关术语,缓冲区列表、缓冲区、窗口、命令模式、插入模式等等知道 vim的配置文件在哪3. 知道 vim的配置文件在哪如果你还不知道,请移步我的专栏,跟着专栏中的内容做做实验。理解一下里面提到的这些概念。关于配置部分,我准备介绍以下几个方面的内容:vimscript 的基础内容,并补充一些之前没介绍过的vim的特性neovim lua对应的接口推荐一些插件和相关配置,做到抛砖引玉可能有小伙伴要问了,vimscript 不管写还是读都比较晦涩,而且 neovim 已经采用更容易理解也更加现代化的 lua了,有必要学习 vim script吗?我觉得是有必要的,首先 neovim 是 vim 的另一个实现版本,要想学好 neovim 自然绕不开 vim,而学好 vim 自然也绕不开 vimscript 。其次,lua 脚本中的接口继承自 vimscript 。想要使用 lua 配置的前提是知道使用 vimscript 配置。它们就好像学习 MFC 绕不开 Win32 API 一样。所以我觉得想要学习 neovim 的配置自然绕不开 vimscript 。而且 neovim 完全兼容 vim 基本不用担心 vimscript 在 neovim 中执行不了的问题。 倒是 neovim 并没有实现 vimscript 百分之百的功能,有些时候还是得靠 vimscript 来实现。演示环境之前一系列的文章本来打算在 mac 上做演示的,但是我发现 mac上录屏比较麻烦,而且 mac上的 neovim 我已经配置好了,行为上可能跟裸 vim 有些差距(虽然可以不加载配置文件启动),所以我采用 WSL2 Ubuntu上的 neovim做演示。刚好这个演示环境没有对vim进行过配置。也方便演示从0开始配置。本教程的环境是 linux中 neovim 的 0.6.1 版本,虽然官方已经放出来 0.8 版本,但是Ubuntu官方源中好像还是 0.6。这里就继续用它演示吧第一个 vimscript 脚本我学习的任何一门语言好像都是从打印 hello world 开始的,我也不能免俗。我们这个教程也从打印 hello world 开始吧vimscript 中可以使用 echo 和 echom 来打印语句,例如我们可以在命令模式中输入 echo "hello world"。我们发现在屏幕的下方出现了 hello world 字样。接着我们再使用 echom "hello world" 发现,它仍然在下方打印了 hello world 字样。这两者有什么区别呢?要理解它们的区别我们需要介绍一个新的命令 :message 。这条命令可以查看 message-history 中的内容,我们可以简单的将这条命令理解为查看 vim 的运行日志(虽然并不是在查看日志)。执行这条命令我们发现,message-history 中只有一条 hello world。这个时候他们的区别就出来了,一个在打印的同时会将打印信息写入 message-history,另一个就仅仅只是打印而已。各位小伙伴只需要简单打印不同的语句就能知道 echom 会将内容写入到日志中,而 echo 不会。这里留个各位自己去实验吧,我就不做演示了。我们现在来完成一个小练习,使用vim脚本来写一段欢迎信息例如 hello, jack, 我们让用户每次打开都能看到这个欢迎信息 。这里的用户我们暂时让它固定,后续我们可以做到动态的修改 欢迎的用户。我们知道每次打开vim,它都会去加载配置文件,我们只要将要执行的命令写到配置文件中就好了。还记得配置文件在哪吗?针对 neovim 来说它支持 vimscript 和 lua 配置(当然它也支持其他语言)。我们将目录切换到 ~/.config/nvim 。如果各位小伙伴之前有过配置,那么请先将配置做一个备份。同时确保 init.lua (lua配置)和 init.vim (vimscript 配置) 只能有一个我们先尝试着用 vimscript 的方式来完成这个功能。我们建立一个新文件 ~/.config/nvim/init.vim。然后在里面写上一句 echo 'hello, jack',然后退出。我们发现每次进入 neovim 之后,总会在下方显示这么一句话了。我们再来看看如何使用 lua 来打印这么一句话呢?lua 中对应的函数是 print 。我们可以直接在 之前备份的 init.lua 中写上 print("hello, jack") 来完成这一个工作(记得现将之前的 init.vim 备份)。需要注意的是 lua 中的 print 写将信息一并写入到 message 中,也就是说它与 echom 效果相同。如果想执行 echo 操作可以使用 api.vim.nvim_echo() 。它的用法比较复杂,这就就不介绍它了,有兴趣的小伙伴可以去官网查一下,试试用它来实现这个打印欢迎信息的例子。这篇文章的内容到此就结束了,最后给大家做一个总结:neovim如果想要加载 vimscript配置,可以将配置文件放到 ~/.config/nvim/init.vim 中,如果想要加载 lua 配置,可以将文件放到 ~/.config/nvim/init.lua 中。echo、echom 都会打印字符串,不同的是 echom 将打印的内容往一个叫做 message-history 的地方写。lua 中的 print 具备 echom的功能可以使用 message 命令查看 message-history 的内容从 vimscript 的使用上看,它里面写的是vim的一些命令,我们将命令写在文件中让vim去执行。vim命令与 vimscript 的关系有点像 shell 命令和 shell 脚本的关系
2022年07月06日
6 阅读
0 评论
0 点赞
1
...
3
4