[英]How can I generate a GUID in Vim?
Vim 没有内置的 GUID 生成器。
对于我正在处理的项目,我可以依赖 Powershell 可用,因此以下内容为我提供了一个 GUID 字符串:
[guid]::NewGuid().ToString()
我将其称为替换,如下所示:
%s/foo/\=system('[guid]::NewGuid().ToString()')[:2]/
虽然这有效,但每次替换都会闪现一个窗口,而且速度很慢。
我真正想要的是一种在 Vim 中可移植且快速地生成 GUID 的方法。
如果您可以依赖 Vim 的 Python 脚本支持可用
:py import uuid
:%s/foo/\=pyeval('str(uuid.uuid4())')/
如果您不想/不能使用 Vim 语言包装(例如到 Python 或 Perl),您必须为 Win32 UuidCreate()
函数编写一个 DLL 包装器,并通过libcall()
从 Vim 调用它。 (帮助说明您不能直接调用 Windows 系统 DLL,因为调用约定不匹配。)
包装器可能简单且易于编写,但您仍然需要编译一个 DLL 并将其安装在每个系统上。
代替
'[guid]::NewGuid().ToString()'
和
'powershell.exe -command "[guid]::NewGuid().ToString()"'
这有帮助吗?
我猜你只想用随机十六进制替换foo
。 如果是这样,你可以这样做:
百万美元的窗户:
%s/foo/\=printf("%04X",libcallnr("msvcrt.dll","rand",localtime()))[:2]/
对于 Unix:
%s/foo/\=printf("%04X",libcallnr("libc.so.6","rand",localtime()))[:2]/
这将比任何其他 shell 命令快得多。
在 Windows 上, system()
命令会弹出一个命令窗口(但通常在后台)。 避免这种情况的一种方法是使用编译到 Vim 中的语言绑定,例如 Python:
:python import uuid, vim; vim.command("let g:uuid = '" + str(uuid.uuid1()) + "'
这既更快又避免了弹出窗口,但确实需要安装 Python 和支持 Python 的 Vim; 如果出于某种原因您更喜欢另一种语言,您可能会想出类似的 Perl 或 Ruby 实现。 不幸的是,目前还没有 PowerShell 语言绑定。
我来到这里是因为问题标题询问如何创建 UUID,但是问题文本实际上想用新创建的 UUID 替换现有的文本块。
Marius Gedminas 的回答让我走得很远,如果其他人需要创建和插入 UUID,方法如下:
function! Guid()
python << EOF
import uuid, vim
vim.command("normal i" + str(uuid.uuid4()) )
EOF
endfunction
如果你想把它映射到<alt+G>
: map <mg> :call Guid() <cr>
(如果您的 Gvim 在调用 Python 时崩溃, 请阅读此内容)
假设您的路径中有python
,以下是在光标处插入或附加 UUID 的一些映射。 它应该与平台无关。
" 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=\\"\\");"'
- 使用python
和uuid
模块将 UUID 打印到 STDOUT 的单行 shell,无需换行符。"=
- "
告诉 vim 将下一个值分配给指定的寄存器,在这种情况下是表达式寄存器: =
system(...)
- 这会弹出并重定向输出以用于分配给寄存器<CR>P
或<CR>p
- 评估并粘贴光标处的寄存器(分别为插入、追加)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.