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

news2024/11/27 0:50:11

文章目录

    • 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()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web 测试和 App 测试重点总结

单纯从功能测试的层面上来讲的话&#xff0c;App 测试、Web 测试在流程和功能测试上是没有区别的&#xff0c;但由于系统结构方面存在差异&#xff08;web 项目&#xff0c;b/s 架构&#xff1b;app 项目&#xff0c;c/s 结构&#xff09;在测试中还是有不同的侧重点内容&#…

ZED使用指南(八)Depth Sensing

ZED立体相机再现了人类双目视觉的工作方式。通过比较左眼和右眼看到的两种视图&#xff0c;不仅可以推断深度&#xff0c;还可以推断空间中的3D运动。 ZED立体相机可以捕捉到场景的高分辨率3D视频&#xff0c;通过比较左右图像之间的像素位移可以估计深度和运动。 深度感知 …

CTFHub-ctfhub-Git泄露-Log

CTFHub-ctfhub-Git泄露-Log 当前大量开发人员使用git进行版本控制&#xff0c;对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。请尝试使用BugScanTeam的GitHack完成本题 1、dirsearch扫描 github上下载dirsearch-master 命令F…

SpringMVC第二阶段:@RequestMapping注解详解

RequestMapping注解详解 RequestMapping是给个方法配置一个访问地址。就比如web学习的Servlet程序&#xff0c;在web.xml中配置了访问地址之后&#xff0c;它们之间就有一个访问映射关系。 1、value属性 value 属性用于配置方法对应的访问地址. /*** RequestMapping 可以配…

JavaScript实现背景图像切换3D动画效果

&#x1f431; 个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️ 作者简介&#xff1a;2022年度博客之星前端领域TOP 2&#xff0c;前端领域优质作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &am…

Flask全套知识点从入门到精通,学完可直接做项目

目录 Flask入门 运行方式 URL与函数的映射(动态路由) PostMan的使用 查询参数的获取 上传文件 其它参数 url_for 函数 响应-重定向 响应-响应内容 响应-自定义响应 Flask模板 模板介绍 模板的使用 模板-传参 模板使用url_for函数 过滤器介绍 Jinja模板自带过滤器 流程…

DTFT和DFT有何区别?一文为你讲解清楚

很多人在开始学习数字信号处理的时候&#xff0c;对于各种傅里叶变换特别是离散傅里叶变化的概念及作用完全不清楚&#xff0c;IC修真院在网上整理了关于DTFT、DFT的各知识点。下面就来了解一下关于DTFT和DFT的区别吧。 DTFT&#xff0c; DFT 的区别是含义不同、性质不同、用途…

Elasticsearch集群搭建与相关知识点整理

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章参考网上的课程&#xff0c;介绍Elasticsearch集群的搭建&#xff0c;以及Elasticsearch集群相关知识点整理。 如果文章有什么需要改进的地方还请大佬不吝赐教&am…

C++刷题--选择题4

1, 在&#xff08;&#xff09;情况下适宜采用 inline 定义内联函数 A 函数体含有循环语句 B 函数体含有递归语句 C 函数代码少、频繁调用 D 函数代码多&#xff0c;不常调用 解析 C&#xff0c;以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方…

SpringSecurity实现角色权限控制(SpringBoot+SpringSecurity+JWT)

文章目录 一、项目介绍二、SpringSecurity简介SpringSecurity中的几个重要组件&#xff1a;1.SecurityContextHolder&#xff08;class&#xff09;2.SecurityContext&#xff08;Interface&#xff09;3.Authentication&#xff08;Interface&#xff09;4.AuthenticationMana…

c++项目环境搭建(VMware+linux+ubantu+vscode+cmake)

想运行一个c项目&#xff0c;但是环境怎么整呢&#xff1f;b站走起&#xff01;&#xff01;&#xff01; 本文需要的安装包 链接&#xff1a;https://pan.baidu.com/s/1XJbR2F1boQ-CqV8P71UOqw 提取码&#xff1a;swin 一、在虚拟机中安装ubantu 八分钟完成VMware和ubunt…

Git命令大全,涵盖Git全部分类,非常值得收藏!

Git是一个分布式版本控制系统&#xff0c;可以让开发者在不同的平台和环境中协作开发项目。Git有很多命令&#xff0c;可以用来管理项目的状态、历史、分支、合并、冲突等。本文将介绍一些Git常用的命令&#xff0c;并给出示例和分类。 配置命令 配置命令可以用来设置Git的全局…

算法设计与分析:贪心法

目录 第一关&#xff1a;贪心法 任务描述&#xff1a; 相关知识&#xff1a; 贪心法的优缺点&#xff1a; 例题&#xff1a; 解题分析&#xff1a; 程序实现&#xff1a; 关键代码&#xff1a; 编程要求&#xff1a; 测试说明&#xff1a; 第二关&#xff1a;最小生成…

体验了下科大讯飞版ChatGPT,厉害了!

前几天科大讯飞的星火认知大模型发布了&#xff0c;我刚好有朋友在科大讯飞工作&#xff0c;于是就第一时间体验了一波。 一番体验下来确实比我预想的效果要好&#xff0c;没想到国产模型的效果还不错&#xff0c;我试了很多方面&#xff0c;比如通用常识功能、写作功能、学习…

【论文阅读】基于鲁棒强化学习的无人机能量采集可重构智能表面

只做学习记录&#xff0c;侵删原文链接 article{peng2023energy, title{Energy Harvesting Reconfigurable Intelligent Surface for UAV Based on Robust Deep Reinforcement Learning}, author{Peng, Haoran and Wang, Li-Chun}, journal{IEEE Transactions on Wireless Comm…

今日不足——学习目标做了但是没执行

今天复习概率论的时候我发现我复习数值计算方法的时候没有严格按照步骤来&#xff0c;如果按照步骤来我的最小二乘本来可以不用错的。我在复习时候的步骤之间就是抛开书本然后之间进入应用然后遇到不会的回头复习概念虽然缺失能做题目了但是不了解每个知识点的原理和思想&#…

el-drawer 被遮罩层覆盖 显示异常

这是由于元素的一些层级设置不同导致的&#xff0c;所以蒙层被放在了最顶端。解决方法就是加上如下2行代码: <el-drawer title"我是标题" :visible.sync"showDrawer" :direction"ltr" :append-to-body"true":modal-append-to-body&…

【C++ STL】 list 模拟实现

文章目录 &#x1f4cd;前言&#x1f308;STL之list的模拟实现&#x1f388;list_node节点的定义&#x1f388;iterator迭代器&#x1f56f;️构造函数&#x1f56f;️*it&#x1f56f;️->&#x1f56f;️it/it&#x1f56f;️it--/--it&#x1f56f;️! / &#x1f388;l…

Web开发介绍

Web开发介绍 1 什么是web开发 Web&#xff1a;全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 所以Web开发说白了&#xff0c;就是开发网站的&#xff0c;例如下图所示的网站&#xff1a;淘宝&#xff0c;京东等等 那么我们…

如何使用sbvadmin进行私有化部署的代码开发

前言 本文主要讲述如何使用sbvadmin进行私有化部署的代码开发&#xff0c;这里我们用的私有化仓库是gitee&#xff0c;当然你也可以用自己搭建的gitlab来做&#xff0c;原理差不多。 一、新建仓库 1.后端api 导入后端仓库&#xff1a;https://github.com/billyshen26/sbvadmi…