繁体   English   中英

如何在 Vim 中生成 GUID?

[英]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=\\"\\");"' - 使用pythonuuid模块将 UUID 打印到 STDOUT 的单行 shell,无需换行符。
  • "= - "告诉 vim 将下一个值分配给指定的寄存器,在这种情况下是表达式寄存器: =
  • system(...) - 这会弹出并重定向输出以用于分配给寄存器
  • <CR>P<CR>p - 评估并粘贴光标处的寄存器(分别为插入、追加)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM