有多少种方式可以在vim 中插入行号--转

有多少种方式可以在vim 中插入行号

 




Next:  chap2,
Up:  Top

 

1 在文本中插入行号

最近有朋友提到某编辑器有一个可以插入行号的插件,问Vim有没有办法可以在文章中插入行号。%$^&*#8~#$@#!……让我们看一下有多少种方式可以在vim中插入行号或数字序列!

建议看一下Vim官网的这篇文章。里面一部分内容与这篇是重叠的。不过这篇是中文的XD。

我们的目的是在当前编辑文中的每一行前面加上行号或数字序列并用空格分隔,如:

这是第一行
这是第二行
	
这是第四行

在插入行号后将成为:

1 这是第一行
2 这是第二行
3
4 这是第四行

但有时我们需要对部分行编号。下面的例子是对第二行以后的所有非空行依次编号:

这是第一行
1 这是第二行
	
2 这是第四行
3 这是第五行

为了区别行号,我这里就称之为数字序列。

进入正题。

 




Next:  sec2,
Up:  Top

 

1.1 使用line()函数

 

相信这是大多数人第一个想到的解法了——使用line()函数产生行号用:s命令插入行号。

" 为所有行加上行号
" 使用合适的范围或者正则表达式就可以限定作用的范围。
:g/^/ s//\=line('.').' '/

 

优点是简单易用。缺点是不够灵活,只能用以显示指定行的行号。

 




Next:  sec3,
Previous:  sec1,
Up:  Top

 

1.2 使用ex命令

 

vim提供了一些可以打印行号的ex命令,如,"=", "p #" 和"#"。为了捕捉Vim的命令输出,我们用redir命令。

" 为前30行加上行号
:redir @a | 1,30# | redir END
:1,30d | put! a

 

逻辑上很容易理解:1,30#显示前30行及其行号。保存到寄存器a中,删掉前30行,再贴上寄存器的内容。

没什么明显优点的一种方法。缺点同上。如果不是更改当前编辑区的内容而是直接保存到新文件的话,这种方法就比其他的方法方便。

 




Next:  sec4,
Previous:  sec2,
Up:  Top

 

1.3 使用range()函数

 

range()是个新的函数,用来产生包含数字序列的列表。当然也可以用来生成行号:

" 为前30行加上行号
:for i in range(31)
:call setline(i,i .' '. getline(i))
:endfor

 

对range(),setline()的用法见帮助文档。

range()函数相对前面的2个解法而言要灵活许多,除可用以表示行号,也可以用来编数字序列,相应地也要求一些编程基础。

 




Next:  sec5,
Previous:  sec3,
Up:  Top

 

1.4 加法运算

 

这是也是简单灵活的一种解法。好吧,也许大家第一个想到的解法不是使用line()函数。

" 为所有行加上行号
:let i=1
:g/^/ s//\=i . ' '/ |let i=i+1

 

注意:g后面的两条命令(:s, :let)一定要写在一起。这是比较通用的一种编号方式,可以应付大部分的编号问题。

 




Next:  sec6,
Previous:  sec4,
Up:  Top

 

1.5 使用<CTRL-A>

 

Vim提供了Ctrl-A和Ctrl-X来分别对光标下(或者光标右边第一个)数字进行增、减操作。按Ctrl-A一次可加一,按Ctrl-X则是减一。如果你用的是Windows,那很有可能Ctrl-A已被映射成全选了。输入

:nunmap <C-A>

 

使之恢复功能,当然你可以用:nnoremap重新映射到其他键。赶紧翻出文档吧:

:h CTRL-A
:h CTRL-X
:h unmap
:h o_v

 

先看一下,普通模式下的操作步骤:

第一、手工添加第一行序号和空格。
第二、输入0"ayw将序号放到寄存器a。
第三、移到下一行并输入:

qq0"aP0^A"ayawjq

上面的命令将指令序列存进寄存器q。^A表示按Ctrl-A组合键。
第四、28@q对接下来的28行添加行号。

上面添加空格是很重要的步骤(因为我们使用了yaw复制数字和空格),这里解释一下第三步:

` qq
开始录制宏,并保存到寄存器q中
` 0
设定光标的位置到行首
` "aP
放上前面保存的序号和空格
` 0^A
回到行首并按Ctrl-A加一
` "ayaw
复制当前数字和空格到寄存器A
` jq
移到下一行(这样我们才能确保28@q是对下面的28行进行操作而不是对当前行操作28次),然后结束宏。

 

