惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
The Register - Security
The Register - Security
MongoDB | Blog
MongoDB | Blog
U
Unit 42
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
P
Privacy International News Feed
L
LINUX DO - 最新话题
博客园_首页
博客园 - Franky
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tor Project blog
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
K
Kaspersky official blog
C
Cisco Blogs
博客园 - 【当耐特】
阮一峰的网络日志
阮一峰的网络日志
I
Intezer
罗磊的独立博客
MyScale Blog
MyScale Blog
Last Week in AI
Last Week in AI
A
About on SuperTechFans
G
GRAHAM CLULEY
Y
Y Combinator Blog
Microsoft Security Blog
Microsoft Security Blog
GbyAI
GbyAI
T
Threat Research - Cisco Blogs
P
Proofpoint News Feed
D
DataBreaches.Net
The Hacker News
The Hacker News
Spread Privacy
Spread Privacy
AWS News Blog
AWS News Blog
I
InfoQ
T
The Exploit Database - CXSecurity.com
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - 叶小钗
Project Zero
Project Zero

lvbibir's Blog

shell | 磁盘空间分析脚本 Linux cat 和 tee 命令写入文件 python | 使用 uv 管理你的 python 环境 Claude Code 完整配置指南 windows | mihomo 内核独立部署指南 linux | 磁盘扩容 wsl | 释放长久运行占用的磁盘空间 mysql | 线程上限问题处理 麒麟 7.6 安装谷歌 OTP 认证模块 suse 12sp5 升级 openssh 及 openssl suse 12sp5 部署 mysql 5.7 《谁的青春不迷茫》 docker | centos7 部署 docker windows | rime 输入法 & 雾凇方案 shell | sshpass 批量传输文件及执行命令 wsl | 原生 linux 方式安装 docker nodejs | fnm + pnpm 开发环境配置 wsl | 安装配置 miniconda 虚拟环境 wsl | 自动更新系统代理 wsl | bashrc 环境变量不正确加载的处理方法 wsl | win10 安装 wsl2 troubleshooting | ssh 成功但是 scp 失败 linux | 常用命令总结 docker 部署 piclist shell | 检测网站存活并自动钉钉告警 Zabbix | 监控端口连通性并自动追踪 TCP 路由 windows | 自定义开机快速启动项 windows | miniconda 配置 python 虚拟环境 Zabbix | 监控主机到指定 ip 的流量大小 shell | centos 初始化 loki (二) 部署 loki (一) 简介 prometheus (六) Alertmanager prometheus (五) 记录规则与告警规则 prometheus (四) 黑盒监控 prometheus (三) 服务发现 prometheus (二) 静态配置 prometheus (一) 简介及部署 traefik (四) TraefikService 服务 traefik (三) Middleware 中间件 traefik (二) ingressRoute 路由 traefik (一) 简介、部署和配置 kubernetes | Gateway API 简介及部署 linux | dns 配置文件中 search 和 options ndots 详解 kubernetes | command args 和 dockerfile 中的 ENTRYPOINT CMD kubernetes | statefulset 控制器详解 docker | dockerfile 最佳实践 docker | dockerfile 指令详解 linux | kill 命令详解以及 linux 中的信号 troubleshooting | elasticsearch 安装插件报错 shell | if 条件判断 docker | 下载外网镜像的几种方式 python | 鬼谷子数学问题 steam挂刀教程 linux | history 命令的格式化输出 shell | 将本地镜像批量推送到 harbor windows | hosts 文件修复 kubernetes | configmap & secret kubernetes | RBAC 鉴权和 NetworkPolicy kubernetes | service & ingress kubernetes | 存储 kubernetes | 滚动升级和自动伸缩 kubernetes | 控制器 kubernetes | 日志 kubernetes | 调度 kubernetes | pod kubernetes | 杂记 linux | set 命令详解 ceph | openeuler 部署 ceph-v16 ceph | ceph-v16 离线安装解决方案 pxe 如何应对复杂的服务器硬件环境 python | 批量修改目录下文件名 《微习惯》 ceph | openeuler (aarch64) 部署 ceph-v16 troubleshooting | glibc 误升级后修复 pxe 安装配置大全 《人间失格》 跑步日常 [置顶] Hello, hugo! shell | 检索某 url 中所有文件的内容 shell | 不同执行方式的区别 shell | 开启 debug 模式 vscode | 常见问题 windows & linux 多网卡时设置默认路由以及添加静态路由 mysql (二) 主从复制原理 GTID 并行复制 mysql (一) 部署 mysql | 杂记 cicd | jenkins 部署 mall-swarm 项目 httpd 源码打包编译成 rpm 包 openssl 源码打包编译成 rpm 包 centos7 | 修改网卡名称 ceph | pool pg_num 配置 docker | 脚本方式批量导出/导入镜像 centos 密码尝试次数过多问题处理 centos7 | 升级内核至 5.10 CVE-1999-0526 ceph | centos7 部署 ceph-v12 python | 修改 pip 源 troubleshooting | 安装 cloud-init 后导致 ssh 连接失败 windows | autohotkey 常用脚本
vim | 基础配置和使用
lvbibir · 2024-02-04 · via lvbibir's Blog
文章目录
  • 0 前言
  • 1 vim 通用操作
    • 1.1 示例
    • 1.2 operator 操作符
    • 1.3 motion 动作
    • 1.4 文本对象
  • 2 vscode 中的 vim
    • 2.1 easymotion
    • 2.2 surround
    • 2.3 multi-cursor 多光标
    • 2.4 其他操作
  • 3 vimrc

