vim – 虫虫之家 http://ijz.me 略懂技术 Tue, 25 Aug 2015 09:18:13 +0000 zh-Hans hourly 1 https://wordpress.org/?v=6.7.2 vim RE 非贪婪匹配 http://ijz.me/?p=808 http://ijz.me/?p=808#respond Tue, 25 Aug 2015 09:18:13 +0000 http://ijz.me/?p=770 /a.{-}b
它会匹配到”axbxb”中的”axb”. 如果模式是:
normal mode command
/a.*b
它就会尽可能多地匹配了. 所以匹配到的是整个”axbxb”.

]]>
http://ijz.me/?feed=rss2&p=808 0
Linux用vim/vi给文件加密和解密/zz/ http://ijz.me/?p=692 http://ijz.me/?p=692#respond Mon, 24 Nov 2014 04:16:58 +0000 http://ijz.me/?p=692 linux文件为了防止被人随便打开收看,可以使用那个vim自带的加密功能,对文本文件进行加密,以防止人直接看到内容。

然而在使用Vim编辑文件保存时时,有时候可能输入:X(shift键未及时按下松开),这时体统会提示:

Enter encryption key:

原来:X命令是加密文本的命令。根据提示输入密钥,然后会再次提示:

Enter same key again:

加密后的文本需要密钥才可查看。

有加密就需要有取消加密,取消密钥需在打开文件后(如果文件已加密,当然需要先输入密钥才能进行如下操作

在命令行模式下:

: set key= 

将密钥赋值为空(必须要有空格)即可。

问题是vim是如何加密文件的?答案是vim采用了BlowFish加密算法(7.3版本),密钥存储在key这个选项中。

实际操作的过程中还遇到一个问题,在设置加密密钥后保存文件,只有用:wq才可以,用:x不可以。看了这两个命令不是完全等价的,查看帮助文档发现::wq是将缓冲区中的内容写入文件,而:x则需要缓冲区内容被修改时才会将缓冲区中的内容写入文件。

由此看来设置密钥不会改变缓冲区的内容,缓冲区的内容就不会被加密存入文件了。

]]>
http://ijz.me/?feed=rss2&p=692 0
VIM标记 mark 详解 http://ijz.me/?p=73 http://ijz.me/?p=73#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=73 Vim 允许你在文本中放置自定义的标记。命令 “ma” 用 a 标记当前的光标位置。你可以在文本中使用 26 个标记(a到z)。这些标记是不可见的,只是一个由 Vim 记住的位置。
要跳到一个你定义的标记,可以使用命令 {mark},这里 {mark} 是指定义标记的那个字母。

所以,移到标记a的命令是:

a

