Vim的行号、语法显示等设置(.vimrc文件的配置)以及乱码解决

2023-05-16

在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号、语法高亮度显示、智能缩进

等功能的。为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc。
在启动vim时,当前用户根目录下的.vimrc文件会被自动读取,该文件可以包含一些设置甚至脚本,

所以,一般情况下把.vimrc文件创建在当前用户的根目录下比较方便,即创建的命令为:
$vi ~/.vimrc
设置完后
$:x 或者 $wq 
进行保存退出即可。
下面给出一个例子,其中列出了经常用到的设置,详细的设置信息请参照参考资料:
“双引号开始的行为注释行,下同
“去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
set nocompatible
“显示行号
set number
“检测文件的类型
filetype on 
“记录历史的行数
set history=1000 
“背景使用黑色
set background=dark 
“语法高亮度显示
syntax on 
“下面两行在进行编写代码时,在格式对起上很有用;
“第一行,vim使用自动对起,也就是把当前行的对起格式应用到下一行;
“第二行,依据上面的对起格式,智能的选择对起方式,对于类似C语言编
“写上很有用
set autoindent
set smartindent
“第一行设置tab键为4个空格,第二行设置当行之间交错时使用4个空格
set tabstop=4
set shiftwidth=4
“设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号
set showmatch
“去除vim的GUI版本中的toolbar
set guioptions=T
“当vim进行编辑时,如果命令错误,会发出一个响声,该设置去掉响声
set vb t_vb=
“在编辑过程中,在右下角显示光标位置的状态行
set ruler
“默认情况下,寻找匹配是高亮度显示的,该设置关闭高亮显示
set nohls
“查询时非常方便,如要查找book单词,当输入到/b时,会自动找到第一
“个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的单词,依
“次类推,进行查找时,使用此设置会快速找到答案,当你找要匹配的单词
“时,别忘记回车
set incsearch
“修改一个文件后,自动进行备份,备份的文件名为原文件名加“~“后缀
if has(“vms”) //注意双引号要用半角的引号" "
set nobackup
else
set backup
endif

如果去除注释后,一个完整的.vimrc配置信息如下所示:
set nocompatible
set number
filetype on 
set history=1000 
set background=dark 
syntax on 
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions-=T
set vb t_vb=
set ruler
set nohls
set incsearch
if has("vms")
set nobackup
else
set backup
endif


如果设置完后,发现功能没有起作用,检查一下系统下是否安装了vim-enhanced包,查询命令为:
$rpm –q vim-enhanced
参考资料:
1.vim的完全翻译版在下面连接处可以找到
http://vimcdoc.sourceforge.net/
可以下栽其中的一个PDF版本,里面介绍的很详细,强烈推荐:)
2.更详细的vim信息可以访问:
http://www.vim.org/
3.一个带有英文注释的.vimrc例子
http://www.vi-improved.org/vimrc.php

此文讲解的是vim编辑多字节编码文档(中文)所要了解的一些基础知识,注意其没有涉及gvim,纯指字符终端下的vim。

-------------------------------
vim编码方面的基础知识:

1,存在3个变量:
encoding—-该选项使用于缓冲的文本(你正在编辑的文件),寄存器,Vim 脚本文件等等。你可以把 ‘encoding’ 选项当作是对 Vim 内部运行机制的设定。
fileencoding—-该选项是vim写入文件时采用的编码类型。
termencoding—-该选项代表输出到客户终端(Term)采用的编码类型。
2,此3个变量的默认值:
encoding—-与系统当前locale相同,所以编辑文件的时候要考虑当前locale,否则要设置的东西就比较多了。
fileencoding—-vim打开文件时自动辨认其编码,fileencoding就为辨认的值。为空则保存文件时采用encoding的编码,如果没有修改encoding,那值就是系统当前locale了。
termencoding—-默认空值,也就是输出到终端不进行编码转换。

由此可见,编辑不同编码文件需要注意的地方不仅仅是这3个变量,还有系统当前locale、文件本身编码以及自动编码识别客户运行vim的终端所使用的编码类型3个关键点,这3个关键点影响着3个变量的设定。
如果有人问:为什么我用vim打开中文文档的时候出现乱码?
答案是不确定的,原因上面已经讲了,不搞清楚这3个关键点和这3个变量的设定值,出现乱码是正常的,倒是不出现乱码那反倒是凑巧的。

