【vimsolo】让vim看起来像VSCode:颜色主题和状态栏的配置

文章目录

    • 1. 目的
    • 2. 理念: vimsolo
    • 3. vimrc: 配置颜色
    • 4. vimrc: 配置状态栏
    • 5. 拷贝颜色主题和.vimrc: python安装脚本

在这里插入图片描述

1. 目的

习惯了 VSCode 默认的配色:黑色主题,蓝色状态栏。偶尔使用 Vim 时想让 vim 伪装的像 VSCode,不考虑花里花哨的插件和动态效果,静态效果上让 vim 看起来像 VSCode,怎样实现呢?

2. 理念: vimsolo

vimsolo = vim + solo,除了颜色主题可以用第三方插件, 其他配置都用 .vimrc 手工完成,不依赖库插件。

vimsolo 的理念是: vim 插件如果装多了,配置繁杂,受网络影响较大,还需要适配不同 vim/nvim 版本和 nerdfont 字体, 而是极致的简洁。

3. vimrc: 配置颜色

VSCode 颜色主题的 vim 插件有好几个, 我用的是 codedark https://github.com/tomasiser/vim-code-dark

vimrc 中的配置代码:
在这里插入图片描述

"--- color theme
set background=dark
try
    set t_Co=256
    set t_ut=
    colorscheme codedark
    ""colorscheme molokai
catch
    try
        colorscheme desert
    catch
        colorscheme peaksea
    endtry
endtry

用 vim 打开 Python 文件看看效果:
在这里插入图片描述

4. vimrc: 配置状态栏

状态栏的插件有很多,很容易陷入选择的困境,因为都太漂亮了;而一一尝试和配置会花费不少时间,但容易漂浮在插件开发者配置的表层。其实基于 vimL 徒手可以写一个 statuline:

  • 本质是给变量 statusline 赋值
  • 把 statueline 拆分为n部分,每部分是一个字符串变量,变量之间用 . 连接起来
  • 每部分大都可以从 vim 自带的变量或函数获取到,例如文件编码是 let l:encoding = ' %{&fenc} '

在这里插入图片描述
具体配置 vimL 脚本如下:

"======================================================================
" statusline
"======================================================================
"--- https://bruhtus.github.io/posts/vim-statusline/
"--- https://jdhao.github.io/2019/11/03/vim_custom_statusline/
" component for active window
function! StatuslineActive()
  " if we want to add `f` items in our statusline

let g:currentmode={
       \ 'n'  : 'NORMAL',
       \ 'v'  : 'VISUAL',
       \ 'V'  : 'V·Line',
       \ "\<C-V>" : 'V·Block',
       \ 'i'  : 'INSERT',
       \ 'R'  : 'R',
       \ 'Rv' : 'V·Replace',
       \ 'c'  : 'Command',
       \}

  "let l:current_mode = mode()
  let l:current_mode = ' ['.'%{toupper(g:currentmode[mode()])}'.'] '
  " if we want to add 'm' items in our statusline
  let l:cursor_position = ' Ln %l, Col %c'
  let l:indentation = ' %{(&expandtab=="1") ? "Spaces: ".&tabstop : "Tabs: ".&tabstop} '
  let l:encoding = ' %{&fenc} '
  let l:end_of_line_sequence = ' %{(&fileformat=="dos")? "CRLF" : "LF"} '
  let l:percent = ' %p%% '
  let l:language_mode = '%{&filetype}'
  " the `.` is basically to ignore whitespace before and put it right after the previous component
  let l:statusline_left = l:current_mode
  let l:statusline_middle = ''
  let l:statusline_right = l:cursor_position.l:indentation.l:encoding.l:end_of_line_sequence.l:percent.l:language_mode
  return l:statusline_left.'%='.l:statusline_middle.'%='.l:statusline_right
endfunction

" component for inactive window
function! StatuslineInactive()
  " the component goes here
endfunction

" load statusline using `autocmd` event with this function
function! StatuslineLoad(mode)
  if a:mode ==# 'active'
    " to make it simple, %! is to evaluate the current changes in the window
    " it can be useful for evaluate current mode in statusline. For more info:
    " :help statusline.
    setlocal statusline=%!StatuslineActive()
  else
    setlocal statusline=%!StatuslineInactive()
  endif
endfunction

" so that autocmd didn't stack up and slow down vim
augroup statusline_startup
  autocmd!
  " for more info :help WinEnter and :help BufWinEnter
  autocmd WinEnter,BufWinEnter * call StatuslineLoad('active')
  autocmd WinLeave * call StatuslineLoad('inactive')
augroup END

hi StatusLine ctermbg=32 ctermfg=254 guibg=#007acc guifg=#dfe9ed
"hi StatusLineNC ctermbg=240 ctermfg=240 guibg=#d0d0d0 guifg=#444444

hi StatusLineTerm ctermbg=32 ctermfg=254 guibg=#007acc guifg=#dfe9ed
"hi StatusLineTermNC ctermbg=252 ctermfg=240 guibg=#d0d0d0 guifg=#444444
"-- #007acc
"-- #dfe9ed

