Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Vim中生成GUID?_Vim_Powershell_Guid - Fatal编程技术网

如何在Vim中生成GUID?

如何在Vim中生成GUID?,vim,powershell,guid,Vim,Powershell,Guid,Vim没有内置的GUID生成器 对于我正在处理的项目,我可以依赖可用的Powershell,因此以下内容为我提供了一个GUID字符串: [guid]::NewGuid().ToString() 我将其称为替换,如下所示: %s/foo/\=system('[guid]::NewGuid().ToString()')[:2]/ 虽然这样做有效,但每次替换都会出现一个窗口,而且速度非常慢 我真正想要的是一种在Vim中生成GUI的方法,可移植且快速。 '[guid]::NewGuid().ToSt

Vim没有内置的GUID生成器

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

[guid]::NewGuid().ToString()
我将其称为替换,如下所示:

%s/foo/\=system('[guid]::NewGuid().ToString()')[:2]/
虽然这样做有效,但每次替换都会出现一个窗口,而且速度非常慢

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

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


这有帮助吗?

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

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

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

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

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

如果您不想/不能使用Vim语言包装(例如,到Python或Perl),您必须为Win32
UuidCreate()
函数编写DLL包装,并通过
libcall()
从Vim调用它。(帮助说明您无法直接调用Windows系统DLL,因为调用约定不匹配。)


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

我想您只是想用随机十六进制替换
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命令快得多。

我在这里是因为问题标题询问如何创建UUID,但是问题文本实际上希望用新创建的UUID替换现有的TextBlock

让我了解了很多,如果其他任何人需要创建和插入UUID,以下是方法:

function! Guid()
python << EOF
import uuid, vim
vim.command("normal i" + str(uuid.uuid4()) )
EOF
endfunction
函数!Guid()

python假设路径中有
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
“插入GUID
nnoremap ig“=system('python-c“导入uuid;打印(uuid.uuid4(),end=\”);”)P
“追加GUID
nnoremap ag“=system('python-c“导入uuid;打印(uuid.uuid4(),end=\”);”)p
工作原理:

  • python-c“导入uuid;打印(uuid.uuid4(),end=\“\”;”
    -使用
    python
    uuid
    模块将uuid打印到标准输出的shell一行程序
  • “=
    -
    告诉vim将下一个值分配给指定的寄存器,在这种情况下是表达式寄存器:
    =
  • 系统(…)
    -这将输出并重定向输出,以便在分配到寄存器时使用
  • P
    P
    -在光标处计算并粘贴寄存器(分别插入、追加)

这正是我正在做的-shell已设置为powershell,但谢谢。不幸的是没有。我在Windows上,Ruby和Python都不一定可用-在Vim中使用是最理想的。今天我尝试了这个解决方案,但发现pyeval不可用,所以最后做了:
:py Vim.command(“s/nguid/”+str(uuid.uuid4())+“/g”)
。。。然后用vim宏重复这个过程。不太理想,但它工作得很好,感谢您从这方面着手。使用
libcall()
的好例子。不幸的是,GUID!=随机数;后者不能保证唯一性。@如果你是对的,GUID不是随机数。考虑到用例:它只使用GUID的前3个十六进制。以及GUID的实现。所以我猜测它可以被一个随机数生成器所取代抢手货我没有完全意识到GUID输出被截断。这使你的解决方案成为一个很好的选择+1在您的示例中,将GUID截断为前3个字符(
[:2]
);这将丢失唯一性属性,并将GUID转换为基本(有些随机)数。你确定你需要一个完整的GUID,还是只需要一个N长度的随机数?很抱歉,这应该是[:-2]-只需要修剪尾随的垃圾。如上所述,你必须设置
set shellquote=\”
set shellxquote=
,以使
system()
与powershell正常工作。
" 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