再来看一下常见情况下这三个关键点的值以及在这种情况下这3个变量的值:
1,locale—-目前大部分Linux系统已经将utf-8作为默认locale了,不过也有可能不是,例如有些系统使用中文locale zh_CN.GB18030。在locale为utf-8的情况下,启动vim后encoding将会设置为utf-8,这是兼容性最好的方式,因为内部 处理使用utf-8的话,无论外部存储编码为何都可以进行无缺损转换。locale决定了vim内部处理数据的编码,也就是encoding。
2,文件的编码以及自动编码识别—-这方面牵扯到各种编码的规则,就不一一细讲了。但需要明白的是,文件编码类型并不是保存在文件内的,也就是说没有任何 描述性的字段来记录文档是何种编码类型的。因此我们在编辑文档的时候,要么必须知道这文档保存时是以什么编码保存的,要么通过另外的一些手段来断定编码类 型,这另外的手段,就是通过某些编码的码表特征来断定,例如每个字符占用的字节数,每个字符的ascii值是否都大于某个字段来断定这个文件属于何种编 码。这种方式vim也使用了,这就是vim的自动编码识别机制了。但这种机制由于编码各式各样,不可能每种编码都有显著的特征来辨别,所以是不可能 100%准确的。对于我们GB2312编码,由于其中文是使用了2个acsii值高于127的字符组成汉字字符的,因此不可能把gb2312编码的文件与 latin1编码区分开来,因此自动识别编码的机制对于gb2312是不成功的,它只会将文件辨识为latin1编码。此问题同样出现在gbk,big5 上等。因此我们在编辑此类文档时,需要手工设定encoding和fileencoding。如果文档编码为utf-8时,一般vim都能自动识别正确的 编码。

3,客户运行vim的终端所使用的编码类型—-同第二条一样,这也是一个比较难以断定的关键点。第二个关键点决定着从文件读取内容和写入内容到文件 时使用的编码,而此关键点则决定vim输出内容到终端时使用的编码,如果此编码类型和终端认为它收到的数据的编码类型不同,则又会产生乱码问题。在 linux本地X环境下,一般终端都认为其接收的数据的编码类型和系统locale类型相符,因此不需关心此方面是否存在问题。但如果牵涉到远程终端,例 如ssh登录服务器,则问题就有可能出现了。例如从1台locale为GB2310的系统(称作客户机)ssh到locale为utf-8的系统(称作服 务器)并开启vim编辑文档,在不加任何改动的情况下,服务器返回的数据为utf-8的,但客户机认为服务器返回的数据是gb2312的,按照 gb2312来解释数据,则肯定就是乱码了,这时就需要设置termencoding为gb2312来解决这个问题。此问题更多出现在我们的 windows desktop机远程ssh登录服务器的情况下,这里牵扯到不同系统的编码转换问题。所以又与windows本身以及ssh客户端有很大相关性。在 windows下存在两种编码类型的软件,一种是本身就为unicode编码方式编写的软件,一种是ansi软件,也就是程序处理数据直接采用字节流,不 关心编码。前一种程序可以在任何语言的windows上正确显示多国语言,而后一种则编写在何种语言的系统上则只能在何种语言的系统上显示正确的文字。对 于这两种类型的程序,我们需要区别对待。以ssh客户端为例,我们使用的putty是unicode软件,而secure CRT则是ansi 软件。对于前者,我们要正确处理中文,只要保证vim输出到终端的编码为utf-8即可,就是termencoding=utf-8。但对于后者,一方面 我们要确认我们的windows系统默认代码页为cp936(中文windows默认值),另一方面要确认vim设置的termencoding= cp936。

最后来看看处理中文文档最典型的几种情况和设置方式:

1,系统locale是utf-8(很多linux系统默认的locale形式),编辑的文档是GB2312或GBK形式的(Windows记事本 默认保存形式,大部分编辑器也默认保存为这个形式,所以最常见),终端类型utf-8(也就是假定客户端是putty类的unicode软件)
则vim打开文档后,encoding=utf-8(locale决定的),fileencoding=latin1(自动编码判断机制不准导致的),termencoding=空(默认无需转换term编码),显示文件为乱码。
解决方案1:首先要修正fileencoding为cp936或者euc-cn(二者一样的,只不过叫法不同),注意修正的方法不是:set fileencoding=cp936,这只是将文件保存为cp936,正确的方法是重新以cp936的编码方式加载文件为:edit ++enc=cp936,可以简写为:e ++enc=cp936。
解决方案2:临时改变vim运行的locale环境,方法是以LANG=zh_CN vim abc.txt的方式来启动vim,则此时encoding=euc-cn(locale决定的),fileencoding=空(此locale下文件 编码自动判别功能不启用,所以fileencoding为文件本身编码方式不变,也就是euc-cn),termencoding=空(默认值,为空则等 于encoding)此时还是乱码的,因为我们的ssh终端认为接受的数据为utf-8,但vim发送数据为euc-cn,所以还是不对。此时再用命令: set termencoding=utf-8将终端数据输出为utf-8,则显示正常。