配置效果:
在这里插入图片描述

5. 拷贝颜色主题和.vimrc: python安装脚本

使用 Python 编写了安装脚本,相比于 shell 脚本,开发效率相当高, 平台兼容性更强。

import os
import shutil
import subprocess
import platform


def is_wsl():
    return 'microsoft-standard' in platform.uname().release

def is_windows():
    return platform.system().lower() == "windows"

def is_linux():
    return platform.system().lower() == "linux"

def is_macosx():
    return platform.system().lower() == "darwin"


class CommandRunner(object):
    @staticmethod
    def run(cmd, verbose = True):
        if (verbose):
            print('Executing cmd:', cmd)
        process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        if is_windows():
            # encoding = 'ISO-8859-1'
            encoding = 'gbk'
        else:
            encoding = 'utf-8'
        #print('encoding:', encoding)
        out_bytes = process.communicate()[0]
        err_bytes = process.communicate()[1]
        out_msg = out_bytes.decode(encoding)
        err_msg = out_bytes.decode(encoding)
        if (verbose):
            print('Command executing stdout: {:s}'.format(out_msg))
            print('Command executing stderr: {:s}'.format(err_msg))
        return out_msg, err_msg

def is_windows_git_bash():
    d = 'C:\\Users'
    return os.path.exists(d) and os.path.isdir(d)

def path_to_proper_abs_path(p):
    p_abs = os.path.abspath(p)
    if (is_windows_git_bash()):
        disk, remain = p_abs.split(':')
        res = "/{:s}/{:s}".format(disk, remain[1:])
        res = res.replace("\\", "/")
    else:
        res = p_abs
    return res

def copy_or_link_file(src, dst):
    # if is_windows_git_bash():
    #     shutil.copyfile(src, dst)
    # else:
    if (os.path.exists(dst)):
        os.remove(dst)
    elif (os.path.islink(dst)):
        os.remove(dst)
    src_abs = path_to_proper_abs_path(src) #os.path.abspath(src)
    dst_abs = path_to_proper_abs_path(dst) # os.path.abspath(dst)
    cmd = "ln -sf {:s} {:s}".format(src_abs, dst_abs)
    CommandRunner.run(cmd, True)


def copy_colors_dir(src_color_dir, dst_color_dir):
    os.makedirs(dst_color_dir, exist_ok=True)
    for item in os.listdir('colors'):
        src = 'colors/' + item
        dst = dst_color_dir + '/' + item
        copy_or_link_file(src, dst)

def get_vim_first_default_runtimepath():
    if (is_windows()):
        # return os.path.expanduser('~/vimfiles') # not working on windows 11
        return os.path.expanduser('~/.vim')
    elif is_macosx():
        return os.path.expanduser('~/vimfiles')
    elif is_linux():
        return os.path.expanduser('~/.vim')

def copy_vim_config():
    # copy .vimrc
    src = '.vimrc'
    dst = os.path.expanduser('~/.vimrc')
    copy_or_link_file(src, dst)

    vim_cfg_dir = os.path.expanduser('~/.vim')

    # copy colors dir
    rtp = get_vim_first_default_runtimepath()
    copy_colors_dir('colors', rtp + "/colors")

    # create undodir
    undodir = '{:s}/temp_dirs/undodir'.format(vim_cfg_dir)
    os.makedirs(undodir, exist_ok=True)


if __name__ == '__main__':
    copy_vim_config()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/23162.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

float浮点/double双精度浮点和二进制的相互转换,小白也能看明白!

二进制文件包含了太多的数据&#xff0c;如何看懂二进制文件&#xff0c;决定于基础。 文章目录 前言1、重点知识1.1何为二进制文件1.2浮点和双精度的浮点如何生成二进制1.2.1 float和double的基础知识1.2.2 IEEE754约束的重点1.2.3 浮点是如何表示二进制 1.3 例子说明 双精度d…

市面上常见的语音芯片的IO口有哪些作用

语音芯片的IO口有哪些作用&#xff1f; 语音芯片的IO口一般有多种用途&#xff0c;包括以下几种&#xff1a; 1. 语音输入&#xff1a;可以通过外部麦克风接口&#xff0c;将外部声音信号输入到语音芯片中&#xff0c;进行语音信号处理。 2. 语音输出&#xff1a;语音芯片可…

Java版电子招投标系统源码之了解电子招标投标全流程

随着各级政府部门的大力推进&#xff0c;以及国内互联网的建设&#xff0c;电子招投标已经逐渐成为国内主流的招标投标方式&#xff0c;但是依然有很多人对电子招投标的流程不够了解&#xff0c;在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同&#xff0…

【MySQL】实验十 E-R图

文章目录 1. 学校2. 院系3. 图书馆4. 舰队5. 工厂6. 网购7. IT8. 医院9. 公司1. 学校 设有如下实体: 班主任:工号、姓名、电话 班级:班号、专业、毕业总学分 学生:学号、姓名、性别、年龄 课程:课程号、课程名 上述实体中存在如下联系: (1)一个班主任管理一个班级,一…

