6

Vim 没有内置的 GUID 生成器。

对于我正在处理的项目,我可以依赖 Powershell 可用,因此以下为我提供了一个 GUID 字符串:

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

我将其称为替换,如下所示:

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

虽然这有效,但它会为每个替换闪现一个窗口,而且速度很慢。

我真正想要的是一种在 Vim 中可移植且快速地生成 GUID 的方法。

4

7 回答 7

11

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

:py import uuid
:%s/foo/\=pyeval('str(uuid.uuid4())')/
于 2012-09-10T11:10:31.053 回答
3

如果你不想/不能使用 Vim 语言包装(例如 Python 或 Perl),你必须为 Win32UuidCreate()函数编写一个 DLL 包装器,并通过libcall(). (帮助说您不能直接调用 Windows 系统 DLL,因为调用约定不匹配。)

包装器可能简单且易于编写,但您仍然需要编译一个 DLL 并将其安装在每个系统上。

于 2012-09-10T11:34:30.287 回答
2

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

百万美元的窗户:

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

对于 Unix:

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

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

于 2012-09-11T06:29:33.993 回答
2

代替

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

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

这有帮助吗?

于 2012-09-10T11:01:25.127 回答
1

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

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

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

于 2012-09-10T11:17:16.193 回答
1

我来到这里是因为问题标题询问如何创建 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 时崩溃,请阅读此内容

于 2017-11-13T13:57:33.803 回答
1

假设您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- 在光标处计算和粘贴寄存器(分别插入、追加)
于 2020-12-02T23:27:55.207 回答