2,情况与1基本相同,只是使用的ssh软件为secure CRT类ansi类软件。

vim打开文档后,encoding=utf-8(locale决定的),fileencoding=latin1(自动编码判断机制不准导致的),termencoding=空(默认无需转换term编码),显示文件为乱码。

解决方案1:首先要保证运行secure CRT的windows机器的默认代码页为CP936,这一点中文windows已经是默认设置了。其他的与上面方案1相同,只是要增加一步,:set termencoding=cp936

解决方案2:与上面方案2类似,不过最后一步修改termencoding省略即可,在此情况下需要的修改最少,只要以locale为zh_CN开 启vim,则encoding=euc-cn,fileencoding和termencoding都为空即为encoding的值,是最理想的一种情 况。

可见理解这3个关键点和3个参数的意义,对于编码问题有很大助力,以后就可以随心所欲的处理文档了,同时不仅仅是应用于vim,在其他需要编码转换的环境里,都可以应用类似的思路来处理问题解决问题。

最后推荐一款功能强大的windows下的ssh客户端—-xshell,它具有类似secure CRT一样的多tab 的ssh窗口的能力,但最为方便的是这款工具还有改变Term编码的功能,这样我们就可以不用频繁调整termencoding,只需在ssh软件里切换 编码即可,这是我用过的最为方便的ssh工具。它是商业软件,但非注册用户使用没有任何限制,只是30天试用期超出后会每次启动都提示注册,对于功能没有 丝毫影响。

-------------------------------------

最后看到ubuntu中文站上一个完美解决的方法:在.vimrc加两句设置