通过与:g指令配合可以对指定行编号。下面的例子对所有以字母开头的行进行编号。为了说明方便我们直接对寄存器赋值,效果与上面普通模式下的操作是一样的。注意下面两例操作中的^A的输入方法与上面直接按组合键的方法有所不同,先按Ctrl-V(不行的话试Ctrl-Q),再按Ctrl-A:

" 先重置a寄存器。
" 再对所有以字母开头的行编号
:let @a='0 '
" 去掉了j指令
:let @q='0"aP0^A"ayaw'
:g/^\a/ norm @q

 

如果你用的分隔符不是空格,可以对它进行手工标记:

" 这个例子使用冒号作为分隔符
:let @a=0
:let @q='0"aPa:^[0^Amm"ayv`m'
:g/^\a/ norm @q

 

^[的输入方法是依次按Ctrl-V, <ESC>键。这个例子中使用了mm对最后一个数字做记号,yv`m确保复制时也包括了最后一个数字本身。

宏指令是Vi最有力的工具之一,在Vim中宏则比以往更强大。宏并非完成此工作最有效率的解法,但写宏的乐趣要比其他的脚本来得多得多。这个解法经过修改一样可以适用多种情况,缺点是在写出一个可行的宏之前要经过多次地调试。

<!-- @section 使用字母替换 -->

 




Next:  sec7,
Previous:  sec5,
Up:  Top

 

1.6 利用Vim的编程支持

 

除了内建的Vim Script以外,Vim还提供了对四种脚本语言的“支持”,Perl、Python、Ruby和TCL(是五种Sorry,还有MzScheme)。这里的支持包括了可以直接在Vim的命令窗口中使用其他语言的语句;在其他语言中可以操纵Vim对象,使用Vim命令。这里给出perl和Python实现的脚本。

perl版本:

" 对前30行进行编号,默认范围是所有行
" perldo命令中的$_表示当前行
	
:1,30perldo $_=++$i . ' ' . $_;

 

Python版本:

" Python中vim.current.buffer是个只读列表对象,
" 所以只能替换列表中项的值而无法替换列表本身。
	
:python <<EOF
from vim import current
for i in range(len(current.buffer)):
   current.buffer[i]=str(i+1)+' '+current.buffer[i]
EOF

 

因为这四种脚本语言都是通用的编程语言,所以实际上可以完成任何形式的编号工作。缺点是这要求用户的Vim在编译时包含了相应的选项,同时(主要是Windows平台)还要另外装相应的脚本引擎。

 




Next:  chap2,
Previous:  sec6,
Up:  Top

 

1.7 外部命令

 

有许多的外部命令也可以用来完成这项工作,这里挑几个有代表性的。

下面的命令给出的是Windows下的版本(不过除findstr是XP自带的外,其他都是Linux下移过来的XD),将双引号改为单引号就可以在Linux下运行了。

1 :%!findstr /N "^"
2 :%!sed =|sed "N;s/\n/ /"
3 :%!diff --line-format=\%-dn\%L % -
4 :%!perl -pe "print ++$a . ' '" -
5 :%!python -c "import sys,fileinput as f;[sys.stdout.write(str(f.lineno())+a) for a in f.input()]"
6 ...
...
n  ....

 

这里做些补充说明:

` findstr
findstr是grep的MS实现,可以是Windows XP上找到。这里使用正则字元^来匹配所有行,使用N选项显示行号。入选理由是这是我能想到的Windows自带的除WSH外惟一能过滤文本并添加行号的命令行工具。
` sed
SED单行脚本快速参考。入选理由这是Vim的好搭档。
` diff
这里使用了diff的选项 –line-format%-dn表示行号,%L表示行的内容。Vim会将%转义成为当前文件所以格式中的两个%号要加上反斜杠转义。入选理由是Vim自己带了这个工具。
` perl
不用解释了吧。入选理由是Perl是最强大灵活的文本处理工具。
` python
这个脚本用了fileinput模块捕捉输入,用sys模块进行输出到stdout(在这里就是Vim的编辑区)。如果手中的Vim是没带Python的版本(所以不能用上面的:python命令)又出于某种未知原因想用Python,可以试一下。

 

此外还有awk,cat,grep,nl,… 等不再赘述。

这种解法的优点在于简单易用,缺点在于要有相应的外部程序。而灵活性则取决于所使用的工具。

 




Previous:  sec7,
Up:  Top

 

2 最后

 

可以看到添加行号对Vim来讲是小菜一碟。

考虑到Vim本身的脚本引擎及到其他编程语言的支持,在Vim实现某种功能在大部情况下是很容易的。Vim只需要负责显示逻辑,而文本处理的工作可以由外部的程序或脚本来完成。如果你觉得某个文本处理的功能在Vim中的实现要复杂得多时很多时,很可能还有其他的实现方式。

当然,肯定还有其他的方法可以实现在Vim中添加行号的目的。

Android 13 录音APK在后台无数据的处理 未获取到录音数据 阅读详情

相关推荐

【故障处理】- ORA-01722

在执行升级脚本@?/rdbms/admin/catupgrd.sql时报错ora-01722。

weixin_39099660的博客 830

Linux Vim增加行号

Linux Vim增加行号

3301 2538

基于全志T113的Linux下的RS485通信代码

本例程基于米尔电子MYD-YT113X(全志T113-S3)开发板,在其上跑通了Linux下的RS485串口通信(收发),并且具有阻塞和非阻塞两种模式供选择。例程已经过实测。可以移植到其它基于Linux环境的板子上,稍作硬件引脚修改即可。同时也是RS485阻塞/非阻塞模式的经典例程。

Vim生成递增递减的数字【记录器的使用】

vim

赵凯月的博客 4493

Vim列递增

一、VIM递增. 在1所在行,yy,100p。 进入命令行模式,输入如下命令: let i=1|g/1/s//\=i/|let i=i+1 要在每行前生成一个行号,怎么搞?按照刚才的思维,肯定还是要用到递增的理念,然后在啰嗦一句行首匹配符是^~~:let i=1|g/^/s//\=i/|let i=i+1 其实命令比较简单,简单解释一下: 1/  代表查找1

wangwenwen的专栏 6908

vim 中快速递增或生成一列数字技巧

https://zhuanlan.zhihu.com/p/597167871

weixin_44495082的博客 3878

vimvim编辑器如何设置行号

这条命令会让Vim在编辑器的左侧显示行号。通过这些方法,你可以根据自己的需求灵活地设置Vim中的行号显示。

专注音频,高效工作,快乐生活! 3043

[]Linux多少方式vim插入行号

.1 使用line()函数相信这是大多数人第一个想到的解法了——使用line()函数产生行号用:s命令插入行号。" 为所有行加上行号" 使用合适的范围或者正则表达式就可以限定作用的范围。:g/^/ s//\=line('.').' , '/ (加上, 号) 原文网址:http://blog.chinaunix.net/uid-26200547-id-3432605.html ...

gxl_ct001的专栏 286

多少方式可以在vim插入行号

多少方式可以在vim插入行号 Table of Contents 有多少方式可以在vim插入行号1 在文本插入行号 1.1 使用line()函数1.2 使用ex命令1.3 使用range()函数1.4 加法运算1.5 使用1.6 利用Vim编程支持1.7 外部命令 2 最后 Next: chap2, Up: Top 1 在文本插入

da895的专栏 1074

多少方式可以在vim插入递增的数字

Table of Contents 有多少方式可以在vim插入行号1 在文本插入行号 1.1 使用line()函数1.2 使用ex命令1.3 使用range()函数1.4 加法运算1.5 使用1.6 利用Vim编程支持1.7 外部命令1.8 其它方法 2 最后   Next: chap2, Up: Top   1 在文本插入

Secret Island 2万+

革命性Vim行号插件numbers.vim:智能切换相对与绝对行号的终极指南

作为一名Vim用户,你是否经常需要在相对行号和绝对行号之间手动切换?是否希望有一个智能的解决方案能够根据你的编辑模式自动调整行号显示方式?numbers.vim插件正是为你量身打造的终极解决方案!这个革命性的Vim行号插件能够智能地在相对行号和绝对行号之间切换,极大地提升你的编码效率和编辑体验。 ## 🚀 为什么需要智能行号管理? 在Vim编辑器中,行号显示对于代码导航和编辑至关重要。传统的

gitblog_00035的博客 912

Vim行号管理神器numbers.vim:从入门到精通的10个实用技巧

Vim行号管理神器numbers.vim是一款专为Vim编辑器设计的智能行号切换插件,它能根据编辑模式自动在相对行号和绝对行号之间智能切换,极大提升了代码编辑的效率和体验。无论你是Vim新手还是资深用户,掌握这个行号管理神器都能让你的编程工作流程更加流畅高效。 ## 🚀 为什么选择numbers.vim行号插件? numbers.vim的核心功能是智能切换相对行号和绝对行号。在普通模式下显示

gitblog_00517的博客 728

linux vi编译显示行号,Linux系统vi或者vim编辑器中如何显示行号

设置行号很简单我们要到vi或者vim编辑器的命令模式下,输入set number:set number按下回车就显示行号了那么怎么关闭行号呢?很简单,我们只要再到vi或者vim编辑器的命令模式下输入set nonumber:set nonumber按下回车行号就没了那么就有人会问,我在这里打开了行号下次再打开,行号又没了很简单,我们只需要在vi或者vim的配置文件中加入我们的设置就行了。我们只要在...

weixin_42405980的博客 2408

如何安装numbers.vim?3种简单方法让Vim行号管理效率提升10倍

numbers.vim是一款专为Vim设计的智能行号管理插件,能够根据不同模式自动切换相对行号(relativenumber)和绝对行号(number),极大提升代码编辑效率。本文将详细介绍3种简单的安装方法,帮助新手快速上手这款实用工具。 ## 🌟 为什么选择numbers.vim? 在Vim编辑器中,行号管理是提升效率的关键环节。numbers.vim通过智能切换行号显示模式,让你在正常

gitblog_00324的博客 1023

Linux工具学习之【vim

vim是一款小而美的编辑器,是vi的升级版,完美支持了其所有指令,并且新增了许多特性,作为一款编辑器,我们可以在上面写各种语言的代码(主要是C/C++)。vim有多种模式,光是如何退出vim这个问题在上就有几百万的浏览量,由此可见vim还是有一定的使用门槛的。当然vim中还有许多指令和极大的自定义空间,需要不断练习以熟练使用vim,最后我们还可以根据个人喜好配置出一款属于自己的vim

北 海的博客 3901

提升Vim编辑效率:vim-numbertoggle让行号显示智能化

Vim编辑器中,行号显示是提升代码导航效率的关键功能。**vim-numbertoggle**作为一款轻量级插件,通过智能切换相对行号与绝对行号的显示模式,帮助开发者在编码过程中实现更流畅的光标移动与代码定位。无论是日常编辑还是复杂项目开发,这款工具都能显著优化你的Vim使用体验。 ## 为什么需要智能行号切换? Vim行号显示主要有两种模式: - **绝对行号**(`:set numbe

gitblog_00210的博客 297

Linux Vim 使用 显示行号、替换、查找、多文件打开等骚操作

Linux Vim 使用 显示行号、替换、查找、多文件打开等骚操作

sv 1735

linux vim取消显示行号,linux vim不显示行号

Vim是从vi发展而来的文本编辑器,可以用颜色或底线等方式来显示一些特殊的信息。Vim是Linux中必不可少的工具,搭建网站修改配置文件时经常用到。本教程介绍Vim的模式和常用操作。背景信息 Vim的各个模式介绍如下表所示: 模式 作用 模式换 普通模式 (Normal Mode)在该模式下,您可以复制、粘贴、删除字符或行。 运行vim 打开文件时,即进入普通模式。 在其他四个模式下,按Esc键...

weixin_35777914的博客 1092

vim-numbertoggle与tmux集成指南:实现跨窗口行号智能切换

vim-numbertoggle是一款能够在Vim中自动切换混合行号和绝对行号的插件,它能根据窗口焦点和编辑模式智能调整行号显示方式,提升代码浏览和编辑效率。当你在正常模式下专注于某个缓冲区时,它会显示相对行号以便快速跳;而当切换窗口、进入插入模式或失去焦点时,则自动切换为绝对行号,避免相对行号带来的混淆。 ## 为什么需要与tmux集成? tmux作为终端复用工具,允许用户在单个终端窗口中

gitblog_01035的博客 706

行号 设置vim_Vim的使用全总结

Vim是Linux自带的编辑器,是Vi的高级版,刚开始使用我是一脸懵逼的,跟普通的编辑器完全不同,基本全靠键盘,写完之后也不知道怎么保存,特地花了点时间了解了一下,还是挺简单的。其中,主要包含三种模式,分别是普通模式,插入模式,命令行模式,每种模式都有各自的可进行的操作。进入vimvim是在终端上运行的,在进入时只需要输入 vi 就可以运行了。但是也有其他的自定义的方式打开vim,这些方式都是对具...

weixin_31901801的博客 192

vim 复制_Vim复制剪切粘贴设置行号等技巧

问题描述:Vim 中选中指定字符,进行复制,剪切,粘贴以及设置行号。解决方法:进入vim中visual模式,visual模式进入,可以有三种方式:(1)在普通模式(normal)下,直接按键 v 就可以进入默认visual模式,可以使用v+j/k/h/l 进行文本选择普通可视注:使用normal模式下的 v命令,进入visual模式,v+ j/k/h/l 进行文本选中对于选中的文本...

weixin_39614262的博客 450
上一篇: 拒酒词=====社交必备--转
下一篇: Vim中快速制表
phoenix_of_china
博客等级 码龄20年 3粉丝 75原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值