vim使用技巧

ops/2025/2/7 6:28:28/

1,使用内置帮助(built-in help)

使用 vim 的内置帮助是一个好习惯(虽然很多朋友更喜欢在网上搜索相关的使用方法)。查看帮助的语法如下表格所示:

前缀例子说明
::help :w有关 :w 命令的帮助
none:help j有关“j”键在正常模式上下文中的帮助
v_:help v_J有关在上下文中使用“J”键到视觉模式的帮助
i_:help i_<Esc>有关在上下文中使用“Esc”键插入模式的帮助
/:help /\n有关搜索模式“\n”的帮助

2,以普通用户身份打开,以 root 用户身份保存

在编辑系统文件或者受权限保护的文件的时候,很容易会忘记在 vim 编辑之前添加 sudo,这样将会以只读模式打开文件,也就是编辑后不能保存。

但是这时候,你可能已经对文件做了一些修改(尚未保存),很显然,强制退出不是一个好选择。

在这些情况下,在 vim 中键入以下命令:

:w !sudo tee %

键入此命令后,将要求您输入sudo命令的密码,然后文件就可以保存了。

注:我们应该使用 sudoedit 命令而不是 sudo vim 来编辑需要超级用户权限的文件。

我们将上述命令拆解来看下:

  • :w - 这是写入命令。由于没有给出参数,vim 将把整个文件写入标准输出;

  • !sudo - 将 sudo 命令作为 shell 命令而不是 vim 命令运行;

  • tee - tee命令用于读取标准输入并将其写入标准输出或文件;

  • % - vim 将其替换为您正在编辑的当前文件的名称。

:w 命令将整个文件写入 STDOUT(标准输出);然后,我们使用sudo命令(因为我们编辑的毕竟是一个系统文件)来获得临时权限。

百分号(%)表示文件名,tee 命令从 STDOUT 获取 vim 的输出并将其写入 % 文件。

这基本上适用于 <Vim's STDOUT> | sudo tee /etc/ssh/sshd_config,有点复杂...

 

3,将所有空格转为制表符(或者反过来)

我们都喜欢使用制表符(tab)或者空格,但是,如果我们正在编辑的文本其缩进使用的符号正好与我们的习惯相反,该怎么办?

3.1 将所有空格转换为制表符

如果当前文件使用空格缩进文本,希望将它们转换为制表符时,需要运行如下两个 vim 命令:

:set noexpandtab:retab!

这样做会将所有空格转换为其等效的制表符。如果文档使用两个空格作为缩进宽度,它们将转换为1个制表符。如果 4 个空格用作单个缩进宽度时,这 4 个制表位将替换为 1 个制表字符。

3.2 将所有制表符转换为空格

如果要编辑的文件使用制表符缩进,并且要将制表符转换为空格,则需要运行如下4个 vim 命令:​​​​​​​

:set expandtab:set tabstop=4:set shiftwidth=4:retab

第一个命令(expandtab)告诉 vim 使用空格展开 tab,第二个命令(tabstop)设置使用多少个空格用作一个“缩进块”。

在我们的例子中,我们定义了“1个tab=4个空格”;当使用>>运算符时,shiftwidth 命令用于控制缩进,这也被设置为4个空格。

最后,retab 命令将所有制表符(用于缩进)转换为空格。

4,缩进所有行

错误的缩进,在 python 或者 YAML 程序中会报错,导致程序不能正确运行。

要缩进所有行,按 gg 键到达文件顶部,然后按 = 键表示“缩进”,最后按 G 键表示到“最后一行”。

这样将会自动缩进,从第一行到最后一行。

如下图所示,我使用 :gg=G命令缩进的演示:

图片

正如你所看到的(从这个有限的预览中),所有行都正确缩进。

5,粘贴代码时保留缩进

我们都有过在互联网上复制代码的时候。当将代码粘贴到文件中时,缩进都给弄乱了,这时候需要怎样做呢?

为了避免这种情况,请在 .vimrc 文件中添加以下代码:

set pastetoggle=<F2>

vimrc 文件进行如上更改后,在粘贴代码之前按 F2 键,这样做将确保代码粘贴正确的缩进。

6,保存文件前显示差异

我们可能遇到过这样的情况:我修改了这个文件,但是忘记都做了哪些修改了,并且我担心其中有些地方可能修改错了。

解决此问题的方法是查看缓冲区和文件之间的差异。可在 vim 中执行如下命令:

:w !diff % -

