深入理解vim编码设置,第1张

vim的使用环境比较复杂,可以通过terminal在本地使用(比如Mac或Linux主机),也可以ssh连接到远程服务器使用,还可以使用gvim。这里主要讨论terminal下的使用,搞清楚了vim在terminal下的编码设置,gvim相对更简单,自然也就了解了

首先我们要理解字符字节的区别,字符是用来显示的,而字节是存储和传输时使用,网络传输的是字节流,文件存储的也是字节流,而编辑器要显示文件内容,就需要转化为字符来显示,字符和字节之间的关系可以定义如下

可见encode和decode是一对逆向操作,它们都需要指定编码方案,如果编码方案不一致,则会操作失败

通过terminal操作远程vim时,其数据流向可以表示如下

在这个流向里,只有terminal和vim需要显示字符,其它进程或服务只是做数据传输,如果只是单纯传递二进制数据,是不需要涉及编码解码的,只有当显示字符的时候才需要进行解码,因此只有terminal和vim需要配置编码,而terminal需要和本地shell打交道,远程vim也需要和shell打交道,shell的编码也至关重要

terminal本身也是一个进程,最终的字符显示都需要由terminal来完成,我们在terminal上输入字符也会由它进行编码之后再传递,简单来说就是

这里编解码方案就是terminal需要配置的

locale命令也可查看shell编码设置,以LC_开头的代表系统不同类别的编码方案,分为如下几类

至于最终选什么方案,其优先级如下

也就是说一切都以LC_ALL为主,如果没有设置,则查找LC_对应的设置项,如果仍旧没有,则使用LANG的设置,影响字符显示的为LC_CTYPE项,为了便于描述,后续提到shell编码时一律指LC_ALL项,设置shell编码方式如下

假设我们本地terminal编码设置为UTF-8,shell编码设置为GBK,当我们在terminal上输入中文字符时,会显示为乱码或不显示

我们分析一下在终端输入shell命令时的数据交互

将terminal和shell看做两个服务,它们之间需要进行数据交互,在发送数据时进行编码,在收到数据时会进行解码,如果编码方案和解码方案不一致,就会导致乱码或失败,表现形式就是在terminal上输入中文命令时会显示异常,执行结果也不符合预期

如果用ssh登陆远程shell,则远程shell的编码配置和本地shell一致,在通过 ssh -v 可以打印ssh在登陆过程中做了哪些事

因此我们第一个要点是

vim和编码相关的有4个设置项

可见vim的编码设置相当复杂,我们还是以具体的实例来分析这些编码设置的作用

不管是打开本地vim,还是打开远程vim,我们首先保证本地shell的编码设置和terminal一致,这样涉及到编解码的数据流可以简化为

vim打开文件,最终还是在terminal上显示,这个过程和编码设置相关的有

可见vim在打开文件并显示的过程中有大量的编码转化操作,将二进制从编码A转化为编码B的步骤为

最终输出仍旧为字节流,如果A和B不同,则输出字节流和输入就不一样(ascii字节流除外,在所有编码方案里ascii字符对应的字节流都是一样的)。转换成功的前提是,decode所采用的编码方案必须和输入字节流编码方案一致,也就是说如果输入字节流是采用C编码方案生成的,采用A编码方案去解码就会失败

如果vim的某些编码项没有设置,会使用其依赖项的设置或默认设置,依赖关系如下

vim的这些编码设置项里通常我们只设置fileencodings和encoding,如果只在中英文环境下使用,可设置如下

encoding一定要设置utf8,因为utf8可以表示所有字符

假设terminal编码设置为gbk,vim的encoding为utf8,此时我们打开一个文件,不管这个文件是utf8还是gbk编码,它都无法正常显示

前面提到,vim的termencoding默认会继承encoding的设置,对应前面打开文件的步骤如下

如果要正常显示,只需要临时修改vim的termencoding编码和terminal编码一致即可,termencoding只涉及到显示,不涉及文件内容的改变,切勿修改encoding项,准确来说,在任何时候都不要试图修改encoding设置

因此我们的第二个要点是

如果说打开文件的数据流是从vim到terminal,那修改文件则是从terminal到vim再到terminal这么一个来回

和编码相关的步骤如下,打开文件显示的过程前面已经描述过,这里只说修改和保存的过程

fileencoding有两种情况

由上可见,encoding方案编码的数据在vim中是一个中转站,接收数据时(从文件读取或从终端输入)都要转化为encoding编码方案,保存文件时再由encoding编码方案转化为fileencoding编码方案。因此encoding必须设定为一个能表示所有字符的编码方案,通常我们设置为utf8

假设terminal和shell的编码设置均为gbk,vim的encoding设置为utf8,如果想正常输入和显示字符,必须将termencoding设置和terminal编码一致,这是不管是显示字符还是输入字符保存文件,都可以正常工作

我们可以设置编码不一致只是为了演示编码的影响,在实际环境中,必须保证这些编码设置都一致,因此终极要点是

用主机去连接虚拟机报了一下错误:

首先确定密码没有问题

其次发现我第一次连接可以连,第二天要连接连接不上去

解决方法:

第一,我用ip可能冲突的方法,更改了dns服务器,重启了服务器,但是ip没有变,还是没有解决问题

sshd的设置不允许root用户用密码远程登录修改 vim /etc/ssh/sshd_config修改:

1、将PermitRootLogin no改成PermitRootLogin yes

2、service sshd restart

linux服务器下有vim吗?

linux服务器登入后自带vim命令

vim在linux下中如何设置显示行数?

在linux环境下的编辑器有vi、vim、gedit等等。进入这些编辑器之后,为了方便我们需要编辑器显示出当前的行号,可偏偏编辑器默认是不会显示行号的。我们有二种办法可以解决:

第一种是,手动显示:在vim命令行模式下输入:setnu

取消显示:在vim命令行模式下输入:setnonu

第二种是,永久自动显示:我们修改一个配置文件。

我们输入命令:vim~/vimrc

打开后是一个空文件,我们添加setnu,保存退出,再次进入vim编辑器,就会自动显示出行号了。如此简单

Linuxvim如何保存退出?

1、在vi命令下,先按键盘esc键,再按(英文冒号)

2、输入"wq"

3、回车即可保存并退出vi命令,回到主shell界面

如何编译运行Linux系统里Vim编辑器编写的程序?

那要看Vim编辑器编写的程序是哪种编程语言了,如果是C代码,就用gcc命令编译;如果是C++代码,就用g++命令编译(也可以用gcc命令编译,前提是需要安装g++)。一般在Linux上需要编译运行的,就是C或者C++代码了,编写的脚本代码(比如shell脚本、Python、Perl等)都是直接运行。

linux系统vim中如何查看每行是否有空格?

linux系统vim中在命令模式下通过命令/来查看每行是否有空格。

xshell软件

linux系统

使用xshell远程连接我旁边的Ubuntu时,root用户登陆,密码正确,但是显示

“ssh服务器拒绝了密码。请再试一次”

原因:ssh服务基于安全考虑,没有给root用户远程连接的权限

解决办法:

登陆要连接的Ubuntu

vim /etc/ssh/sshd_config

找到PermitRootLogin 这一行,将后面的no 改为yes ,如图所示

此时再次利用xshell登陆root账户即可。

如果还是连不上,就要考滤iptables是否开启22号端口

云服务器还要考虑安全组是否开放22号端口。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 深入理解vim编码设置

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情