"设定文件编码类型,彻底解决中文编码问题 
let &termencoding=&encoding 
set fileencodings=utf-8,gbk,ucs-bom,cp936 
加上发现没有作用,那就是vim的哪个包没有安装,试试把包安完全一些。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vim的行号、语法显示等设置(.vimrc文件的配置)以及乱码解决 的相关文章

  • 在vim中禁用omnicomplete或ftplugin或其他东西

    我正在尝试禁用 sql 中的 自动 全向 任意 完成 这对我来说是个问题 因为我用过
  • 在 VIM 中切换语法高亮的隐藏属性

    我目前有一个解析日志文件的语法文件 与以下内容非常相似 这是针对 syslog 的 syn match syslogText syn match syslogFacility 1 nextgroup syslogText skipwhite
  • 使用 Webpack 波形符别名时通过 Vim 中的“gf”解析 JavaScript 模块

    我是使用波浪号的 Vue js 项目的新成员 模块导入中的符号 如 import WhateverApi from api whatever 项目存储库包含所有类型的文件 Vagrant 机器 Laravel 后端应用程序 配置文件和 Vu
  • 选项卡视觉选择

    In many GUIs when I select a section of text and then hit the Tab or Shift Tab button the selected section will indent i
  • 在插入模式下移至行首

    我知道我可以使用 Home in insert mode Esc i to exit insert mode and enter it again effectively going to the beginning of line But
  • 设置快捷方式以替换 VIM 中轻松选择的字符串

    我有很多 php html 文件 其中包含许多应该使用 gettext 国际化的字符串 因此 我必须遍历每个文件 找到 消息 字符串并将每个字符串替换为 I use vim and would like to setup a shortcu
  • 在 Vim 中搜索并替换为递增值

    假设我写了一个简单的 CSS 规则 如下所示 star 10 background url stars png no repeat 0 0 而我需要10个 所以我复制了9次 star 10 background url stars png
  • Vim langmap 中断插件 (bépo)

    我正在使用 b po 键盘映射 http bepo fr http bepo fr 并寻求完美的 vim 映射 So far I used a long list of noremap http bepo fr wiki Vim B C3
  • Vimscript 检查当前缓冲区是否有未保存的更改

    我目前已设置状态行 使其在插入模式下为橙色 否则为白色 如果文件有任何未保存的更改 我想让它在我回到正常模式时变成另一种颜色 因为我经常在兔子洞里走一会儿 想知道为什么我的更改没有生效 小 还不够打我的脸 我找不到任何以 buf 开头且看起
  • 在 VIM 中缩进文件夹中的所有文件

    我有一个包含数百个 TTL TeraTermLanguage 文件的文件夹 现在我想缩进所有这些文件 我已经创建了用于缩进的 teraterm vim 并使用 VIM 打开一个文件并执行 gg G 整个文件得到了正确的缩进 但是有什么方法可
  • Vim 关闭窗口而不关闭缓冲区

    如何在不删除缓冲区的情况下关闭窗口或取消分割 A window is a viewport on a buffer In vim to manage windows it is CTRL w the leading command that
  • Foldmethod=同时标记和语法?

    同一文件是否可以根据标记和语法使用折叠 Since foldmethod一次只能设置为一个 我认为您真正可以做到这一点的唯一方法是使用 set foldmethod expr并与foldexpr 即使如此 我也不确定它是否能够完全按照您的要
  • Redhat Vim 中的可视化块插入

    我的 ec2 服务器附带了 redhat vim ec2 user vim version VIM Vi IMproved 7 2 2008 Aug 9 compiled Jul 7 2012 08 03 48 Included patch
  • 如何使用 tmuxinator 在 tmux 中拆分水平窗格内的两个垂直窗格

    目前我的 tmuxinator yml 文件中有这个 windows editor layout main horizontal panes vim server rails s 这给了我两个窗口 一个用于编辑器 另一个用于服务器 在编辑器
  • 在键盘快捷键上插入预定义文本

    我经常插入binding pry当我调试我的 ruby 文件时 当我使用 Vim 时 我希望将其自动化 以避免每次都重新输入 我怎样才能做到呢 我想要映射的确切顺序是 插入新行 Insert binding pry到新创建的行 返回正常模式
  • 禁用 VIM 中的警告?

    有没有办法禁用 VIM 中的警告 特别是 当文件从只读变为可写时 我想禁用警告 12 我有一个脚本可以打开文件进行编辑 但 vim 认为文件已更改并发出警告 Thanks 我的 vimrc 中有以下内容 你应该只需要第二个 它将消息回显到状
  • 将 vim 的 vertsplit 字符更改为 │

    我认为这与代码页相关 但询问也无妨 在 windows xp 的 cmd 上 gvim 7 2 如何更改 vertsplit 字符 而不是默认的 它是 因此它是一条完整的线 而不是一条分割线 该字符通常会更改为 set fillchars
  • :set 选项的显示值

    如果你不给 colorscheme一个参数 然后它显示 vim 当前使用的颜色方案的名称 vim 中是否有类似的方法来显示是否设置了选项或如果选项的值不是布尔值则设置为什么 例如 如果我想知道是否autoindent已设置或者我想知道的值t
  • 在后台从 gVim 运行 :make

    我在 Windows 中使用 gVim 来编辑我的代码 主要是 C 我在 gVim 中使用 make 来编译项目 但这是一个阻塞操作 在编译完成之前我无法使用 gVim 我怎样才能异步执行 make 并仍然获得将错误读回 Vim 并跳转到源
  • 使用 vim pythoncomplete 的 Python 文档字符串不显示我自己的类函数的换行符

    我在尝试使用时得到了一些意想不到的结果Python 全方位补全 http www vim org scripts script php script id 1542在我自己的类函数上 函数的文档字符串未正确设置换行符格式 如下图所示 当我从

