Vimfaq:修订间差异

来自Ubuntu中文
跳到导航跳到搜索
Zzjzzpgg12留言 | 贡献
 
(未显示7个用户的9个中间版本)
第24行: 第24行:
先ma标记当前位置为a,移动到新的位置,再y`a或者y'a复制从标记位置a到当前位置的内容。`和'的区别:`以字符为单位,'以行为单位。这个方法应该是所有vi都适用的。(如果不对请指正。)
先ma标记当前位置为a,移动到新的位置,再y`a或者y'a复制从标记位置a到当前位置的内容。`和'的区别:`以字符为单位,'以行为单位。这个方法应该是所有vi都适用的。(如果不对请指正。)


'''方法二:''' 按v或V或Ctrl+V进入visual模式,移动光标选择一段内容,按y(若要使用系统黏贴板,按"+y)。三者的区别: v以字符为单位,V以行为单位,Ctrl+V是块选择。这个方法只在VIM下适用。
'''方法二:''' 按v或V或Ctrl+V进入visual模式,移动光标选择一段内容,按y(若要使用系统粘贴板,按"+y)。三者的区别: v以字符为单位,V以行为单位,Ctrl+V是块选择。这个方法只在VIM下适用。


=== 粘贴 ===
=== 粘贴 ===
第122行: 第122行:
  http://www.vim.org/scripts/script.php?script_id=670
  http://www.vim.org/scripts/script.php?script_id=670


== 如何设置中文编码? ==


这个到底怎么用 ,我怎么用不成功!
== vim中文编码(乱码)问题 ==
===原理===
====编码相关的vim变量====
vim其中与编码相关的变量有4个分别是:
1.encoding
2.termencoding
3.fileencodings
4.fileencoding
关于这些变量的取值,可以进入vim后使用命令:
<pre>
:set 变量名 ?
</pre>
来查询。
付变量赋值:
<pre>
:set 变量名=值
</pre>
====变量含义及默认值====
关于这4个与vim编码相关的变量,他们的含义如下:
1.encoding
vim内部处理文字时使用的编码方式。(你输入一个资,这个字在vim内部(内存中)用什么编码把你的字转化成什么样的数字(表示),就是由这一变量决定)。
其值默认为:当前终端环境下的LANG值。
2.termencoding
终端(term)编码(encoding),该变量是指vim内部把字符发送到终端(显示器)上使用什么编码。
默认:空
其默认值为空,表示从vim内部发送到终端显示时不经过编码转换,直接显示,这时vim的encoding变量是什么,终端就是什么,相当于termencoding这个变量的值与encoding这一变量值相等。(但可以用:set termencoding=utf-8命令设置给值为utf-8如此vim会把内部的字符从encoding的值转换成utf-8之后再发送到终端显示)
付:我在图形界面下的终端似乎只能显示utf-8编码的文字(其他为乱码,所以我设置该值为utf-8)
3.fileencodings
文件编码(复),其值默认有多个,表示在
读取文件时
可选的编码(解码)方式。
例如一个文件内容为:e6 88 91 0a
如何解释该内容?如果用utf-8解释是:我
而如果用gb2312解释则是乱码。
如果此时把fileencodings变量设制为euc-cn(gb2312的别名?)这一个,然后再打开该文件则会显示乱码。
这时如果你知道该文件是使用utf8编码的那把该变量设置为utf-8,再打开即可看到内容。(当然我想更多的时候也许并不知道文件是用什么编码编写的,我们可以给该变量设置多个值让vim自己自动决定用哪个来解码文件。而有时vim自动选择时选错了,我们也可以通过设置该变量来指定解码方式)
4.fileencoding
与上面的很相近,文件编码,其值只为1个,表示在写入时选用什么编码。
默认:空
其默认为encoding变量。即vim内部用什么数字表示,在写入文件时,直接把该数字写入,而不转码。
如通过set改变其值,则在文件写入时,vim会自动调用编码转换工具,把(内存中的)文字编码从encoding转成filencoding(再写入磁盘)。
以上是关于文件编码的4个变量。
如果不希望每次进入vim都要手动设置一遍,那可以写成一个.vimrc文件放在主目录中(如此,每次进入vim之前,vim都会自动运行一遍该文件。)
===方案===
在.vimrc中作如下设置,可以实现界面以及显示字体采用gb2312,遇到utf8文件时自动做转换:
在.vimrc中作如下设置,可以实现界面以及显示字体采用gb2312,遇到utf8文件时自动做转换:


第183行: 第260行:
将下面的语句放入vimrc中,就可以了
将下面的语句放入vimrc中,就可以了


  autocmd BufReadPost * if line("'\"") &amp;&amp; line("'\"") &lt;= line("$") | exe "normal `\"" | endif
  if has("autocmd")
  autocmd BufRead *.txt set tw=78
  autocmd BufReadPost *
      \ if line("'\"") > 0 && line("'\"") <= line("$") |
      \  exe "normal g'\"" |
      \ endif
endif


若是某一次这种需要,直接运行normal命令
若是某一次这种需要,直接运行normal命令
第203行: 第286行:
* a. 直接进入注册表,在HKEY_CLASSES_ROOT\*\shell下添加项“用 vim 编辑”,
* a. 直接进入注册表,在HKEY_CLASSES_ROOT\*\shell下添加项“用 vim 编辑”,


再在项“用 vim 编辑”下添加子项“command”,在其右边窗口把其键值设定为
再在项“用 vim 编辑”下添加子项“command”,在其右边窗口把其键值设定为:


  "c:\Program Files\Vim\vim70\gvim.exe" -p --remote-tab-silent "%1"
  "c:\Program Files\Vim\vim70\gvim.exe" -p --remote-tab-silent "%1"
第228行: 第311行:
  set backspace=indent,eol,start
  set backspace=indent,eol,start


''== 如何选中一段文字并全文搜索这段文字? ==
== 如何选中一段文字并全文搜索这段文字? ==
 
自己做映射,如下面的:
 
'' :vnoremap &lt;silent&gt; ,/ y/&lt;C-R&gt;=escape(@", '\\/.*$^~[]')&lt;CR&gt;&lt;CR&gt;
:vnoremap &lt;silent&gt; ,? y?&lt;C-R&gt;=escape(@", '\\/.*$^~[]')&lt;CR&gt;&lt;CR&gt;''
 
这样就可以选中文字後,按键“,/”正向搜索,按键“,?”反向搜索


(注意:按象“,/”这样的组合键时,要稍稍按快点)
vnoremap  *  y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR>
''
vnoremap  #  y?<C-R>=escape(@", '\\/.*$^~[]')<CR><CR>
vnoremap  *  y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR>
vnoremap  #  y?<C-R>=escape(@", '\\/.*$^~[]')<CR><CR>
这样不是更方便吗?


== 如何为gvim/vim设置自己喜欢的字体? ==
== 如何为gvim/vim设置自己喜欢的字体? ==

2013年6月20日 (四) 16:20的最新版本

本文转自水木社区vim版:http://www2.newsmth.org/bbsdoc.php?board=VIM

对本文如有意见和建议,欢迎访问水木社区

为什么别人的方法在我这里行不通?

估计这是最难回答的一个问题了。:-)

不过首先应该确定你的VIM版本是否足够新,功能是否完整。使用 :version 命令查看你的VIM版本以及功能。

  • 一个常见的情况,如果你用的是RedHat系统,请确定安装了vim-enhance的rpm包,否则将是不完整的VIM。
  • 如果你用的ubuntu,确保安装了 vim-full

如何找到上次编辑的文件?

Ctrl+O (按两次)

如何复制粘贴?

复制

方法一:

先ma标记当前位置为a,移动到新的位置,再y`a或者y'a复制从标记位置a到当前位置的内容。`和'的区别:`以字符为单位,'以行为单位。这个方法应该是所有vi都适用的。(如果不对请指正。)

方法二: 按v或V或Ctrl+V进入visual模式,移动光标选择一段内容,按y(若要使用系统粘贴板,按"+y)。三者的区别: v以字符为单位,V以行为单位,Ctrl+V是块选择。这个方法只在VIM下适用。

粘贴

p或P。区别:前者粘贴到光标後面,後者粘贴到光标前面。

如何在多个文件中进行替换?

一般可以用sed或者vim来做。比如要对当前目录下的*.c文件进行替换: 方法一:

for i in *.c; do
 sed -i -e 's/oldvalue/newvalue/g' $i
done

方法二:

vim *.c
:argdo %s/oldvalue/newvalue/ge | update

如何把fold一次全部打开?

zR 或者 :set foldlevel=999
  • 全部关上是 zM

如何选择、复制或者查找光标所在的单词?

在VIM中用iw或者aw表示一个单词,两者稍有区别。

  • 选择光标所在的单词:viw (v进入visual模式,然後iw)
  • 复制光标所在的单词:yiw

查找的话就是两个很常用的明令:# 和 *

如何计数搜索的字符串?

如果需要统计缓冲中一个模式(pattern)出现的频率。Vim 会报告已匹配的数目就是模式出现的次数。例:

 :%s/./&/gn characters
  :%s/\i\+/&/gn words
  :%s/^//n lines
  :%s/the/&/gn "the" anywhere
  :%s/\<the\>/&/gn "the" as a word

你可能希望复位 'hlsearch' 或者使用 ":nohlsearch"。

如何去掉高亮搜索?

方法一::nohlsearch

方法二:/awertgvcxz (查找一个肯定不存在的字符串)

设置了高亮搜索(:set hlsearch)以後,可以通过 :set nohlsearch 永久地关闭高亮 显示,也可以通过 :nohlsearch 暂时关闭高亮显示,下次搜索时将自动恢复高亮。

如何解决linux下gvim中文菜单乱码问题?

以vim6.3为例

:source $VIMRUNTIME/delmenu.vim
:source $VIMRUNTIME/menu.vim

也可以将以上内容加入.vimrc

光source一个menu.vim或者啥也不source都是乱码

另外,也有网友报告说没有遇到此类问题

注:这里的source指的是vim自己的source命令,和bash shell的source无关

如何对所编辑的文件语法高亮显示?

需要解释的是,VI有很多变种,它本身并没有这种功能,提供这种功能往往是其各种衍生版本,比如说vim。下面就vim中如何语法高亮简单解释一下。

首先,确定一下你所用的操作系统,

  • 如果是windows,那么默认的配置文件就可以工作了。如果还不行,可以用鼠标从syntax菜单下选择一下适合你的文件类型(新版本的gvim默认把文件类型选择关闭了,需要点开,然後按照开头字母选择类型)
  • 如果是linux,那么确认一下是否是redhat。如果是redhat,那么需要安装vim-enhanced的rpm包。这些都做了以後,可以用:syntax on来打开语法高亮。必要时可以用:set filetype=...来设定你的文件类型。

如果使用图形界面,比如gvim,那么syntax on和set filetype的操作可以用鼠标在菜单中选择,同windows下。

如果是在控制台中使用vim,还应当确定你的终端设置支持颜色。

如何快速插入多行数字0-99?

在命令行中输入以下代码,或者先把代码保存到一个外部文件,然後source这个文件:

let i = 0
while i < 100
 put = i
 let i = i + 1
endw

如果位数不足需要在前面补零,可以用Ctrl-V块选择,然後I插入0。

若经常做的话,可以用插件VisIncr

http://www.vim.org/scripts/script.php?script_id=670


这个到底怎么用 ,我怎么用不成功!

vim中文编码(乱码)问题

原理

编码相关的vim变量

vim其中与编码相关的变量有4个分别是:

1.encoding

2.termencoding

3.fileencodings

4.fileencoding

关于这些变量的取值,可以进入vim后使用命令:

:set 变量名 ?

来查询。

付变量赋值:

:set 变量名=值

变量含义及默认值

关于这4个与vim编码相关的变量,他们的含义如下:

1.encoding

vim内部处理文字时使用的编码方式。(你输入一个资,这个字在vim内部(内存中)用什么编码把你的字转化成什么样的数字(表示),就是由这一变量决定)。 其值默认为:当前终端环境下的LANG值。


2.termencoding

终端(term)编码(encoding),该变量是指vim内部把字符发送到终端(显示器)上使用什么编码。

默认:空

其默认值为空,表示从vim内部发送到终端显示时不经过编码转换,直接显示,这时vim的encoding变量是什么,终端就是什么,相当于termencoding这个变量的值与encoding这一变量值相等。(但可以用:set termencoding=utf-8命令设置给值为utf-8如此vim会把内部的字符从encoding的值转换成utf-8之后再发送到终端显示)

付:我在图形界面下的终端似乎只能显示utf-8编码的文字(其他为乱码,所以我设置该值为utf-8)


3.fileencodings

文件编码(复),其值默认有多个,表示在 读取文件时 可选的编码(解码)方式。

例如一个文件内容为:e6 88 91 0a 如何解释该内容?如果用utf-8解释是:我

而如果用gb2312解释则是乱码。

如果此时把fileencodings变量设制为euc-cn(gb2312的别名?)这一个,然后再打开该文件则会显示乱码。 这时如果你知道该文件是使用utf8编码的那把该变量设置为utf-8,再打开即可看到内容。(当然我想更多的时候也许并不知道文件是用什么编码编写的,我们可以给该变量设置多个值让vim自己自动决定用哪个来解码文件。而有时vim自动选择时选错了,我们也可以通过设置该变量来指定解码方式)


4.fileencoding

与上面的很相近,文件编码,其值只为1个,表示在写入时选用什么编码。

默认:空

其默认为encoding变量。即vim内部用什么数字表示,在写入文件时,直接把该数字写入,而不转码。 如通过set改变其值,则在文件写入时,vim会自动调用编码转换工具,把(内存中的)文字编码从encoding转成filencoding(再写入磁盘)。


以上是关于文件编码的4个变量。

如果不希望每次进入vim都要手动设置一遍,那可以写成一个.vimrc文件放在主目录中(如此,每次进入vim之前,vim都会自动运行一遍该文件。)

方案

在.vimrc中作如下设置,可以实现界面以及显示字体采用gb2312,遇到utf8文件时自动做转换:

set encoding=prc
set fileencoding=prc
set fileencodings=ucs-bom,utf8,prc

需要注意的是,按照上面的设置,如果你打开一个空的(0字节)或者是纯7bits的文件, 这时VIM将认为是utf8编码的文件,如果你往里面输入中文,存盘的时候也将是utf8。 因此你可能需要在存盘之前 :set fileencoding=prc 把编码改回来。

另外,对于纯7bits的文件,由于认成了utf8,每次打开存盘的时候都要做一次转换, 会比较慢,所以如果你很长一段时间不会接触utf8的话,可能暂时把 fileencodings 一行注释掉比较好。

[警告]:转换可能会造成信息丢失!如果你需要编辑的是重要的系统文件,最好把 fileencodings 一行暂时注释掉。

如何去掉或者插入^M这样的字符?

在VIM的插入模式或者命令行中用<C-V>输入^M这样的特殊字符,例如输入

:%s/<C-V><C-M>//g

实际显示是

:%s/^M//g

就可以去掉文件中所有的^M。同理,要在文件中输入^M只要按<C-V><C-M>即可。

这个问题往往发生在WINDOWS/DOS系统和UNIX系统之间交换文件时,因为这两类系统 对于文本的“换行”概念解释不同。所以,还有一个解决方法就是对这类文本进行 转换。vim内部就可以做这件事情。首先打开文本,然後

set fileformat=unix

再从新保存该文件复盖原文件就可以去除:^M了

如何整体缩进一段代码(插入tab)?

选中一段代码,< 或 > 或 2< 或 3> ……

如何合并两行?

合并两行的键是 J 另外,如果你设置了

set backspace=2

你就可以用backspace或者delete很方便的删到上一行或者下一行。

如何设置缩进距离(tab宽度)?

set tabstop=8
set shiftwidth=8

如何让VIM不生成备份文件(~文件)?

set nobackup

更多细节请看 :help backup。另外,也可以不关掉backup而是设置backupdir将备份文件统一存放到一个目录下,比如

set backupdir=C:\Program\ Files\Vim\tmp

如何让打开文件时光标自动到上次退出该文件时的光标所在位置

将下面的语句放入vimrc中,就可以了

if has("autocmd")
  autocmd BufRead *.txt set tw=78
  autocmd BufReadPost *
     \ if line("'\"") > 0 && line("'\"") <= line("$") |
     \   exe "normal g'\"" |
     \ endif

endif

若是某一次这种需要,直接运行normal命令

`"

如何让一个文件在原有的gvim中用新开的tab打开

在linux下可以这样打开

$gvim --remote-tab-silent filename

而在windows下,DOS下也可以象上面那样打开;而若是“双击”打开方式,则可以修改注册表HKEY_CLASSES_ROOT\Applications\gvim.exe\shell\edit\command将其键值修改为

"C:\Program Files\Vim\vim70\gvim.exe" -p --remote-tab-silent "%1"

而若是用鼠标右键中的“用 vim 编辑”,先删掉注册表中的HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\gvim,然後手工添加鼠标右键菜单,两种方式:

  • a. 直接进入注册表,在HKEY_CLASSES_ROOT\*\shell下添加项“用 vim 编辑”,

再在项“用 vim 编辑”下添加子项“command”,在其右边窗口把其键值设定为:

"c:\Program Files\Vim\vim70\gvim.exe" -p --remote-tab-silent "%1"
  • b. 把下面的内容保存为文件gvim.reg,并将之导入注册表
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\Edit with &Vim]
[HKEY_CLASSES_ROOT\*\shell\Edit with &Vim\command]
@="\"c:\\Program Files\\Vim\\vim70\\gvim.exe\" -p --remote-tab-silent \"%1\""

另外,也可以添加到鼠标右键中的“发送到” 方法:进入到目录c:\Documents and Settings\用户名\SendTo下,“鼠标右键”-“新建”-“快捷方式”,然後通过对话框的“浏览”找到gvim安转位置,这样就建立gvim 的一个快捷方式,右键单击这个快捷文件-属性-快捷方式,在“目标(T)”的地址栏写入:

"C:\Program Files\Vim\vim70\gvim.exe" -p --remote-tab-silent "%*"

注意:上面都是默认安装gvim的地址,若不是默认地址,请自行修改

为什么文件很多行仅仅在每行开头显示个"@"

set dy=lastline

在插入模式下Backspace怎么无法删除了

set backspace=indent,eol,start

如何选中一段文字并全文搜索这段文字?

vnoremap  *  y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR>
vnoremap  #  y?<C-R>=escape(@", '\\/.*$^~[]')<CR><CR>

如何为gvim/vim设置自己喜欢的字体?

为 gvim 选择自己喜欢的字。点“编辑”-->“选择字体”, 然後在字体列表中选择一个你喜欢的字体和字号,然後确认。也可以用如下命令直接得到字体列表

set guifont=*

因 gvim 只能使用等宽字体, 故对话框列出的字体比你系统里安装的字体要少得多。这时可以用如下命令查询所选择的字体:

:set guifont?

回显结果象这样子: guifont=Nimbus Mono L 14 若要设置某个字体为gvim启动後的默认字体,如上面例子,则在vimrc中如下设置

set guifont=Nimbus\ Mono\ L\ 14

( 如果字体名称中含有空格, 需要在空格前面加上一个反斜杠) 而vim字体是由你所选择的终端所决定的,如:xterm,dos等,所以若想换console下vim的字体及字号,只能调整终端设置

如何发现/搜索非8位字符,如"“"?

/[^\x00-\xff]