Vim没有内置的GUID生成器。对于我正在进行的项目,我可以依赖Powershell,因此下面的代码为我提供了一个GUID字符串:
[guid]::NewGuid().ToString()
我称之为内代换,如下所示:
%s/foo/\=system('[guid]::NewGuid().ToString()')[:2]/
当这个工作时,它会为每个替换闪烁一个窗口,而且速度相当慢。我真正想要的是一种在Vim中生成GUID的方法,既方便又快速。
pbgvytdp1#
假设您的路径中有python,下面是一些在游标处插入或附加UUID的Map。它应该与平台无关。
python
" 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=\"\");"'
uuid
"=
"
=
system(...)
<CR>P
<CR>p
uxh89sit2#
在Windows上,system()命令会弹出一个命令窗口(通常在后台)。避免这种情况的一种方法是使用编译到Vim中的语言绑定,例如Python:
system()
:python import uuid, vim; vim.command("let g:uuid = '" + str(uuid.uuid1()) + "'
这既快又避免了弹出窗口,但是需要Python安装和支持Python的Vim;如果出于某种原因您更喜欢另一种语言,您可能会想到类似的Perl或Ruby实现。2不幸的是,还没有PowerShell语言绑定。
emeijp433#
我来到这里是因为问题标题询问如何创建UUID,而问题文本实际上是想用新创建的UUID替换现有的文本块。Marius Gedminas' Answer使我走得很远,如果其他人需要创建和插入UUID,下面是如何创建和插入UUID的:
function! Guid() python << EOF import uuid, vim vim.command("normal i" + str(uuid.uuid4()) ) EOF endfunction
如果要将其Map到<alt+G>:map <m-g> :call Guid() <cr>个(In如果您的Gvim在调用Python时崩溃,read this)
<alt+G>
map <m-g> :call Guid() <cr>
q3aa05254#
如果您可以依赖Vim的Python脚本支持
:pyx import uuid :%s/foo/\=pyxeval('str(uuid.uuid4())')/
(If您Vim和Python非常旧,请使用:py和pyeval(),而不是:pyx和pyxeval()。)
:py
pyeval()
:pyx
pyxeval()
icnyk63a5#
如果您不想/不能使用Vim语言 Package (例如,对Python或Perl),则必须为Win32 UuidCreate()函数编写一个DLL Package ,并通过libcall()从Vim调用它。(帮助中说明,您不能直接调用Windows系统DLL,因为调用约定不匹配。)Package 器可能很简单,也很容易编写,但是您仍然需要编译一个DLL并将其安装在每个系统上。
UuidCreate()
libcall()
yqyhoc1h6#
替换
'[guid]::NewGuid().ToString()'
与
'powershell.exe -command "[guid]::NewGuid().ToString()"'
这有帮助吗?
ikfrs5lh7#
我猜你只是想用随机十六进制替换foo。如果是这样,你可以这样做:M$视窗:
foo
%s/foo/\=printf("%04X",libcallnr("msvcrt.dll","rand",localtime()))[:2]/
对于Unix:
%s/foo/\=printf("%04X",libcallnr("libc.so.6","rand",localtime()))[:2]/
这将比任何其他shell命令快得多。
7条答案
按热度按时间pbgvytdp1#
假设您的路径中有
python
,下面是一些在游标处插入或附加UUID的Map。它应该与平台无关。工作原理:
python -c "import uuid; print(uuid.uuid4(), end=\"\");"'
-一个shell单行程序,使用python
和uuid
模块将UUID打印到STDOUT,不需要换行。"=
-"
告诉Vim将下一个值分配给指定的寄存器,在本例中为表达式寄存器:=
system(...)
-这会将输出解压缩并重新导向,以便在指派给寄存器时使用<CR>P
或<CR>p
-计算寄存器并将其粘贴到光标处(分别为插入、追加)uxh89sit2#
在Windows上,
system()
命令会弹出一个命令窗口(通常在后台)。避免这种情况的一种方法是使用编译到Vim中的语言绑定,例如Python:这既快又避免了弹出窗口,但是需要Python安装和支持Python的Vim;如果出于某种原因您更喜欢另一种语言,您可能会想到类似的Perl或Ruby实现。2不幸的是,还没有PowerShell语言绑定。
emeijp433#
我来到这里是因为问题标题询问如何创建UUID,而问题文本实际上是想用新创建的UUID替换现有的文本块。
Marius Gedminas' Answer使我走得很远,如果其他人需要创建和插入UUID,下面是如何创建和插入UUID的:
如果要将其Map到
<alt+G>
:map <m-g> :call Guid() <cr>
个(In如果您的Gvim在调用Python时崩溃,read this)
q3aa05254#
如果您可以依赖Vim的Python脚本支持
(If您Vim和Python非常旧,请使用
:py
和pyeval()
,而不是:pyx
和pyxeval()
。)icnyk63a5#
如果您不想/不能使用Vim语言 Package (例如,对Python或Perl),则必须为Win32
UuidCreate()
函数编写一个DLL Package ,并通过libcall()
从Vim调用它。(帮助中说明,您不能直接调用Windows系统DLL,因为调用约定不匹配。)Package 器可能很简单,也很容易编写,但是您仍然需要编译一个DLL并将其安装在每个系统上。
yqyhoc1h6#
替换
与
这有帮助吗?
ikfrs5lh7#
我猜你只是想用随机十六进制替换
foo
。如果是这样,你可以这样做:M$视窗:
对于Unix:
这将比任何其他shell命令快得多。