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脚本支持
:pyx import uuid
:%s/foo/\=pyxeval('str(uuid.uuid4())')/
如果你的Vim和Python非常老旧,请使用 :py
和 pyeval()
代替 :pyx
和 pyxeval()
。
:py vim.command("s/nguid/" + str(uuid.uuid4()) + "/g")
...然后使用 vim 宏重复执行。虽然不是理想的方法,但已经足够好了,感谢您提供的起点。 - Rik Hemsley:nnoremap <Leader>s :%s/\<<C-r><C-w>\>/\=pyeval('str(uuid.uuid4()')/
和宏结合使用,轻松解决了我的特定问题。所以我真正需要做的就是 \s
,它用 uuidv4 替换了我的搜索字符串。 - matchew如果您不想或无法使用Vim语言包装(例如Python或Perl),则必须为Win32 UuidCreate()
函数编写DLL包装器,并通过libcall()
从Vim调用该函数。 (帮助文档指出,您无法直接调用Windows系统DLL,因为调用约定不匹配。)
这个包装器可能很简单且容易编写,但仍然需要编译DLL并在每个系统上安装。
'[guid]::NewGuid().ToString()'
使用
'powershell.exe -command "[guid]::NewGuid().ToString()"'
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命令都要快得多。
libcall()
的好例子。不幸的是,GUID != 随机数;后者不能保证唯一性。 - Ingo Karkat假设你的路径中已经有了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 的 shell 一行命令,不带换行符。"=
- "
告诉 vim 将下一个值分配给指定的寄存器,本例中为表达式寄存器:=
system(...)
- 这个命令将外壳分离并重定向输出以供分配到寄存器中使用<CR>P
或 <CR>p
- 在光标处评估并粘贴寄存器(分别为插入、追加)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时崩溃,请阅读此文)system()
命令会弹出一个命令窗口(通常在后台)。避免这种情况的一种方法是使用编译到Vim中的语言绑定,例如Python::python import uuid, vim; vim.command("let g:uuid = '" + str(uuid.uuid1()) + "'
这种方法既更快,又避免了弹出窗口,但需要安装Python和支持Python的Vim;如果您因某种原因更喜欢其他语言,可以考虑使用类似的Perl或Ruby实现。不幸的是,目前还没有PowerShell语言绑定。
[:2]
);这会丢失唯一性属性,并将GUID转换为基本(有些随机)数字。你确定需要完整的GUID,还是只需要一个N位的随机数? - Ingo Karkatset shellquote=\"
和set shellxquote=
才能使system()
在 powershell 中正常工作。 - user1129682