由于git
,我在多个Linux系统(目前Kubuntu和OpenSuse)上使用相同的vim设置。我想为各种发行版使用不同的配色方案。
所以我创建了一个插件plugin/mycolor.vim
,我从/etc/os-release
获取发行版名称,然后使用
if s:distro ==? "openSUSE"
blabla
else
blabla2
endif
/etc/os-release
看起来像
NAME="Ubuntu"
VERSION="13.04, Raring Ringtail"
[...]
或
NAME=openSuse
VERSION="13.1 (Bottle)"
获取我发现的发行版名称的最短路径(有一些帮助)是
let distro = system(". /etc/os-release; echo -n $NAME")
但是获取文件的想法有点让人感到不安,尽管看起来源不会在系统调用之外传播。
我发现的另一种更长,更安全的方式是:
let s:distro = system("awk '/^NAME=/ {print $1}' /etc/os-release")
let s:distro = split(substitute(s:distro, "\n", "", ""), "=")[1]
let s:distro = substitute(s:distro,'"', "", "g")
第一行获取包含NAME=
的所有行包含新行字符。第二行删除新行并在=
之后返回该部分。如果有的话,第三行将删除"
。
这是获得发行版名称还是存储在某个vim变量中的更好方法?
答案 0 :(得分:3)
由于Vim是多平台的,它试图尽可能地避免特定于平台的东西。因此,没有内置变量;你只能使用has('unix')
来检查一般的Unixoid操作系统。
我会使用您的第一种方法来寻找/etc/os-release
(调用lsb_release -is
也可能有用);因为它只调用shell,它可能比使用AWK解析更有效。您还可以在Vimscript中读取文件(通过readfile()
)并在那里进行解析,但这只会为使用的语法添加其他依赖项。
当为system()
启动新的shell时,这在Vim中没有副作用。此外,由于数据文件位于/etc
下,因此只有具有管理权限的用户才能更改它,因此不存在安全风险。
如果您需要其他特定于系统的Vim配置(例如,不同的窗口大小或字体),优雅的方法是将以下内容添加到~/.vimrc
:
" Source system-specific .vimrc first.
if filereadable(expand('~/local/.vimrc'))
source ~/local/.vimrc
endif
在该本地配置文件中,您可以定义g:distro
配置变量。这会复制实际信息并需要一些手动设置,但会避免每个Vim启动时的系统调用。
答案 1 :(得分:1)
如果您想为不同的计算机/系统设置不同的设置,我会使用Ingo。创建自己的配置部分,并在您的公共vimrc源中创建特定的配置。我以这种方式在三台计算机中管理.zshrc
。
如果您只想从/etc/os-release
获取字符串,可以尝试:
let dis = system("awk -F= '$1==\"ID\"{printf $2}' /etc/os-release")
这里打印arch
(我在archlinux上运行)。我选择了ID
而不是NAME
,因为NAME
可能有空格。
如果您愿意,可以尝试处理文件/etc/issue
,如果您的所有系统都有该文件。