我们将上述命令拆解来看:

  • :w  用于保存/写入,在这个特定场景中,如果命令中没有指定文件名,则输出将写入STDIN(标准输入)文件;

  • :!<command>  是执行 shell 命令的语法,在这个例子中,我们在 shell 中运行 diff 命令;

  •  表示未修改的当前文件的名称;试试这个::!echo %

  • - 是 diff 命令的 STDIN 文件。

因此,该命令首先将所有[未保存]内容写入STDIN文件。然后diff命令读取当前文件(%)并将其与STDIN(-)文件进行比较。

这个命令大致等同于这个shell命令:diff <original-file> <Vim's STDOUT>

8,显示拼写错误

我们应该都使用过 Microsoft word,其拼写检查器在拼写错误的单词下会有一条红色的波浪线。

vim 也内置了拼写检查器,但默认情况下是关闭的。我们可以使用如下命令启用它:

:set spell

这样,你可能会看到拼写错误的单词被突出显示,其突出显示的方式取决于你的 vim 颜色方案。我在拼写错误的单词下面有一条白色下划线,如下图所示:

图片

要将这设置为 vim 的默认,可在 .vimrc 文件中添加如下配置:

set spell

9,在插入模式下删除文本

我们都知道,在正常模式(normal mode)下,可以使用 d 和 x 键删除文本,那么在插入模式下如何执行相同的操作(比如 dd)呢?

以下是常用的一些方案:

  • ctrl + w 删除前一个单词(字)(相当于正常模式下的 db);

  • ctrl + h 删除前一个字符;

  • ctrl  + u 删除当前行所有前面的字符(相当于正常模式下的 d0 );

  • ctrl  + k 删除当前行中所有主要字符(相当于正常模式下的 d$)。


http://www.ppmy.cn/ops/45932.html

相关文章

ubuntu 18.04 ros1学习

总结了一下&#xff0c;学习内容主要有&#xff1a; 1.ubuntu的基础命令 pwd: 获得当前路径 cd: 进入或者退出一个目录 ls:列举该文件夹下的所有文件名称 mv 移动一个文件到另一个目录中 cp 拷贝一个文件到另一个目录中 rm -r 删除文件 gedit sudo 给予管理员权限 sudo apt-…

关系数据库:关系运算

文章目录 关系运算并&#xff08;Union&#xff09;差&#xff08;Difference&#xff09;交&#xff08;Intersection&#xff09;笛卡尔积&#xff08;Extended Cartesian Product&#xff09;投影&#xff08;projection&#xff09;选择&#xff08;Selection&#xff09;除…

深度学习之梯度缩放介绍

混合训练&#xff08;Mixed Precision Training&#xff09;是一种优化深度学习模型训练过程的技术&#xff0c;其中梯度缩放&#xff08;Gradient Scaling&#xff09;是混合训练中常用的一项技术。 在深度学习中&#xff0c;梯度是用于更新模型参数的关键信息。然而&#xff…

如何在 JavaScript 中检查空字符串、未定义和 null 值?

在 JavaScript 编程中,遇到空字符串、未定义(undefined)或 null 值是相对常见的情况。为了确保代码的鲁棒性与稳定性,我们需要准确地识别这些值。本文将详细探讨识别空字符串、未定义和 null 值的方法,同时讨论其区别和应用场景。 什么是 “空字符串”、“未定义” 和 “…

python 第一天

循环打印 while循环 languages ["Regional Assembly Language","Autocode","FORTRAN","IPL (LISP的先驱)","FLOW-MATIC (COBOL的先驱)","COMTRAN (COBOL的先驱)","LISP","ALGOL 58","F…

深度学习入门

文章目录 深度学习基础前言深度学习应用计算机视觉 神经网络基础得分函数 f(x,W)损失函数Softmax分类器前向传播反向传播神经网络整体架构过拟合的解决办法激活函数 深度学习基础 前言 机器学习流程&#xff1a; 数据获取特征工程建立模型评估与应用 特征工程的作用&#x…

RabbitMQ(Direct 订阅模型-路由模式)的使用

文章目录 RabbitMQ&#xff08;Direct 订阅模型-路由模式&#xff09;一&#xff0c;Direct 订阅模型-路由模式介绍&#xff08;Routing&#xff09;二&#xff0c;使用1.添加依赖2.修改配置文件3.创建配置类4.注入RabbitMQ模版引擎5.消息的发送6.消息的接收(监听)7.设置回调函…

Java大厂面试题第2季

一、本课程前提要求和说明 面试题1&#xff1a; 面试题2&#xff1a; 面试题3&#xff1a; 面试题4&#xff1a; 面试题5&#xff1a; 高频最多的常见笔试面试题目 ArrayList HashMap 底层是什么东东 JVM/GC 多线程与高并发 java集合类