Editors(Vim)
文章目录
- Editors(Vim)
- 学哪一个编辑器?
- Vim
- Philosophy of Vim
- Modal editing 模态编辑
- Basics 基础知识
- Inserting text 插入文本
- Buffers, tabs, and windows 缓冲区、选项卡和窗口
- Command-line 命令行
- Vim’s interface is a programming language. Vim的接口是一种编程语言
- Movement
- Selection
- Edits
- Counts
- Modifiers
- Demo
- Customizing Vim
- Extending Vim 扩展Vim
- Vim-mode in other programs
- Shell
- Readline
- Advanced Vim
- Search and replace 搜索和替换
- Multiple windows
- Macros
- Resources
Editors(Vim)
写英语单词和写代码是完全不同的活动。在编程时,你需要花费更多的时间来切换文件、读取、浏览和编辑代码,而不是编写一个冗长的流。所以有不同类型的程序用于编写英语单词和代码(例如Microsoft Word和Visual Studio code)是有道理的。
作为程序员,我们大部分时间都在编辑代码,所以花时间掌握适合你需求的编辑器是值得的。学习新编辑器的方法如下:
- 以教程开始(即本讲座,加上我们指出的资源)
- 坚持使用编辑器来满足你所有的文本编辑需求(即使它一开始会拖慢你的速度)
- 边做边查:如果看起来应该有更好的方法来做某事,那么这就是
如果您遵循上述方法,完全致力于将新程序用于所有文本编辑目的,则学习复杂文本编辑器的时间线如下所示。在一两个小时内,你将学习基本的编辑器功能,例如打开和编辑文件,保存/退出,以及浏览缓冲区。一旦你工作了20小时,你的速度应该和你以前的编辑一样快。之后,好处开始了:你将有足够的知识和肌肉记忆,使用新的编辑器可以节省你的时间。现代文本编辑器是花哨而强大的工具,所以学习永远不会停止:你会学得更快。
学哪一个编辑器?
程序员对他们的文本编辑器有很强烈的自己的看法。
哪些编辑现在很受欢迎?请参阅Stack Overflow的调查(可能有一些偏见,因为Stack Overflow用户可能不能代表整个程序员)。Visual Studio Code是最受欢迎的编辑器。Vim是最流行的基于命令行的编辑器。
Vim
本课程的所有讲师都使用 vim 作为他们的编辑器。 vim 拥有丰富的历史;它起源于 vi 编辑器(1976),并且至今仍在开发中。 vim 背后有一些非常巧妙的想法,因此,许多工具支持 vim 仿真模式(例如,140万人已经为VS code安装了Vim仿真)。即使您最终切换到其他文本编辑器, vim 也可能值得学习。
在50分钟内讲完 vim 的所有功能是不可能的,所以我们将专注于解释 vim 的思想,教给您基础知识,展示一些更高级的功能,并为您提供掌握该工具的资源。
Philosophy of Vim
编程时,你的大部分时间都在阅读/编辑,而不是写作。出于这个原因, vim 是一个模态编辑器;它具有插入文本和操作文本的不同模式。 vim 是可编程的(使用Vimscript和其他语言,如Python),而且 vim 的界面本身是一种编程语言;击键(使用易于记忆的名称)是命令,这些命令是可组合的。 vim 避免使用鼠标,因为它太慢了; vim 甚至避免使用方向键,因为它需要太多的移动。
最终的结果是一个可以与你的思考速度相匹配的编辑器。
Modal editing 模态编辑
vim 的设计理念是,程序员的大量时间花在阅读、导航和进行小的编辑上,而不是编写冗长的文本流。因此,Vim有多种操作模式。
- Normal:正常模式,用于移动文件和编辑
- Insert:插入模式,插入文本
- Replace:替换模式,替换文本
- Visual (plain, line, or block):可视模式(普通、行或块),用于选择文本块
- Command-line:命令行模式,运行命令
在不同的操作模式下,击键有不同的含义。例如,字母x在插入模式下只会插入一个文字字符 'x ',但在普通模式下,它会删除光标下的字符,而在可视模式下,它会删除选区。
在默认配置中, vim 在左下角显示当前模式。初始/默认模式为普通模式。通常大部分时间都在普通模式和插入模式之间。
你可以通过按 <ESC>(逃逸键)来改变模式,从任何模式切换回正常模式。从普通模式,进入插入模式用 i,替换模式用 R,可视模式用v,显示行模式用V,显示块模式用 <C-v> (Ctrl-V,有时也写^ V),命令行模式用 :。
在使用Vim时,你经常使用 <ESC> 键:考虑重新映射Caps Lock以转义(macOS指令)。
Basics 基础知识
Inserting text 插入文本
从正常模式,按 i 进入插入模式。现在,vim 的行为与任何其他文本编辑器一样,直到您按下以返回正常模式。这些,加上上面解释的基础知识,就是开始使用 vim 编辑文件所需要的全部(如果您花费所有时间从插入模式编辑,不是特别高效)。
Buffers, tabs, and windows 缓冲区、选项卡和窗口
vim 维护一组打开的文件,称为“缓冲区”。一个 vim 会话有多个选项卡,每个选项卡有多个窗口(分割窗格)。每个窗口显示一个缓冲区。与你熟悉的其他程序(如web浏览器)不同,缓冲区和窗口之间并不是一对一的对应关系。窗口只是视图。给定的缓冲区可能在多个窗口中打开,甚至在同一个选项卡中。例如,这可以非常方便地同时查看文件的两个不同部分。
默认情况下,Vim打开时只有一个选项卡,其中包含一个窗口。
Command-line 命令行
在正常模式输入:可以进入命令模式。按下:,光标将跳转到屏幕底部的命令行。这种模式有很多功能,包括打开、保存和关闭文件,以及退出Vim。
:q退出(关闭窗口):w保存(“写入”):wq保存退出:e{文件名称}打开文件进行编辑:ls显示打开的缓冲区:help {topic}打开帮助:help:w为:w命令打开帮助:help w打开w移动的帮助
Vim’s interface is a programming language. Vim的接口是一种编程语言
vim 中最重要的想法是 vim 的界面本身是一种编程语言。键击(具有易于记忆的名称)是命令,这些命令组成。这使得高效的移动和编辑成为可能,尤其是当指令变成肌肉记忆时。
Movement
你应该花费大部分时间在普通模式下,使用移动命令来导航缓冲区。vim中的运动也被称为“nous”,因为它们指的是文本块。
- Basic movement:
hjkl(left, down, up, right)- Words:
w(next word),b(beginning of word),e(end of word)- Lines:
0(beginning of line),^(first non-blank character),$(end of line)- Screen:
H(top of screen),M(middle of screen),L(bottom of screen)- Scroll:
Ctrl-u(up),Ctrl-d(down)- File:
gg(beginning of file),G(end of file)- Line numbers:
:{number}<CR>or{number}G(line {number})- Misc:
%(corresponding item)- Find:
f{character},t{character},F{character},T{character}
- find/to forward/backward {character} on the current line
,/;for navigating matches- Search:
/{regex},n/Nfor navigating matchesChinese:
- 基本动作:hjkl(左、下、上、右)
- 单词:w(下一个单词),b(单词的开头),e(单词的结尾)
- 行数:0(行首),^(第一个非空字符),$(行尾)
- 屏幕:H(屏幕顶部),M(屏幕中部),L(屏幕底部)
- 滚动:Ctrl-u(上),Ctrl-d(下)
- 文件:gg(文件开始),G(文件结束)
- 行号::{number} or {number}G(行{number})
- 杂项:%(对应项)
- 查找:f{字符},t{字符},f{字符},t{字符}
- 在当前行中查找/前进/后退{字符}
- , /;用于导航匹配
- Search: /{regex}, n / n用于导航匹配
Selection
Visual modes:
Visual: v
Visual Line: V
Visual Block: Ctrl-v
Can use movement keys to make selection. 可以使用移动键进行选择。
Edits
你以前用鼠标做的所有事情,现在都可以用键盘来做了,编辑命令和移动命令一起组成。这就是Vim的界面开始看起来像编程语言的地方。Vim的编辑命令也称为“动词”,因为动词作用于名词。
ienter Insert mode- but for manipulating/deleting text, want to use something more than backspace
o/Oinsert line below / aboved{motion}delete{motion}- e.g.
dwis delete word,d$is delete to end of line,d0is delete to beginning of line
- e.g.
c{motion}change{motion}- e.g.
cwis change word - like
d{motion}followed byi
- e.g.
xdelete character (equal dodl)ssubstitute character (equal tocl)- Visual mode + manipulation
- select text,
dto delete it orcto change it
- select text,
uto undo,<C-r>to redoyto copy / “yank” (some other commands like d also copy)pto paste- Lots more to learn: e.g. ~ flips the case of a character
Counts
你可以将名词和动词与count结合起来使用,它将执行给定的操作若干次。
- 3w move 3 words forward
- 5j move 5 lines down
- 7dw delete 7 words
向前移动3个单词
向下移动5行
删除7个单词
Modifiers
你可以用修饰语来改变名词的意思。有些修饰符是i,表示“内部”或“内部”,a表示“周围”。
ci(更改当前括号内的内容ci[更改当前方括号内的内容da'删除单引号字符串,包括括起来的单引号
Demo
下面是fizz buzz实现的一个错误代码:
def fizz_buzz(limit):for i in range(limit):if i % 3 == 0:print('fizz')if i % 5 == 0:print('fizz')if i % 3 and i % 5:print(i)def main():fizz_buzz(10)
我们将修复以下问题:
- 不调用Main
- 从0开始,而不是1
- 将“fizz”和“buzz”打印在单独的行上,表示为15的倍数
- 为5的倍数打印fizz
- 使用硬编码的参数10代替命令行参数
请查看演示视频。比较一下如何使用Vim进行上述更改,以及如何使用另一个程序进行相同的编辑。请注意,在Vim中几乎不需要敲击键盘,这使您能够以您认为的速度进行编辑。
Customizing Vim
Vim是通过~/中的一个纯文本配置文件定制的。vimrc(包含Vimscript命令)。可能有很多你想打开的基本设置。
我们提供了一个文档完备的基本配置,您可以将其用作起点。我们推荐使用它,因为它修复了vim的一些古怪的默认行为。在这里下载我们的配置并保存到~/.vimrc。
Vim是高度可定制的,值得花时间探索定制选项。你可以在GitHub上查看人们的dotfile来获得灵感,例如,你的导师的Vim配置(Anish, Jon(使用neovim), Jose)。关于这个话题也有很多不错的博客文章。尽量不要复制粘贴别人的全部配置,而是阅读、理解它,并获取你所需要的。
Extending Vim 扩展Vim
有大量的插件可以扩展Vim。与您可能在互联网上找到的过时建议相反,您不需要使用Vim的插件管理器(从Vim 8.0开始)。相反,你可以使用内置的包管理系统。只需创建目录~/。Vim /pack/vendor/start/,并将插件放在那里(例如通过git clone)。
下面是一些我们最喜欢的插件:
ctrlp。模糊文件查找器
ack。Vim:代码搜索
Nerdtree:文件管理器
Vim-easymotion:魔术动作
我们尽量避免给出一个过于冗长的插件列表。你可以查看讲师的dotfiles (Anish, Jon, Jose),看看我们使用的其他插件。查看Vim Awesome以获取更多令人敬畏的Vim插件。关于这个主题的博客文章也很多:搜索“最佳Vim插件”就可以了。
Vim-mode in other programs
许多工具支持Vim仿真。质量从好到好不等;根据工具的不同,它可能不支持更花哨的Vim功能,但大多数功能都很好地涵盖了基础知识。
Shell
如果你是Bash用户,请使用set -o vi。如果你使用Zsh,请使用bindkey -v。对于鱼,使用fish_vi_key_bindings。此外,无论使用什么shell,都可以export EDITOR=vim。这是一个环境变量,用于决定当程序想要启动一个编辑器时启动哪个编辑器。例如,git将使用这个编辑器来处理提交消息。
Readline
许多程序使用GNU Readline库作为命令行界面。Readline也支持(基本)Vim模拟,可以通过将以下行添加到~/。inputrc文件:
set editing-mode vi
通过这个设置,例如,Python REPL将支持Vim绑定。
Advanced Vim
下面是一些示例,向您展示编辑器的强大功能。我们无法教会你所有这些东西,但你会在学习的过程中学会它们。一个很好的启发式方法:每当你使用编辑器时,你认为“一定有更好的方法”,可能有这样的方法:在网上查找。
Search and replace 搜索和替换
: s (substitute) command (documentation).
%s/foo/bar/g- 在全局文件中将foo替换为bar
%s/\[.*\](\(.*\))/\1/g- 将命名的Markdown链接替换为普通url
Multiple windows
:sp / :vspto split windows- 同一个缓冲区可以有多个视图。
Macros
- q{character} to start recording a macro in register {character}
- q to stop recording
- @{character} replays the macro
- Macro execution stops on error
- {number}@{character} executes a macro {number} times
- Macros can be recursive
- first clear the macro with q{character}q
- record the macro, with @{character} to invoke the macro recursively (will be a no-op until recording is complete)
- Example: convert xml to json (file)
- Array of objects with keys “name” / “email”
- Use a Python program?
- Use sed / regexes
- g/people/d
- %s//{/g
- %s/(.*)</name>/“name”: “\1”,/g
- …
- Vim commands / macros
- Gdd, ggdd delete first and last lines
- Macro to format a single element (register e)
- Go to line with
- qe^r"f>s": “f<C”q
- Macro to format a person
- Go to line with
- qpS{j@eA,j@ejS},q
- Macro to format a person and go to the next person
- Go to line with
- qq@pjq
- Execute macro until end of file
- 999@q
- Manually remove last , and add [ and ] delimiters
Resources
vimtutor is a tutorial that comes installed with Vim - if Vim is installed, you should be able to run vimtutor from your shell
Vim Adventures is a game to learn Vim
Vim Tips Wiki
Vim Advent Calendar has various Vim tips
Vim Golf is code golf, but where the programming language is Vim’s UI
Vi/Vim Stack Exchange
Vim Screencasts
Practical Vim (book)
相关文章:
Editors(Vim)
文章目录 Editors(Vim)学哪一个编辑器?Vim Philosophy of VimModal editing 模态编辑Basics 基础知识Inserting text 插入文本Buffers, tabs, and windows 缓冲区、选项卡和窗口Command-line 命令行 Vim’s interface is a programming language. Vim的接口是一种编…...
【Leetcode】134.加油站
一、题目 1、题目描述 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 给定两个整数数组 gas 和 cost,如果你…...
设计模式-建造者(生成器)模式
文章目录 简介建造者模式的核心概念产品(Product)建造者(Builder)指挥者(Director)建造者模式与其他设计模式的关系工厂模式和建造者模式uml对比 建造者模式的实现步骤建造者模式的应用场景spring中应用 建…...
内存泄露排查思路
1、泄露情况 启动闪退运行一段时间宕机 2、排查步骤 获取堆内存快照dump使用VisualVM分析dump文件通过查看堆信息的情况,定位内存溢出问题 jmap -dump:formatb,fileheap.hprof pid -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath输出路径 3、在VisualVM中分…...
kafka学习-概念与简单实战
目录 1、核心概念 消息和批次 Topic和Partition Replicas Offset broker和集群 生产者和消费者 2、开发实战 2.1、消息发送 介绍 代码实现 2.2、消息消费 介绍 代码实现 2.3、SpringBoot Kafka pom application.yaml KafkaConfig producer consumer 1、核心…...
爬虫进阶-反爬破解5(selenium的优势和点击操作+chrome的远程调试能力+通过Chrome隔离实现一台电脑登陆多个账号)
目录 一、selenium的优势和点击操作 二、chrome的远程调试能力 三、通过Chrome隔离实现一台电脑登陆多个账号 一、selenium的优势和点击操作 1.环境搭建 工具:Chrome浏览器chromedriverselenium win用户:chromedriver.exe放在python.exe旁边 MacO…...
音视频编码格式-AAC ADT
例子:config 1408 1408(16进制) : 0001 0100 0000 1000 audioObjectType(5bit)为 00010 , 即 2, profie (audioObjectType -1 ) AAC LC samplingFrequencyIndex (4bit) 为 1000 , 即 8 , 对应的采样频率为 16000 channelConfiguration (…...
【计算机网络】网络编程接口 Socket API 解读(3)
Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。 本文讲述的 socket 内容源自 Linux 发行版 centos 9 上的 man 工具,和其他平台(比如 os-x …...
kafka知识小结
1.为什么分区数只能增加,不能减少? 按照Kafka现有的代码逻辑而言,此功能完全可以实现,不过也会使得代码的复杂度急剧增大。 另外实现此功能需要考虑的因素很多,比如删除掉的分区中的消息该作何处理? 如果随着分区一起消失则消息的可靠性得不到保障; 如果需要保留则又需…...
算法刷题记录-DP(LeetCode)
746. Min Cost Climbing Stairs 代码 int minCostClimbingStairs(vector<int>& cost) {if (cost.size()<2){return 0;}int cache[cost.size()1];cache[0]0;cache[1]0;for (int i 2; i < cost.size(); i) {cache[i] min(cache[i-2]cost[i-2],cache[i-1]cost[i…...
Springboot整合Neo4J图数据库
1.引入依赖 JDK11, neo4J4.4.23 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.15</version><relativePath/> <!-- lookup parent …...
Unity 2018发布在iOS 16.3偶尔出现画面不动的问题
1)Unity 2018发布在iOS 16.3偶尔出现画面不动的问题 2)IL2CPP在Xcode下增量编译问题 3)帧同步实现PuppetMaster布娃娃系统的问题 这是第351篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等…...
蠕虫病毒流量分析案例
背景 某供排水集团的网络管理员对其网络的健康状况持认可态度,表示网络运行正常,没有发现异常行为。然而,由于网络环境变得越来越复杂,仅凭借传统的网络经验已经不能全面了解网络情况。因此,我们为供排水集团安装了Ne…...
Transformer(一)—— Attention Batch Normalization
Transformer详解 一、RNN循环神经网络二、seq2seq模型三、Attention(注意力机制)四、Transformer4.1 self attention4.2 self-attention的变形——Multi-head Self-attention4.3 Masked Attention4.4 Positional Encoding4.5 Batch Normalization4.6 Lay…...
2023高教社杯数学建模C题思路代码 - 蔬菜类商品的自动定价与补货决策
# 1 赛题 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此, 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…...
【C++漂流记】一文搞懂类与对象的封装
本篇文章主要说明了类与对象中封装的有关知识,包括属性和行为作为整体、访问权限、class与struct的区别、成员属性的私有化,希望这篇文章可以帮助你更好的了解类与对象这方面的知识。 文章目录 一、属性和行为作为整体二、访问权限三、class与struct的区…...
ctfshow 反序列化
PHP反序列化前置知识 序列化和反序列化 对象是不能在字节流中传输的,序列化就是把对象转化为字符串以便存储和传输,反序列化就是将字符串转化为对象 魔术方法 __construct() //构造,当对象new时调用 __wakeup() //执行unserialize()时&am…...
数据结构:线性表之-单向链表(无头)
目录 什么是单向链表 顺序表和链表的区别和联系 顺序表: 链表: 链表表示(单项)和实现 1.1 链表的概念及结构 1.2单链表(无头)的实现 所用文件 将有以下功能: 链表定义 创建新链表元素 尾插 头插 尾删 头删 查找-给一个节点的…...
为IT服务台构建自定义Zia操作
Zia是manageengine的商业人工智能助手,是ServiceDesk Plus Cloud的虚拟会话支持代理。使用Zia,您可以优化帮助台管理,还可以缩小最终用户与其帮助台之间的差距,Zia通过执行预配置的操作来帮助用户完成他们的服务台任务。 例如&…...
【C/C++】BMP格式32位转24位
问题 如题 解决方法 bmp文件格式参考:【C/C++】BITMAP格式分析_vc++ bitmap头文件_sunriver2000的博客-CSDN博客BITMAP文件大体上分成四个部分,如下表所示。文件部分长度(字节)位图文件头 Bitmap File Header14位图信息数据头 Bitmap Info Header40调色板 Palette4*n (n≥…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
