配置Vim从剪贴板读取截图自动生成到Hexo的目录中

  1. 搞定,gpt真的强大。就是整个代码块怎么不能格式化,这么丑。是不是无法识别 vimrc的语法格式。

2024-03-18 更新
发现了一个小的问题,就是插入链接后,光标停留的位置是行尾,还得移动几次才能到中括号里,这不是vim的风格,直觉肯定是可以的。但不知道怎么搞,用chatGPT吧,果然,搞成了。

在函数中加了两句代码。

1
2
3
4
5
6
7
8
9
10
11
12
" 记录当前光标位置
let save_cursor = getpos('.')

" 将 Hexo 图片链接插入到当前光标位置
execute 'normal i' . hexo_image_link

" 恢复光标位置并将光标移动到第二个字符后
call setpos('.', save_cursor)
execute 'normal! 2l'

" 进入插入模式
startinsert

搞定,gpt真的强大。
就是整个代码块怎么不能格式化,这么丑。是不是无法识别 vimrc的语法格式。

这两天本来是要写下SSL证书的,但是一时偏离了主题,想实现用vim编辑md文件的时候,因为粘贴图片不方便,就网上找相关的教程。但是发现一个问题,就是网上的教程大多不能很好的适用。原因就是,大多的时候你找到的教程,都是最后的结果,而没有这个摸索结果的过程,也许,大佬就是这么厉害。但是给后来者带来的问题,就是不知道历史,就难以借鉴。或许这个过程太过啰嗦吧。这里我就把这个过程记录下来。

网上找到一个ps1的脚本,把剪贴板的内容dump下来,生成文件,看着很不错,开始。
出错,出错信息没有截图。各种不行,后来自己想到用snipaste来试试,它有命令行,但是需要pro版才有这个命令行的功能。其实自己挺喜欢snipaste的,之前就想买个正版,但是因为免费的也够用,就没有买。这次也算支持下作者。99元。通过微软商店购买的,官网有通过其他网站购买的渠道链接。

摸索的过程中,第一,poweshell不了解,第二,vimrc不熟悉。都不懂,怎么搞?

嗯,听说人工智能很NB。

ChatGpt上场!

真的很NB,用的是3.5,就这,基本上就能满足很多的需求,并且给出额外的建议,同时自己也用了微软的coipot ,感觉功能强,但是效果没有chatgpt好。可能是colipot的侧重在于搜索,能在提供答案的同时,给出网页链接。

colipot使用界面(纯为测试这个功能而加的图

看到底部的“了解详细信息”,那里面就是网页的链接,但是,说真的,中文的搜索结果很一般,建议用英文,结果更准。

切入正题。先上脚本dump_clipboard_png.ps1。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
param (
[string]$screenshot_file
)

# 引入 PresentationCore 程序集,使脚本能够访问 Windows Presentation Foundation (WPF) 类库
Add-Type -Assembly PresentationCore

# 从剪贴板获取图像
$img = [Windows.Clipboard]::GetImage()

# 如果剪贴板中没有图像,输出消息并退出脚本
if ($img -eq $null) {
Write-Host "Clipboard contains no image."
Exit
}

# 将图像转换为指定的格式(在这里是 Rgb24)
$fcb = New-Object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)

# 输出找到的图像信息
Write-Host ("`nFound picture. {0}x{1} pixel. Saving to {2}`n" -f $img.PixelWidth, $img.PixelHeight, $screenshot_file)

# 打开或创建指定的文件,准备将图像保存到文件中
$stream = [IO.File]::Open($screenshot_file, "OpenOrCreate")

# 创建 PNG 编码器
$encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder

# 将图像帧添加到编码器
$encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb))

# 将编码后的图像保存到文件流中
$encoder.Save($stream)

# 关闭文件流
$stream.Dispose()

原文章是没有参数的,chatgpt给出了格式,另外对于chatgpt也不能全部相信,还是自己要有一定的基础,比如chatgpt第一次给出的是两个参数,用了有问题,但是怎么也搞不定,仔细想了下,根本不用,完整的路径加文件名都已经在vimrc中生成了,直接给就行了么,这里有坑,就是在网上找的很多的时候,尤其要注意不要把多个拼起来,直接用完整的,然后出问题,问chatgpt,这样好一些。这次就是把两个地方的vimrc和在一起,搞晕了。是路径的问题,多出来一个powershell的命令,并且多了(^ ^)这样的符号。

重复PowerShell

调用Powershell要开启 一些参数,关闭安全选项。先贴上vimrc吧(还有问题,行号一编辑,就倒过来了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
" 设置编码
set encoding=utf-8

" 启用行号
set number

" 启用相对行号
set relativenumber

" 自动缩进
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set expandtab

" 显示行尾空格
set list
set listchars=trail:·

" 启用语法高亮
syntax enable

" 设置主题
colorscheme desert

" 设置字体
set guifont=Consolas:h14

" 启用搜索高亮
set hlsearch

" 启用鼠标支持
set mouse=a

" 设置剪贴板共享
set clipboard=unnamedplus

" Markdown 相关配置
au BufNewFile,BufRead *.md set filetype=markdown

" 配置 PowerShell
"if has('win32')
" set shell=powershell
" set shellcmdflag=-NoLogo\ -NoProfile\ -NonInteractive\ -ExecutionPolicy\ RemoteSigned\ -Command
"endif

" 定义执行 PowerShell 命令的函数
function! RunPowerShellCommand(command)
let output = system('powershell ' . a:command)
return output
endfunction

function! SaveScreenshotToHexoImageLink()
" 获取当前编辑文件的路径和文件名
let current_file = expand('%:p')
let current_file_name = expand('%:t:r')

" 构建保存截图的目标文件夹路径
let screenshot_folder = substitute(expand('%:p:h') . '/' . current_file_name . '/', '/', '\\', 'g')

" 如果目标文件夹不存在,创建它
if !isdirectory(screenshot_folder)
call mkdir(screenshot_folder, "p")
endif

" 构建保存截图的文件路径(按 2 位数序号命名)
let screenshot_file = screenshot_folder . printf('%02d', line('.')) . '.png'

" 保存剪贴板中的内容到截图文件

let save_command = 'powershell -ExecutionPolicy Bypass E:\www\dump-clipboard-png.ps1'.' -screenshot_file '. shellescape(screenshot_file)
let result = RunPowerShellCommand(save_command)
echo result

" 将生成的截图文件名插入到 Hexo 图片链接格式
let hexo_image_link = "![](" . printf('%02d', line('.')) . '.png)'

" 将 Hexo 图片链接插入到当前光标位置
execute 'normal i' . hexo_image_link
endfunction

map <F9> :call SaveScreenshotToHexoImageLink()<CR>

这里的难点在于调用powershell和传递参数,中间发现了问题,就是路径,反斜杠和正斜杠,还有就是将多个\加到里面了。因为把两个地方的东西都放到里面了。

这次收获还是有的,比如markdown,正在学习,hexo的写法,也正在学,大体上挺好的。但是对于技术细节,不是很清楚,比如powershell那么复杂的语句,可能自己不会花大力气学。这里还是要感谢下自己学了Vim,确实是能用很久很久的技能,值得一学,还有正则表达式,也是如此。看来学技能就要学长周期复用,甚至跨周期,更有复利效果。

推而广之,健身、阅读、思考、英语、记笔记、博客都是可以复利的。

想起李笑来说(大意),你学一门技能,就会发现它就是刚需,你不学,就不是,要想它能用在哪,能用在哪

发现自己的表达能力下降好厉害,好久不写作了,手生的很,不过没有关系,感觉挺好。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。