随机推荐

  • Kotlin--›Kotlin时代的Adapter(Android 一个话时代的DslAdapter(多类型,情感图,加载更多,多选,群组等))

    DslAdapter Kotlin时代的Adapter Dsl 的形式使用 RecyclerView Adapter 支持情感图状态切换 加载更多 多类型Item等 有何用 只有一个目的高效开发 一切都是为了效率 可能以前写界面 还在为了继
  • PageRank算法 到 textRank

    1 PageRank 算法概述 PageRank 即网页排名 xff0c 又称网页级别 Google 左侧排名或佩奇排名 是Google创始人拉里 佩奇和谢尔盖 布林于1997年构建早期的搜索系统原型时提出的链接分析算法 xff0c 自从G
  • 2015年阿里实习生面试总结

    2015年阿里实习生招聘总结 就在这学期作为大三的我 xff0c 本想在这个学期安安静静的学习 xff0c 9月份再参加招聘 xff0c 偶然在朋友那里听到了阿里实习生招聘的消息 xff0c 我还是挺喜欢阿里这个公司的 xff0c 氛围好
  • 揭秘Socket与底层数据传输实现

    揭秘socket 什么是socket xff1f socket字面意思其实就是一个插口或者套接字 xff0c 包含了源ip地址 源端口 目的ip地址和源端口 但是socket在那个位置呢 xff0c 在TCP IP网络的四层体系和OSI七层
  • tomcat的启动过程(Tomcat源码解析(三))

    Tomcat组件生命周期管理 在 Tomcat总体结构 xff08 Tomcat源代码解析之二 xff09 中 xff0c 我们列出了Tomcat中Server Service Connector Engine Host Context的继
  • Tomcat请求处理过程(Tomcat源码解析五)

    前面已经分析完了Tomcat的启动和关闭过程 xff0c 本篇就来接着分析一下Tomcat中请求的处理过程 在开始本文之前 xff0c 咋们首先来看看一个Http请求处理的过程 xff0c 一般情况下是浏览器发送http请求 gt 建立So
  • Tomcat 设计模式总结(Tomcat源代码阅读系列之八)

    本篇我们将来分析一下Tomcat中所涉及到设计模式 xff0c 本文我们将主要来分析 外观模式 xff0c 观察者模式 xff0c 责任链模式 xff0c 模板方法模式 命令模式 在开始本文之前 xff0c 笔者先说明一下对于设计模式的一点
  • TCP三次握手及关闭时的2MSL分析

    TCP IP三次握手四次挥手 xff0c 是非常重要的 xff0c 这个链接与关闭过程也是很简单的 xff0c 但为什么是三次握手 xff1f 以及为什么要等待2MSL的状态 xff1f 大部分人也许听到这个问题就蒙了 xff0c 这篇博客
  • HashTable源码剖析

    lt span style 61 34 font size 14px font weight normal 34 gt public class Hashtable lt K V gt extends Dictionary lt K V g
  • HashMap源码剖析

    大部分思路都是一样的 xff0c 只是一些细节不一样 xff0c 源码中都标了出来 jdk容器源码还是挺简单的 public class HashMap lt K V gt extends AbstractMap lt K V gt imp
  • Android设置/配置页面,androidx.preference的使用

    一场与Preference的战争 一 介绍二 简单使用以下将会通过简单的Demo实现Preference的样例引入build gradleMainActivity javaactivity main xmlSettingFragment j
  • Android--›迁移到AndroidX指南(含包依赖关系)

    AndroidX发布已经有段时间了 相应的包也都出了1 0 0正式版本 顺势而为 才能得以生存 是时候迁移到AndroidX了 迁移操作本身是很简单的 有菜单命令一键搞定 如下 你以为这样就完事了 还真是 项目妥妥的跑起来了 还不算完事吗
  • 【TensorFlow 入门】2、优化器函数 Optimizer

    文章目录 一 常用的optimizer类二 注意事项 xff1a 在使用它们之前处理梯度三 选通梯度 因为大多数机器学习任务就是最小化损失 xff0c 在损失定义的情况下 xff0c 后面的工作就交给了优化器 因为深度学习常见的是对于梯度的
  • 地面坐标系与机体坐标系的转换和欧拉角

    大家在入门四旋翼飞行器数学模型时第一个遇到的就是坐标系的转换 这篇文章用尽量浅显的语言为大家讲解坐标系的转换的欧拉角 机体坐标系 原点O取在飞机质心处 Xb轴指向机头 Yb轴指向机身右方 Zb指向机身下方 地面坐标系 在地面上选一点Og x
  • 九、设置元素等待

    转载于 xff1a http www testclass net selenium python element wait WebDriver提供了两种类型的等待 xff1a 显式等待和隐式等待 显式等待 显式等待使WebdDriver等待
  • find big file

    bin bash command usage description function usage echo e 34 Usage nt 0 DIR NAME 34 exit Check if user is root if id u 61
  • apache启动报错(98)Address already in use: make_sock: could not bind to address [::]:80 (98)Address alrea

    etc init d httpd restart Starting httpd 98 Address already in use make sock could not bind to address 80 98 Address alre
  • linux 查看目录大小和查看磁盘使用情况

    作者 xff1a 北南南北 来自 xff1a LinuxSir Org 提要 xff1a Linux 磁盘分区表 文件系统的查看 统计的工具很多 xff0c 有些工具是多功能的 xff0c 不仅仅是查看磁盘的分区表 xff0c 而且也能进行
  • Sublime Text 2 for Linux 的安装、配置汇总

    Sublime Text 2是一款跨平台文本编辑器 xff0c 支持Windows xff0c Linux xff0c Mac os 特色功能 xff1a 良好的扩展功能 Package 右边没有滚动条 xff0c 取而代之的是代码缩略图
  • Vim的行号、语法显示等设置(.vimrc文件的配置)以及乱码解决

    在终端下使用vim进行编辑时 xff0c 默认情况下 xff0c 编辑的界面上是没有显示行号 语法高亮度显示 智能缩进 等功能的 为了更好的在vim下进行工作 xff0c 需要手动设置一个配置文件 xff1a vimrc 在启动vim时 x