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)

相关推荐
叶落阁主5 小时前
Neovim 插件 i18n.nvim 介绍
java·vue.js·vim
数字冰雹5 小时前
“图观”端渲染场景编辑器
人工智能·编辑器
云梦谭6 小时前
Cursor 编辑器:面向 AI 编程的新一代 IDE
ide·人工智能·编辑器
Lynnxiaowen7 小时前
今天继续昨天的正则表达式进行学习
linux·运维·学习·正则表达式·云计算·bash
ONLYOFFICE20 小时前
【技术教程】如何将ONLYOFFICE文档集成到使用Spring Boot框架编写的Java Web应用程序中
java·spring boot·编辑器
抓饼先生1 天前
Linux control group笔记
linux·笔记·bash
Blue桃之夭夭1 天前
Visual Studio Code设置个性化背景教程
ide·vscode·编辑器
代码AC不AC1 天前
【Linux】vim工具篇
linux·vim·工具详解
bug攻城狮1 天前
彻底禁用 CentOS 7.9 中 vi/vim 的滴滴声
linux·运维·服务器·centos·vim
kevin_cat1 天前
微信群机器人-备份文件发送通知
git·bash·企业微信