Editors(Vim)

文章目录

  • Editors(Vim)
    • 学哪一个编辑器?
    • [Philosophy of Vim](#Philosophy of Vim)
    • [Modal editing 模态编辑](#Modal editing 模态编辑)
    • [Basics 基础知识](#Basics 基础知识)
      • [Inserting text 插入文本](#Inserting text 插入文本)
      • [Buffers, tabs, and windows 缓冲区、选项卡和窗口](#Buffers, tabs, and windows 缓冲区、选项卡和窗口)
      • [Command-line 命令行](#Command-line 命令行)
    • [Vim's interface is a programming language. Vim的接口是一种编程语言](#Vim’s interface is a programming language. Vim的接口是一种编程语言)
    • Demo
    • [Customizing Vim](#Customizing Vim)
    • [Extending Vim 扩展Vim](#Extending Vim 扩展Vim)
    • [Vim-mode in other programs](#Vim-mode in other programs)
    • [Advanced Vim](#Advanced Vim)
      • [Search and replace 搜索和替换](#Search and replace 搜索和替换)
      • [Multiple windows](#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 甚至避免使用方向键,因为它需要太多的移动。

最终的结果是一个可以与你的思考速度相匹配的编辑器。

vim 的设计理念是,程序员的大量时间花在阅读、导航和进行小的编辑上,而不是编写冗长的文本流。因此,Vim有多种操作模式。

  1. Normal:正常模式,用于移动文件和编辑
  2. Insert:插入模式,插入文本
  3. Replace:替换模式,替换文本
  4. Visual (plain, line, or block):可视模式(普通、行或块),用于选择文本块
  5. 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 / N for navigating matches

Chinese:

  • 基本动作: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的编辑命令也称为"动词",因为动词作用于名词。

  • i enter Insert mode
    • but for manipulating/deleting text, want to use something more than backspace
  • o / O insert line below / above
  • d{motion} delete {motion}
    • e.g. dw is delete word, d$ is delete to end of line, d0 is delete to beginning of line
  • c{motion} change {motion}
    • e.g. cw is change word
    • like d{motion} followed by i
  • x delete character (equal do dl)
  • s substitute character (equal to cl)
  • Visual mode + manipulation
    • select text, d to delete it or c to change it
  • u to undo, <C-r> to redo
  • y to copy / "yank" (some other commands like d also copy)
  • p to 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实现的一个错误代码:

python 复制代码
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文件:

bash 复制代码
set editing-mode vi

通过这个设置,例如,Python REPL将支持Vim绑定。

Advanced Vim

下面是一些示例,向您展示编辑器的强大功能。我们无法教会你所有这些东西,但你会在学习的过程中学会它们。一个很好的启发式方法:每当你使用编辑器时,你认为"一定有更好的方法",可能有这样的方法:在网上查找。

: s (substitute) command (documentation).

  • %s/foo/bar/g
    • 在全局文件中将foo替换为bar
  • %s/\[.*\](\(.*\))/\1/g
    • 将命名的Markdown链接替换为普通url

Multiple windows

  • :sp / :vsp to 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)

相关推荐
哑巴湖小水怪3 小时前
WPS宏编辑器开发,单元格内容变更自动触发事件
java·编辑器·wps
哟哟耶耶1 天前
vscode-相关自用插件(倒计时,时间显示,编码对齐,css等编码颜色,简体中文,git提交相关,vue项目)
ide·vscode·编辑器
冷心笑看丽美人1 天前
RHEL 网络配置(Linux网络服务器 09)
linux·运维·服务器·网络·bash
日晨难再1 天前
C语言&Python&Bash:空白(空格、水平制表符、换行符)与转义字符
linux·c语言·开发语言·python·bash
CodeCraft Studio1 天前
【实用技能】ASP.NET Core:在同一个 Razor 视图中使用文档编辑器和查看器
编辑器·asp.net
F l e1 天前
Linux基础(十四)——BASH
linux·chrome·bash
dllmayday1 天前
VSCode 多工程联合调试
ide·vscode·编辑器
霖雨1 天前
使用Visual Studio Code 快速新建Net项目
java·ide·windows·vscode·编辑器
m0_519523102 天前
Linux——简单认识vim、gcc以及make/Makefile
linux·运维·vim
Daorigin_com2 天前
如何从数字化迈向智能化的跨越,重塑企业合同管理的未来
搜索引擎·计算机视觉·数据挖掘·vim·信号处理·sklearn·测试覆盖率