实现一个neovim插件转换unicode字符到中文显示
上一篇讲了如何通过nvim-oxi实现一个neovim插件nvim_rotate_chars来轮转字符,这一篇通过采用相关技术实现了一个unicode字符表示转换成汉字显示。这些工具在日常开发和工作中都可以用到,自己实现一个也可以学到新东西练练代码手感。
之前在文章unicode编码和utf-8转换不同语言实现的差别?以及locale杂谈中讲到过由于系统的locale设置不正确,遇到unzip解压出来的中文文件名称都变成了unicde的16进制字符表示。当然也介绍了如何使用python、c++以及rust实现转换。在这里我们将实现移植到了neovim插件中,打开文件一键转换。
实现的效果是这样:
简介¶
使用 nvim-oxi
编写一个将选中的 \uXXXX
Unicode 编码转换为汉字字符的 Neovim 插件KenForever1/nvim_unicode_converter。
实现细节¶
核心功能实现¶
在 src/lib.rs
中实现插件的核心功能,通过nvim-oxi提供的api获取选中的当前行,通过正则表达式regex匹配uxxxx格式,转换替换。
use nvim_oxi as oxi;
use oxi::{api, Dictionary, Function, Object};
use regex::Regex;
#[oxi::plugin]
fn nvim_unicode_converter() -> Dictionary {
let convert_unicode = Function::from_fn(|()| {
// 获取当前选中的文本
let current_selection = api::get_current_line().unwrap();
// 正则表达式匹配 \uXXXX 格式
let re = Regex::new(r"\\u([0-9a-fA-F]{4})").unwrap();
// 替换匹配的部分
let converted = re.replace_all(¤t_selection, |caps: ®ex::Captures| {
let code_point = u32::from_str_radix(&caps[1], 16).unwrap();
std::char::from_u32(code_point).unwrap().to_string()
});
// 将结果替换到当前行
let _ = api::set_current_line(converted);
});
Dictionary::from_iter([("convert_unicode", Object::from(convert_unicode))])
}
[package]
name = "nvim_unicode_converter"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
[dependencies]
nvim-oxi = { version = "0.5.1", features = ["neovim-0-10"] }
regex = "1.11.1"
neovim插件lua配置¶
查看runtimepath 获取 rplugin 的路径
:lua print(vim.inspect(vim.api.nvim_list_runtime_paths()))
要在 Neovim 中使用这个插件,需要在你的 init.lua
(或 init.vim
)中加载这个 Rust 插件。假设你已经将编译好的库放在 ~/.config/nvim/rplugin/rust
中:
-- 绑定命令或按键调用插件
vim.api.nvim_set_keymap('v', '<leader>u', ':lua require("nvim_unicode_converter").convert_unicode()<CR>', { noremap = true, silent = true })
1801\u4e07\u91cc\u957f\u57ce\u6c38\u4e0d\u5012_123445_5_3811-3826s_000004.jpg
\uXXXX
的文本,然后按下你绑定的快捷键(如 <leader>u
),即可将选中的 Unicode 编码转换为实际字符。
通过这篇文章,您学会了rust和lua配合给neovim实现一个自定义的插件,又多了一个武器技能。 感谢您的阅读!!!开源地址:KenForever1/nvim_unicode_converter。