命令 ‘mark(单引号加上一个标记)会移到标记所在行的行首。这与 `mark 命令是不同的,
后者是移到标记所在行上被标记的列。

标记在需要处理一个文件的两个相关地方的时候非常有用。假设你在处理文末的时候需要
查看文首的一些内容,先移动到行首,设置一个标记 s (start):

ms

然后移动到你需要处理的地方,再设置一个标记 e (end):

me

现在你可以随意移动,当你需要看开头的地方,可以使用这个命令移到那里:

‘s

然后使用 ” 跳回来。或者用 ‘e 跳到你正在处理的文尾的地方。
这里使用 s 和 e 作标记名没有特别的含义,只是为了好记而已。

你可以用如下命令取得所有的103f标记的列表:

:marks

你会注意到有一些特殊的标记,包括:

‘       跳转前的位置
”       最后编辑的位置
[       最后修改的位置的开头
]       最后修改的位置的结尾

补充:如果想要删除marks,可用命令delmarks + markname 。

 

]]>
http://ijz.me/?feed=rss2&p=73 0
vi下显示回车换行符等特殊符号 http://ijz.me/?p=74 http://ijz.me/?p=74#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=74 换行方式

在早期的打印机时代,开始新的一行要占用两个字符的时间。如果到了一行的结尾处,你要快速回到新的一行的开头,需要打印针头在纸面上飞快地掠过,常常会在纸面上留下污点。解决这个问题的办法就是,用两个字符:一个字符<Return>来移到第一列,另一个字符<Linefeed>来新增一行。计算机产生以后,存储较为昂贵,在如何解决回车换行这个老问题上,人们产生了不同的意见。UNIX人认为在到达一行的结尾时新增一行<Linefeed>(LF),而Mac人则认同<Return>(CR)的解决办法,MS则坚持古老的<Return><Linefeed>(CRLF)的方法。这就意味着如果你将一个文件从一个系统转移到另一个系统,就面临着回车换行的问题。而Vim编辑器则会自动的认出这种文件格式方面的区别,并做出相应处理。

fileformats选项,用于处理文件格式问题。以下命令,告诉vim将UNIX文件格式做为第一选择,而将MS-DOS的文件格式做为第二选择:

:set fileformats=unix,dos

检测到的文件格式会被存放在fileformat选项中,我们可以用以下命令来查询:

:set fileformat?

我们还可以利用fileformat选项,来转换种文件格式。例如,使用以下命令将名为readme.txt的MS-DOS格式的文件,转换为UNIX格式的文件。

:set fileformat=unix

在默认情况下,Vim认为文件是由行组成的,并且文件最后一行是以<EOL>为结束符的。如果你想设置文件以<EOL>结束符结尾,则可以用以下命令:

:set endofline

如果你想设置文件不以<EOL>结束符来结尾,则可以使用以下命令:

:set noendofline

显示换行

如果你使用以下命令进入<listmode>,那么就可以清楚的看到以“$”表示的换行符和以“^I”表示的制表符。

:set list

你可以使用以下命令退出<list mode>:

:set nolist

删除换行

可以用以下命令删除换行符:

:%s/n//g

可以用以下命令删除DOS文件中的回车符“^M”:

:%s/r//g

可以用以下命令转换DOS回车符“^M”为真正的换行符:

:%s/r/r/g

可以用以下命令删除行尾的空格以及DOS回车符。它没有使用“/”字符作为替换命令各个参数间的分隔符,而是使用了“#”字符。命令还使用了“?”正则表达式,用来匹配它前面出现的字符0次或1次。

:%s#s*r?$##

可以用以下命令删除三行空行:

:%s/^n{3}//

可以用以下命令将连续的两个空行替换成一个空行:

:%s/nn/r/g

自动换行

在默认情况下,Vim是不会自动换行的,也就是说我们需要自己决定回车的位置。但是我们也可以通过指定textwidth选项,让Vim自动在指定位置换行。例如,使用以下命令指定在30列时自动换行。由于在遇到空格时才会自动换行,所以换行的精确位置可能会小于你指定的列宽。

:set textwidth=29

而以下命令告诉Vim从右面算起当达到10个字符的空格时要换行:

:set wrapmargin=10

在指定了文本宽度的情况下,当我们将一行中的前几个文字删掉时,Vim并不会将后面行中的文本移动上来,而是形成了一些长短不一的段落,这样看起来不是很好。可以有几种方法处理这个问题:

一种方法是,在可视化模式下选中这些文本,然后用gp命令来格式化选中的段落。另一种方法是,使用gqmotion命令来完成格式。例如要格式化5行,就可以用命令:gq4j。这个命令告诉Vim要格式化本行,同时要格式化下面的4行,这样就达到了格式化5行的目的。如果要格式化整个段落,可以将光标放在段落的第一行上,然后执行命令gq}。而使用命令gqip可以格式化当前段落,而且并不必要将光标放在段落的第一行上。

如果要想格式化一行,可以使用命令gqgq,也可以简记为gqq。

注意:选项textwidth优先于wrapmargin。如果要使wrapmargin选项生效,必须将textwidth设置为0(这也是默认值)。

合并行

命令J使两行合并为一行,同时用空格分隔这两行。

通过设置joinspace选项,可以控制合并两行时的分隔符(如果一行是以标点符号来结尾)。如果设置:setnojoinspaces,用J命令合并两行时会用一个空格来分隔;如果设置:setjoinspaces,用J命令合并两行时会用两个空格来分隔。如果不希望用空格来分隔合并的行,可以使用gJ命令。

我们也可以使用:join命令,将几行合并为一行并使用空格来分隔各行。如果不希望加入空格,那么可以使用:join!命令。

命令小结:set fileformat设置文件格式:set endofline设置文件结束符:set noendofline取消文件结束符:set list进入List Mode:set nolist退出List Mode:%s/n//g删除换行符:set textwidth设置行宽:set textwidth设置行边距:join合并多行J合并两行

 

]]>
http://ijz.me/?feed=rss2&p=74 0
VI高级命令集锦 /zz/ http://ijz.me/?p=75 http://ijz.me/?p=75#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=75 1.交换两个字符位置
xp
2.上下两行调换
ddp
3.把文件内容反转
:g/^/m0/ (未通过)
4.上下两行合并
J
5.删除所有行
dG


6.从当前位置删除到行尾
d$
7.从当前位置复制到行尾
y$ 如果要粘贴到其他地方 p 就可以了

由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态
8.
:ab string strings
例如 “:ab usa United States of America” ,
当你在文见里插入 usa 时
United States of America 就蹦出来了
9.
:map keys new_seq
定义你当前 键盘命令
10.
:set [all]
vi or ex 的编辑状态
如 显示每行 :set nu
11.
在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的
下面。

12.
单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S

13.

:%s/old_word/new_word/g
这个指令是于在整个文件中替换特定字符串

14.光标控制

k:上移 nk 上移n行
j:下移 nj 下移n行

将光标移到第n行,按下 mk
将光标移到第m行,按下 “ay’k
即将第n到m的行存到a寄存器,以此类推,b,c……..寄存器等

这样就可以将你常用的需要复用的内容粘贴到不同的寄存器中以备用

想粘贴到某处,直接将光标移到某

]]>
http://ijz.me/?feed=rss2&p=75 0