Vim没有内置的GUID生成器。
对于我正在进行的项目,我可以依赖Powershell,因此以下内容为我提供了一个GUID字符串:
[guid]::NewGuid().ToString()
我在替换中称之为:
%s/foo/\=system('[guid]::NewGuid().ToString()')[:2]/
虽然这样可行,但它会为每次替换闪烁一个窗口,而且速度非常慢。
我真正想要的是一种在Vim中可移植且快速生成GUID的方法。
答案 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=\"\");"'
–一种外壳程序,可以使用python
和uuid
模块将UUID打印到STDOUT而无需换行。"=
-"
告诉vim将下一个值分配给指定的寄存器,在这种情况下为表达式寄存器:=
system(...)
-它掏空并重定向输出以用于分配给寄存器<CR>P
或<CR>p
-评估寄存器并将其粘贴到光标处(分别插入,追加)