Vim 没有内置的 GUID 生成器。
对于我正在处理的项目,我可以依赖 Powershell 可用,因此以下为我提供了一个 GUID 字符串:
[guid]::NewGuid().ToString()
我将其称为替换,如下所示:
%s/foo/\=system('[guid]::NewGuid().ToString()')[:2]/
虽然这有效,但它会为每个替换闪现一个窗口,而且速度很慢。
我真正想要的是一种在 Vim 中可移植且快速地生成 GUID 的方法。
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),你必须为 Win32UuidCreate()
函数编写一个 DLL 包装器,并通过libcall()
. (帮助说您不能直接调用 Windows 系统 DLL,因为调用约定不匹配。)
包装器可能简单且易于编写,但您仍然需要编译一个 DLL 并将其安装在每个系统上。
我猜你只是想foo
用随机十六进制替换。如果是这样,你可以这样做:
百万美元的窗户:
%s/foo/\=printf("%04X",libcallnr("msvcrt.dll","rand",localtime()))[:2]/
对于 Unix:
%s/foo/\=printf("%04X",libcallnr("libc.so.6","rand",localtime()))[:2]/
这将比任何其他 shell 命令快得多。
代替
'[guid]::NewGuid().ToString()'
和
'powershell.exe -command "[guid]::NewGuid().ToString()"'
这有帮助吗?
在 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 <m-g> :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 的外壳单行器,无需换行符。"=
-"
告诉 vim 将下一个值分配给指定的寄存器,在本例中为表达式寄存器:=
system(...)
- 这将输出并重定向输出以用于分配到寄存器<CR>P
或<CR>p
- 在光标处计算和粘贴寄存器(分别插入、追加)