如何在Vim中生成GUID?

js4nwp54  于 2022-11-11  发布在  其他
关注(0)|答案(7)|浏览(171)

Vim没有内置的GUID生成器。
对于我正在进行的项目,我可以依赖Powershell,因此下面的代码为我提供了一个GUID字符串:

[guid]::NewGuid().ToString()

我称之为内代换,如下所示:

%s/foo/\=system('[guid]::NewGuid().ToString()')[:2]/

当这个工作时,它会为每个替换闪烁一个窗口,而且速度相当慢。
我真正想要的是一种在Vim中生成GUID的方法,既方便又快速。

pbgvytdp

pbgvytdp1#

假设您的路径中有python,下面是一些在游标处插入或附加UUID的Map。它应该与平台无关。

" Insert GUID
nnoremap <silent><leader>ig "=system('python -c "import uuid; print(uuid.uuid4(), end=\"\");"')<CR>P

" Append GUID
nnoremap <silent><leader>ag "=system('python -c "import uuid; print(uuid.uuid4(), end=\"\");"')<CR>p

工作原理:

  • python -c "import uuid; print(uuid.uuid4(), end=\"\");"'-一个shell单行程序,使用pythonuuid模块将UUID打印到STDOUT,不需要换行。
  • "=-"告诉Vim将下一个值分配给指定的寄存器,在本例中为表达式寄存器:=
  • system(...)-这会将输出解压缩并重新导向,以便在指派给寄存器时使用
  • <CR>P<CR>p-计算寄存器并将其粘贴到光标处(分别为插入、追加)
uxh89sit

uxh89sit2#

在Windows上,system()命令会弹出一个命令窗口(通常在后台)。避免这种情况的一种方法是使用编译到Vim中的语言绑定,例如Python:

:python import uuid, vim; vim.command("let g:uuid = '" + str(uuid.uuid1()) + "'

这既快又避免了弹出窗口,但是需要Python安装和支持Python的Vim;如果出于某种原因您更喜欢另一种语言,您可能会想到类似的Perl或Ruby实现。2不幸的是,还没有PowerShell语言绑定。

emeijp43

emeijp433#

我来到这里是因为问题标题询问如何创建UUID,而问题文本实际上是想用新创建的UUID替换现有的文本块。
Marius Gedminas' Answer使我走得很远,如果其他人需要创建和插入UUID,下面是如何创建和插入UUID的:

function! Guid()
python << EOF
import uuid, vim
vim.command("normal i" + str(uuid.uuid4()) )
EOF
endfunction

如果要将其Map到<alt+G>map <m-g> :call Guid() <cr>
(In如果您的Gvim在调用Python时崩溃,read this

q3aa0525

q3aa05254#

如果您可以依赖Vim的Python脚本支持

:pyx import uuid
:%s/foo/\=pyxeval('str(uuid.uuid4())')/

(If您Vim和Python非常旧,请使用:pypyeval(),而不是:pyxpyxeval()。)

icnyk63a

icnyk63a5#

如果您不想/不能使用Vim语言 Package (例如,对Python或Perl),则必须为Win32 UuidCreate()函数编写一个DLL Package ,并通过libcall()从Vim调用它。(帮助中说明,您不能直接调用Windows系统DLL,因为调用约定不匹配。)
Package 器可能很简单,也很容易编写,但是您仍然需要编译一个DLL并将其安装在每个系统上。

yqyhoc1h

yqyhoc1h6#

替换

'[guid]::NewGuid().ToString()'

'powershell.exe -command "[guid]::NewGuid().ToString()"'

这有帮助吗?

ikfrs5lh

ikfrs5lh7#

我猜你只是想用随机十六进制替换foo。如果是这样,你可以这样做:
M$视窗:

%s/foo/\=printf("%04X",libcallnr("msvcrt.dll","rand",localtime()))[:2]/

对于Unix:

%s/foo/\=printf("%04X",libcallnr("libc.so.6","rand",localtime()))[:2]/

这将比任何其他shell命令快得多。

相关问题