如何在Vim中生成GUID?

时间:2012-09-10 10:55:13

标签: vim powershell guid

Vim没有内置的GUID生成器。

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

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

我在替换中称之为:

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

虽然这样可行,但它会为每次替换闪烁一个窗口,而且速度非常慢。

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

7 个答案:

答案 0 :(得分:9)

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

:py import uuid
:%s/foo/\=pyeval('str(uuid.uuid4())')/

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

替换

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

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

这有帮助吗?

答案 3 :(得分:2)

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

M $ Windows:

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

对于Unix:

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

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

我来到这里因为问题标题询问如何创建UUID,但是问题文本实际上想要用新创建的UUID替换现有的文本块。

Marius Gedminas' Answer让我走得很远,如果其他人需要创建和插入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时遇到崩溃,read this

答案 6 :(得分:0)

假设您的路径中有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而无需换行。
  • "=-"告诉vim将下一个值分配给指定的寄存器,在这种情况下为表达式寄存器:=
  • system(...)-它掏空并重定向输出以用于分配给寄存器
  • <CR>P<CR>p-评估寄存器并将其粘贴到光标处(分别插入,追加)