首页
归档
友情链接
关于
Search
1
在wsl2中安装archlinux
105 阅读
2
nvim番外之将配置的插件管理器更新为lazy
78 阅读
3
2018总结与2019规划
62 阅读
4
PDF标准详解(五)——图形状态
40 阅读
5
为 MariaDB 配置远程访问权限
33 阅读
软件与环境配置
博客搭建
从0开始配置vim
Vim 从嫌弃到依赖
archlinux
Emacs
MySQL
Git与Github
AndroidStudio
cmake
读书笔记
编程
PDF 标准
从0自制解释器
qt
C/C++语言
Windows 编程
Python
Java
算法与数据结构
PE结构
Thinking
FIRE
菜谱
登录
Search
标签搜索
c++
c
学习笔记
windows
文本操作术
编辑器
NeoVim
Vim
win32
VimScript
emacs
linux
文本编辑器
Java
elisp
反汇编
OLEDB
数据库编程
数据结构
内核编程
Masimaro
累计撰写
314
篇文章
累计收到
31
条评论
首页
栏目
软件与环境配置
博客搭建
从0开始配置vim
Vim 从嫌弃到依赖
archlinux
Emacs
MySQL
Git与Github
AndroidStudio
cmake
读书笔记
编程
PDF 标准
从0自制解释器
qt
C/C++语言
Windows 编程
Python
Java
算法与数据结构
PE结构
Thinking
FIRE
菜谱
页面
归档
友情链接
关于
搜索到
24
篇与
的结果
2022-04-14
vim 从嫌弃到依赖(3)——vim 普通模式
在上一篇中,我们提到vim的几种模式,并且给出了一些基本的操作命令,包括移动光标,删除、替换操作。并且给出了几个重要的公式,理解这个公式对于理解vim和提高使用vim的效率来说至关重要。所以在这篇文章里面我打算再围绕这几个公式给出一些示例,希望能给各位理解公式提供一些帮助。行内查找字符串vim操作的效率很大程度上取决于移动光标的效率,平时在修改代码的时候很大程度上都是需要在特定位置修改,下面介绍到的操作很大程度上能提高我们移动光标和修改的效率行内查找字符使用 f{char} 来进行,即使用f后面加一个字符,会快速跳转到行内第一个出现该字符的位置,例如下面一段话vim.o.relativenumber = true假设光标位于行首的s 处,我们可以使用 fr 将光标移动到单词 字符 r出现的位置根据公式motion = [数字] + 移动光标我们可以使用 2fr 跳转到第二个r 位置我们也可以使用 t 来跳转光标到搜索的字符处,它与 f 的区别在于 f 直接跳转光标到指定字符处,t 跳转光标到指定字符的前一个位置例如使用 tr 跳转到第一个r的左边使用3tr 跳转到第三个r的左边我们可以使用 F 和 T 实现向前查找,它门跳转的规则与 f 和 t 类似,这里就不再给出具体的示例了,有小伙伴感兴趣的可以自行尝试大范围移动之前只演示了基本的行内移动和多行移动,但是多行移动是基于上述公式实现重复向下移动一行多次的。vim中提供了一些大范围移动光标的方式。H 移动光标到窗口首行M 移动光标到窗口中间L 移动光标到窗口尾行gg 移动光标至第一行G 移动光标到最后一行要演示这几个操作光靠一屏就可以显示完的简短的文本是不行的,这里我采用 ~/.bashrc 小伙伴可以随便打开一个系统的配置文件,只要它超过一屏就行假设光标在文件最后一行,使用H 将光标移动到窗口首行假设光标在文件最后一行,使用 M 移动光标到窗口中间假设光标在文件第一行,使用 L 移动光标到窗口末尾假设光标在文件的第一行,使用 G 移动光标到最后一行后面的 gg 也就不演示了,从上面这些演示来看不难发现窗口和文件不是同一个东西,在窗口中跳转只能在文件的部分区域间进行跳转,而在文件中跳转则能浏览文件中的任意行根据上面的公式,他们前面也是可以添加数字的,但是在这些操作的前面加上数字表示重复又有什么,例如gg 可以跳转到文件首行,我执行3次跳到行首又有什么用呢。要解释这个问题,我们先看一个例子例如使用 3gg 可以跳转到文件的第三行。这里我们假设光标在文件的最后一行这些算是之前将的公式含义的特例吧,他们并不表示重复,这里我仅仅列出他们的含义吧,具体该如何理解我也不清楚,暂时记住,后续会使用即可数字 + gg, 表示跳转到文件的第几行数字 + G, 也表示跳转到文件的第几行。但是我平时都使用 gg 这种跳转方式,毕竟在一个键位上按两次可比按它的大写字母要快的多数字 + L, 移动到窗口的倒数第几行数字 + H, 移动到窗口的第几行数字 + M, 与单纯的使用M 效果一样结合跳转指令的操作下面在列举一些操作符配合光标移动指令的例子,帮助大家理解例1,我们来针对之前的配置文件来做修改假设光标在 relativenumber 的词首我们可以使用cw 来删除该单词并输入number可以直接使用 dtn 来删除字符 n 前面 relative例2 将 hello world!! 改为 hello world!!!使用 2f! 将光标移动到对应位置,然后使用 a 进入插入模式插入对应字符使用 2f" 移动到行尾,然后使用i 进入插入模式插入对应字符使用$ 跳转到行尾,使用 i 进入插入模式进行修改从上面的例子来看,使用 f t 之类的指令相比使用 l、w 更加高效,毕竟数单词个数和字符格式是很低效而且容易出错的例3:将 "hello world" 改为 "nice to meet you"我们假设光标位于h处使用 d2w 删除两个单词并进入插入模式使用 dt" 删除对应单词,然后进入插入模式使用 ci" 删除对应字符并进入插入模式文本对象看到这里,肯定很多小伙伴会有一脑袋问号,这个 i 是什么东西,i 不是进入插入模式嘛,为什么我光标在行首它也能准确的删除引号内的字符呢。这就涉及到vim中一个非常重要的概念——文本对象还记得最开始我们说过,vim将文本分为 字符、单词、句子、段落嘛,这可不是为了方便而人为划分的,而是vim在处理文本的时候就是真么做的。文本对象是vim 描述这些划分的。文本对象只能跟在 operator 后,由 a 和 i 开头,后面跟文本范围来组成,表示我们要针对哪个范围的文本进行何种处理。其中 i 表示 inner 不包含表示范围的字符, 而 a 会包含表示范围的字符。例如上述例子中,如果使用 i 则会保留 " ,使用 a 则不会保留。感兴趣的小伙伴可以自行尝试。下面给出各种文本范围的表格文本范围代表含义wword 词ssentence 句pparagraph 段ttag(HTML/XML) 标签[或]由[]包裹的部分(或)由()包裹的部分<或>由<>包裹的部分{或}由{} 包裹的部分"由""包裹的部分'由''包裹的部分\`由\`\`包裹的部分文本对象看似抽象,实际上只需要多使用几次基本就能掌握它了。熟练掌握它之后,将会大大提高我们编辑文本的效率接下来让我们再给出一个最后的例子,并且以本示例来结束该文假设有这么一段文本<div class = "example"> <div> This is vim example</div> </div>我们希望将其变为<div class "example"> vim is so good </div>我们将光标移动到最外层的div上,然后使用 cit 删除div中的内容,然后输入 "vim is so good"
2022年04月14日
7 阅读
0 评论
0 点赞
2022-04-12
vim 从嫌弃到依赖(2)——vim 模式
在上一篇文章中我们获取到了neovim 并对它进行了基础配置。现在已经具备一般编辑器的基本功能了。让我们先学会如何使用vim基本功能进行编辑,后面再看如何进行配置,以达到某某IDE或者编辑器的效果vim 为何高效这里我们先聊聊vim为何高效。一般进行编辑工作,不管是使用Word,记事本,写PPT,对于文本的操作无外乎这么几种操作移动光标到指定位置输入删除替换(删除 + 输入)而vim之所以高效就是将这几个部分分解为几个模式,不同的模式针对这些场景进行了一些优化。下面是几个简单的示例将多行文字合并为1行删除前5行将每行后面的数字+1这些操作先卖个关子,暂时不去管他们,接下来简单说说vim的几种模式,然后了解一下移动光标的一些命令,最后提供一个能描述vim操作逻辑的公式vim的几种模式vim主要分为一下几个模式普通模式 (normal mode) 不出意外的话,在使用vim的时候大部分时间停留在普通模式下,并且很多操作都是在普通模式下完成的,例如上述的几个例子全都是在普通模式下完成的。移动光标、切换模式都是在普通模式下进行的插入模式 (insert mode) 插入模式主要用来编辑文本,在该模式下输入的字符都会作为文本的一部分进行保存,在该模式下可以进行文本的编辑操作可视模式(visual mode) 该模式主要用来选择一部分文本,实现的功能跟用鼠标选中一段文本一样,后续可以输入命令针对被选中的文本进行处理命令行模式(command mode) 可以在普通模式和可视模式下输入 : 进入命令行模式,严格意义上来说,它并不是一个真正的模式。许多复杂的操作其实都可通过一个简单的命令来完成。在命令行中,我们可以执行 vim 自带的命令,也可以执行自定义的命令(例如很多插件都有一些自定义命令)。例如使用 :w 来将缓冲区中的内容写入一个文件中,或者使用:q 来退出vim。vim 移动光标的几种方式移动光标可以说是vim 中所有操作里面最基础的操作了。因为 删除, 输入 和 替换 这三个操作都是以光标所在位置为基础做的。可以说,高效的文本处理大多依赖于光标移动的效率,而如何高效的把光标移动到 “目标” 处是一个不小的学问。一般来说普通的编辑器移动光标的方式都是通过手去移动鼠标,通过鼠标来定位到光标要移动的位置,这么做并不高效。原因是在移动鼠标的过程中涉及到将手由键盘移开,将手放到鼠标上、找到对应位置然后移动光标,最后再将手由鼠标移动到光标上。这些动作不仅打断了键盘输入,同时也打断了我们输入的思路。要做到高效移动光标首要的就是手不要离开键盘(尽量不要大范围的移动手)。vim 的普通模式完美的解决了这个问题,在普通模式下提供了丰富的操作来移动光标,下面列举一些常用的h: 向前移动一个字符l: 向后移动一个字符j: 向下移动一行k: 向上移动一行b: 向前移动一个单词w: 向后移动一个单词e: 移动光标到单词尾部^: 移动光标到行首第一个非空字符处$: 移动光标到行末最后一个非空字符处gg: 移动光标至文件首行的首个非空格字节G: 移动光标至整个文本最后一行的首个非空格字节()%: 移动光标到匹配括号的另一端0: 移动光标至行首说句题外话,vim 使用 h j k l 来代替 ← ↓ ↑ → 主要是因为当年创建 vi 的时候键盘张这样如果仅仅使用上述介绍的内容进行移动光标,一次移动一个字符、一个单词、一行,这效率也太低了,无法处理需要大幅度跳转光标的需求。这里介绍一个公式数字 + 移动光标例如上述介绍的移动光标的方式都可以采用这个公式。前面的数字表示按同意的操作移动光标的次数,例如 2w 表示向后移动两个单词,3j 表示向下移动3行。我们把这个公式总结为motion = [数字] + 移动光标上述公式可以理解为 motion就是定义了如何移动光标vim 基础操作之删除和替换移动光标之后,接下来应该就是进入输入模式进行输入操作,但是这里我们先不谈输入模式。其实在忽略在输入模式下的各种操作技巧,输入模式中剩下的就是输入各种字符完成输入操作,相对比较基础,这里先不谈它。我们先来说说在普通模式下的删除和替换操作。删除操作使用 d(你可以理解为英文单词 delete 的首字母),替换操作使用 c(也就是 change)我们输入 d 或者 c 发现操作卡住了,其实这个时候vim在等用户输入对应的范围即 motion ,表示针对哪个范围的文本进行该操作,这里我们引入第二个公式operate = operator + motion公式可以理解为,一个操作等于我们想要多多大范围的文本进行何种操作。例如cw 表示针对一个单词进行替换操作,d2w 表示对光标后2个单词进行删除操作,这么写也比较符合我们平时使用的日常语言,例如 d2w = delete 2 words (删除两个单词)示例: 使用 c2w 删除两个单词并进入插入模式示例: 使用 d$ 删除光标后至行尾的所有内容其实类似 d 和 c 的操作还有很多,例如\>: 右缩进<: 左缩进=: 自动缩进y: 赋值p: 粘贴gu: 变为小写gU: 变为大写g~: 反转大小写示例:使用>G 将当前行至文件尾部的代码进行缩进我们也可以在 operator 前添加数字,表示执行操作重复次数,这里我们的公式就可以进行改写operat = [数字] + operator + motion例如2dw 表示删除一个单词并将该操作执行两遍。它与前面演示的 d2w 能达到相同的操作,但是含义不同。d2w 表示一次删除两个字符。理解了这个,这里我提出一个简单的问题 2d2w 的等效操作是哪两个呢,欢迎评论区给出。以行为单位的操作例如我们要删除一行,根据以上学习的内容可以想到使用 dj ,但是实际尝试的时候发现它删除了两行。我们还可以想到先使用 0将光标移动到行首,然后使用 d$ 删除整行,但是会发现它会留下一个空白行。如果想针对行本身进行操作的话,需要将同样的操作同时按两下,即dd 表示删除一行,>> 表示缩进当前行。这里我们可以扩展一个公式operat = [数字] + 2 * operator即重复按下两次同样的操作命令表示针对行进行操作,前面加上数字表示重复多少次。举几个例子5dd 删除5行4>> 将4行代码进行缩进2cc 更改接下来的两行,并进入插入模式最后的总结本篇到这里就结束了,最后做一下总结,我们提到几个公式motion = [数字] + 移动光标 operat = [数字] + operator + motion operat = [数字] + 2 * operator根据这些公式我们可以根据具体情形自由发挥想象。它是vim的基础也是体现它高效的一个地方。另外还介绍了一些常用的移动光标的方式和常用的操作符,这里再次将他们列举出来以供查阅几种常用motionmotion含义h左移j下移k上移l右移动w向后移动一个词b向前移动一个词e移动光标至词末$移动光标至行末0移动光标至行首^移动光标至本行首个非空格字节gg移动光标至文件首行的首个非空格字节G移动光标至整个文本最后一行的首个非空格字节()%移动光标到匹配括号的另一端几种常用操作符operator含义c修改,删除当前并切换到insert moded删除,该命令与motion配置使用,表示删除光标移动过的所有内容>右缩进<左缩进=自动缩进y赋值p粘贴gu变为小写gU变为大写g~反转大小写
2022年04月12日
10 阅读
0 评论
0 点赞
2022-04-08
vim 从嫌弃到依赖(1)——安装和定位vimrc
在上一篇文章中,我们简单开了一个头,阐述了下学习vim的必要性,这章开始,会慢慢由浅入深的学习它的一套完整的,高效的文本编辑方式方法。废话不多说,咱们正式开始吧安装NeoVim相对于vim来说,neovim更加现代化,配置也更加友好。而且之前vim相关配置可以很容易的就移植到neovim上。对于mac平台来说,可以使用homebrew来安装brew install neovim对于linux平台来说,neovim支持现有的软件包管理工具,例如针对debian及其衍生系统来说可以使用apt install neovim对于其他发行版Linux来说,请参考neovim的官方网站来确定如何安装针对windows平台,可以使用// 使用Scoop scoop install neovim // 或者chocolatey choco instal neovim然后可以在终端中使用nvim 来打开,但是由于我之前大量使用vim,在习惯上仍然喜欢输入vim启动,因此这里我使用别名来将vim映射为nvimalias vim='nvim'使用vimrc进行基本的设置刚开始为了后面使用方便,需要对vim进行一些基础配置,这里的配置也是为了日后更好的使用vim相关功能而必须要进行的配置macOS 和 Linux上neovim配置文件位于~/.config/nvim/init.lua,Windows上的配置文件位于C:/User/用户/AppData/Local/nvim/init.lua。这里我们也可以将文件名改为init.vim这样我们可以使用vimscript,.lua可以使用lua语言进行配置。这里给出vimscript和lua的最基础的配置" vimrc 配置 set number "设置行号 syntax on " 打开语法高亮 set relativenumber "设置相对行号 set nocompatiable "设置与vi不兼容 set wrap "设置自动换行 set ruler "设置右侧底部显示输入命令 set incsearch "设置搜索高亮-- lua配置 vim.o.syntax = "enable" vim.o.relativenumber = true vim.o.wrap = true vim.o.ruler = true vim.o.incsearch = true好了,这次就到这里结束了。不要着急,这只是一个开胃菜,后面将陆续介绍相关技巧
2022年04月08日
6 阅读
0 评论
1 点赞
2022-04-04
vim 从嫌弃到依赖(0)——概述
最近我想开一个新的系列,记录我使用vim的相关心得。初次接触vim是在大学操作系统实践课程中,跟着Linux一块进行学习的。当初我是百般嫌弃它的,想要进行编辑还要按下其他键,我想要移动光标居然还的切换到普通模式下,这些种种我一直认为是反人类的。后来经过无数次的尝试、放弃、再尝试的过程,如今我已经离不开它了,不管用何种编辑器、用何种IDE,我首先会找是否有相关的vim模拟插件。这个文章标题也是我使用vim的心路历程,我采用这个标题,也是希望我写出来的文章,能给我的读者带来一些帮助,使各位读者也能像我一样从恶语相向到爱不释手。当我们在谈论vim的时候我们在谈什么什么是vim?通过各种百科它会告诉你vim是由vi发展而来的,然后会告诉你vim分为好几个模式,给出一堆命令,例如如何移动光标、如何切换模式、如何搜索等等一系列vim命令。但是这些仅仅只是皮毛上的东西,远远无法告诉我们,为什么要选择vim。我觉得当我们谈论vim的时候,应该要谈论如何使用vim提高编程的效率,一般来说是指快速定位代码,快速修改代码、避免一些繁琐的重复工作等等一系列方式来提升工作效率。以达到编程的速度跟得上思维的速度,即快速将脑海中的想法通过代码展示出来。所以我这里不打算像一般的vim教程那样上来就是一堆命令,告诉你如何进行普通的文本编辑。或者告诉你该使用哪些插件来扩展你的vim,让它像某某编辑器一样好用。以我来看,这些都是邪路,有那个时间去折腾如何将vim变成某某IDE,不如直接使用那个IDE,还能节省大量时间。如果仅仅停留在了解vim的基本命令,将vim作为记事本来使用,那么vim也就失去了它的价值。vim的操作逻辑不管使用何种工具来编写文本,键盘操作总是比鼠标要高效的,即使是使用word和excel完成工作的人,熟练使用各种快捷键的总是会比使用鼠标点选各种功能的要快的多,但是像word、excel或者其他IDE来说,功能实在太多,这样就导致需要映射的快捷键过多,很快键盘上的键就不够用了,这个时候部分编辑器选择只映射常用的,而另外的编辑器则选择增加快捷键的层数,一层不够就两层、两层不够久三层,这个emacs就是典型的例子。而vim为了有效键位映射到足够多的快捷键上,使用了各种模式,各种模式相互独立,完成不同的工作,这样有几个好处:在普通模式下,键盘上的键不再作为输入键,可以针对常见操作进行键位优化,不用长时间按住ctrl了可以提供更多功能,可以方便的进行扩展,基本最顺手的键位就是最常用的键位关于vim的一些说法1. vim上手难度高,学习曲线陡峭vim其实学起来并不难,很多人觉得难主要是因为:vim官方的教程又臭又长,以它来作为学习的资料,在初期会显的啰嗦,而且很多内容不知道该如何在日常中去运用,导致理论与实践脱节vim 中有大量的快捷键、模式要记忆,很难像普通编辑器那样开箱即用vim编辑器的逻辑与其他不同,需要长时间练习以便形成肌肉记忆vim有众多插件,而且插件文档质量参差不齐。很多文档都没介绍使用它能带来如何的效率提升2. vim不如其他编辑器(不如emacs、不如visual studio code)很多人都说vim是上个世纪的老古董,不如现如今一些现代编译器好用。从某种程度上来看,确实是对的,毕竟世面上有那么多的如何将你的vim变成visual studio code、变成idea等等一系列教程。但是还是那句话,我们学习vim并不是学习如何查找、下载、配置各种插件,万物都用vim来进行。而是取其精华,学习它一整套操作逻辑,以便提升自己的编码效率。至于像调试、一键部署、等等操作,这个都不是vim擅长的。记住vim擅长的仅仅只有文本编辑而已。3. 学习vim浪费时间现在有很多很好用的IDE,他们提供了例如代码补全、代码跳转等一系列好用的功能,而最原始的vim无法提供这些功能,得折腾一些配置和插件才能勉强达到其他IDE 60%到70%的功能。vim已经没必要学习了。作为程序员,应该时刻想着如何偷懒,如何提高个人工作效率,以便早早完成工作,按时下班,保证充足的摸鱼时间。为了这个目标,就有必要稍微花点时间研究如何提升如何使用现有工具,如何更好的使用现有的IDE。而vim作为现在业界公认的文本输入的最佳效率工具,对于想提升自己编码速度的程序员来说,很有必要花时间研究、学习它。最后一些说明本教程致力于通过vim的学习,学会一些高效的文本操作术。如何使用一些技巧来提升输入效率。而不会讲述如何将vim配置成ide。本教程合适一些有编程经验,而不是刚入门的编程萌新,对于刚入门编程的萌新来说,现阶段最要紧还是巩固相关基础。由于本人用macos做主力机,所以本教程将采用macos作为演示,针对Windows上的用户,有些操作可能跟windows自身快捷键冲突,或者Windows vim本身的问题,导致有些操作不支持的,目前我也不太清楚。就写作之时,使用的vim为neovim。好了开坑相关说明已经完成,后面就是正式进入vim之旅了。。。。
2022年04月04日
8 阅读
0 评论
1 点赞
1
2
3