字节跳动五面都过了,结果被刷了,问了hr原因竟说是...

摘要 说在前面&#xff0c;面试时最好不要虚报工资。本来字节跳动是很想去的&#xff0c;几轮面试也通过了&#xff0c;最后没offer&#xff0c;自己只想到几个原因&#xff1a;1、虚报工资&#xff0c;比实际高30%&#xff1b;2、有更好的人选&#xff0c;这个可能性不大&…

分布式事务

一、为什么需要分布式事务: 分布式事务是指 会涉及到操作多个数据库(服务)的事务。 其实就是将对 同一数据库&#xff08;服务&#xff09;事务的概念扩大到了多个数据库&#xff08;服务&#xff09;的事务。 目的是为了保证分布式系统中的数据一致性。 二、分布式事务XA规范…

RHCE第五次作业

1.总结变量的类型及含义&#xff1f; 2.实现课堂案例计算长方形面积&#xff1f;&#xff08;6种方式&#xff09; 3.定义变量urlhttps://blog.csdn.net/weixin_45029822/article/details/103568815&#xff08;通过多种方法实现&#xff09; 1&#xff09;截取网站访问的协议 …

如何在华为OD机试中获得满分?Java实现【字母组合】一文详解

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 每个数字对应多个字母,…

2023年,真的别裸辞....

作为IT行业的大热岗位——软件测试&#xff0c;只要你付出了&#xff0c;就会有回报。说它作为IT热门岗位之一是完全不虚的。可能很多人回说软件测试是吃青春饭的&#xff0c;但放眼望去&#xff0c;哪个工作不是这样的呢&#xff1f;会有哪家公司愿意养一些闲人呢&#xff1f;…

node.js PM2部署项目

文章更新 2023-05-21 更新NSSM安装服务的方式 pm2 是什么 pm2 是一个守护进程管理工具,它能帮你守护和管理你的应用程序。通常一般会在服务上线的时候使用 pm2 进行管理。本文围绕以下重点进行讲解&#xff1a;安装pm2&#xff1b;命令行部署到PM2&#xff1b;PM2查看日志等命…

PLX31-EIP-MBTCP 以太网/IP到Modbus TCP/IP

PLX31-EIP-MBTCP ProSoft Technology的EtherNet/IP to Modbus TCP/IP通信网关允许在支持EtherNet/IP的控制器或设备与Modbus TCP/IP控制器或设备之间进行高速双向数据传输。 我们的Modbus TCP/IP驱动程序具有多种客户端和服务器功能&#xff0c;可实现更快的数据传输。此外&a…

【Linux】普通用户无法使用sudo指令的方法

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

云计算安全

前言 什么是云计算&#xff1f; 云计算就是一种新兴的计算资源利用方式&#xff0c;云计算的服务商通过对硬件资源的虚拟化&#xff0c;将基础IT资源变成了可以自由调度的资源池&#xff0c;从而实现IT资源的按需分配&#xff0c;向客户提供按使用付费的云计算服务。用户可以…

智能排班系统 【管理系统功能、操作说明——中篇】

文章目录 页面与功能展示企业管理角色管理用户管理系统管理员身份使用企业管理员身份使用门店管理员身份使用 门店管理职位管理排班规则设置节日管理消息管理 页面与功能展示 企业管理 企业管理页面如图 34所示&#xff0c;在企业管理页面&#xff0c;系统管理员可以查询所注…

Unity Shader variants (shader 变体)

官方地址 https://docs.unity3d.com/cn/2022.2/Manual/SL-MultipleProgramVariants.html 教程可以看这里 https://www.jianshu.com/p/48ad75f0b4b9 https://www.jianshu.com/p/3e6b84317097 变种用我自己的理解就是 能用程序控制的shader 举个例子 这里声明了 a b c d 四个变…

cpu 内核 逻辑处理器的关系

6核CPU&#xff0c;12个逻辑处理器 一颗内核在一个时间片内只能执行一个内核线程&#xff1b;当物理CPU使用了超线程技术后&#xff0c;在CPU的一颗内核中&#xff0c;利用就是利用其中空闲的执行单元&#xff0c;模拟出另外一个核心&#xff08;并不是真正的物理运算核心&…

详解C语言assert宏

前言&#xff1a;我们经常在写代码时&#xff0c;发现一些大牛的代码中总有一句assert&#xff08;表达式&#xff09;&#xff0c;经过在网上的学习&#xff0c;笔者也浅显的了解了assert的相关知识&#xff0c;assert一般用于规范代码&#xff0c;避免不必要的错误&#xff0…

【WOA-LSTM】基于WOA优化 LSTM神经网络预测研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【机器学习】信息量、香农熵、信息增益(增加例子,方便理解)

这节可以搭配 【机器学习】Logistic回归&#xff08;重新整理&#xff09;信息量&#xff08;信息&#xff09;信息量公式的推理过程 香农熵信息增益 【机器学习】Logistic回归&#xff08;重新整理&#xff09; B站视频&#xff1a;“交叉熵”如何做损失函数&#xff1f;打包…

css元素的显示和隐藏

1. display显示隐藏 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><st…