0 前言

本文参考以下链接:

一直憧憬 vim 的全键盘操作, 于是开始折腾将 obsidian 和 vscode 的编辑模式都转到 vim, obsidian 使用自带的 vim 模式加 vimrc 插件, vscode 使用 vim 插件

为了保持 obsidian, vscode, wsl 及 linux 中的 vim 习惯一致, 我的 vim 使用理念:

  • 尽量使用 vim 原生自带的功能, 拒绝任何三方插件
  • 尽量使用各平台通用的 vimrc 配置 (除了 vscode 使用 setting.json)

1.1 示例

vim 中的操作都是通过如下方式进行操作的:

  • [数字] <操作符> <动作>/<文本对象>
  • <操作符> [数字] <动作>/<文本对象>
>i{      | 将当前 {} 内的内容向右缩进
dfa      | 删除直到 a 字符
d/hello  | 删除直到 hello
ggyG     | 复制整个文档
dip      | 删除整个段落
ciw      | 更改当前 word
cit      | 更改当前 html 标签的内容

1.2 operator 操作符

d   | 删除
y   | yank (复制)
c   | 更改 (删除然后插入)
p   | 粘贴
=   | 格式代码
g~  | 切换案例
gU  | 大写
gu  | 小写
>   | 右缩进
<   | 左缩进
!   | 外部程序过滤

1.3 motion 动作

基础动作

h/j/k/l      | 左/下/上/右
ctrl + u/d   | 上/下 半页
ctrl + b/f   | 上/下 翻页

字 (词)

b/w   | 上一个/下一个 单词开始
ge/e  | 上一个/下一个 单词末尾

字符串

Fe/fe   | 移动到上一个/下一个 e
To/to   | 在上一个/下一个 o 之前/之后移动
| / n|  | 转到一个 /n 列

文档

gg/G    | 第一行/最后一行
:n/nG   | 转到第 n 行
{ / }   | 上一个/下一个空行

窗口

H/M/L      | 上/中/下 屏幕
zt/zz/zb   | 上/中/下 这条线

1.4 文本对象

inner(内部) / around(周围)

p         | 段落
w         | 单词
W         | WORD(被空格包围)
s         | 句子
[({<>})]  | [], (), {} 或者 <> 块
'"\`      | 带引号的字符串
b         | 同 ()
B         | 同 {}
t         | html 标签块

2 vscode 中的 vim

下述功能源于 vscode vim 插件

2.1 easymotion

<leader><leader>s<str>  | 可以快速向后查找
<leader><leader>f<str>  | 可以快速向前查找

2.2 surround

cs"'          | 将 `"` 替换为 '
ds"           | 删除包围的 "
ys<motion>"   | 添加包围的 ", 如 ysiw"

2.3 multi-cursor 多光标

可以使用 gb 代替 vscode 中的 ctrl-d

2.4 其他操作

gh  | 可以模拟鼠标悬浮
gd  | 可以切换定义

3 vimrc

vimrc 的位置:

  • obsidian: 在插件配置中我将 vimrc 的默认文件名从 .obsidian.vimrc 改成了 .vimrc 存放到了 obsidian 仓库的根目录
  • wsl: 我的 wsl 是 ubuntu, 为了使用 sudo 时 vimrc 配置生效, vimrc 修改通过修改 /etc/vim/vimrc.local 实现
  • vscode: vscode 直接使用 setting.json 中 vim 的配置

我的 vimrc 配置示例

" 显示相关
set number                    " 显示绝对行号 (配合 rnu 使用)
set relativenumber            " 相对行号
set cursorline                " 高亮当前行
set showcmd                   " 显示命令
set showmode                  " 显示当前模式
set ruler                     " 显示光标位置
set laststatus=2              " 始终显示状态栏

" 搜索相关
set incsearch                 " 增量搜索 (边输入边搜索)
set hlsearch                  " 高亮搜索结果
set ignorecase                " 搜索忽略大小写
set smartcase                 " 有大写字母时区分大小写

" 编辑体验
set backspace=indent,eol,start  " 让退格键正常工作
set whichwrap+=<,>,h,l        " 行首行尾可以跨行移动
set scrolloff=5               " 光标上下保留 5 行
set sidescrolloff=5           " 光标左右保留 5 列

" 缩进设置
set expandtab                 " 用空格代替 tab
set tabstop=2                 " tab 显示为 2 个空格
set shiftwidth=2              " 缩进宽度
set softtabstop=2             " 编辑时 tab 的宽度
set autoindent                " 自动缩进
set smartindent               " 智能缩进 (针对 C 语言)

" 显示不可见字符 (可选, 但很有用)
set list
set listchars=tab:▸\ ,trail:·,extends:>,precedes:<,nbsp:+

" 文件相关
set autoread                  " 文件在外部修改时自动重新读取
set hidden                    " 切换 buffer 时不需要保存
set encoding=utf-8            " 使用 UTF-8 编码
set fileencoding=utf-8        " 文件编码

" 补全相关
set wildmenu                           " 命令行补全增强
set wildmode=longest:full,full         " 补全模式
set completeopt=menu,menuone,noselect  " 补全选项

" 备份和撤销
set nobackup                  " 不创建备份文件
set nowritebackup             " 写入时不备份
set noswapfile                " 不创建交换文件

" ============ 状态栏 ============
set statusline=
set statusline+=%f              " 文件名
set statusline+=%m              " 修改标志
set statusline+=%r              " 只读标志
set statusline+=%=              " 右对齐
set statusline+=%y              " 文件类型
set statusline+=\ %{&fileencoding?&fileencoding:&encoding}  " 编码
set statusline+=\ [%{&fileformat}]  " 文件格式
set statusline+=\ %p%%          " 百分比
set statusline+=\ %l:%c         " 行号:列号

" ============ 分屏设置 ============
set splitbelow                " 水平分屏在下方
set splitright                " 垂直分屏在右侧

" 分屏快捷键
nnoremap <C-h> <C-w>h         " 左窗口
nnoremap <C-j> <C-w>j         " 下窗口
nnoremap <C-k> <C-w>k         " 上窗口
nnoremap <C-l> <C-w>l         " 右窗口

" 插入模式下使用 jj 快速返回到 normal 模式
inoremap jj <Esc>

" 使上下移动的时候按照视觉的行数移动, 对于多行的段落很有效
nmap j gj
nmap k gk

" 快捷行首和行尾
" normal 模式使用
nmap H ^
nmap L $
" visual 模式使用
vmap H ^
vmap L $
" 操作模式使用, 用于 yL, dH 等操作
omap H ^
omap L $

vscode 中的 vim 配置示例

// ==================== Vim 扩展设置 ====================
"vim.leader": "<space>",                             // Leader 键设为空格
"vim.incsearch": true,                               // 增量搜索
"vim.easymotion": true,                              // 启用 EasyMotion
"vim.useSystemClipboard": true,                      // 使用系统剪贴板
"vim.hlsearch": true,                                // 高亮搜索匹配
"vim.useCtrlKeys": false,                            // 禁用 Vim 接管 Ctrl 键
"vim.handleKeys": {                                  // 指定由 Vim 处理的按键
    "<C-v>": true,
    "<C-u>": true,
    "<C-d>": true,
    "<C-r>": true
},
"vim.insertModeKeyBindings": [
    { "before": ["j", "j"], "after": ["<Esc>"] }     // jj 退出插入模式
],
"vim.normalModeKeyBindingsNonRecursive": [
    { "before": ["j"], "after": ["g", "j"] },        // j 按显示行移动
    { "before": ["k"], "after": ["g", "k"] },        // k 按显示行移动
    { "before": ["K"], "commands": ["lineBreakInsert"], "silent": true },  // K 插入换行
    { "before": ["L"], "after": ["$"] },             // L 跳到行尾
    { "before": ["H"], "after": ["^"] }              // H 跳到行首
],
"vim.operatorPendingModeKeyBindings": [
    { "before": ["L"], "after": ["$"] },
    { "before": ["H"], "after": ["^"] }
],
"vim.visualModeKeyBindingsNonRecursive": [
    { "before": ["L"], "after": ["$"] },
    { "before": ["H"], "after": ["^"] }
],
"extensions.experimental.affinity": {
    "vscodevim.vim": 1                               // Vim 扩展独立进程,提升性能
}

以上

wechat_pay

微信

alipay

支付宝