vim脚本,如何获取当前用户id?

内置函数或命令,不能用外部程序,搜了半天没找到资料,难道不支持吗?

终于找到一个emacs能做到而vim做不到的功能?


emacs里面有函数user-uidgroup-gid, 功能丰富

不是vim用户, 但是我猜vim有类似Emacs中 shell-command-to-string 的命令吧, 这样就可以调用 emacs --batch --eval "..." 实现Emacs的功能了

不用外部命令的前提下,内置的函数。

vim.uv.getuid? 但是neovim的

搜了下,uv不是libuv事件库吗?它怎么会包含个获取用户id的函数?我运行 :help vim.uv.getuid 提示没找到

$ vi -c ':echo expand("$UID")'

image

emacs --batch --eval '(print ...)' 等效的 vim 写法是什么?

这个还真的可以,挺神奇。我之前试了:echo $UID, :echo getenv("UID"), 都不行。这个用法你怎么找到的?我看expand的帮助里也没提到这种$开头的用法。

谷歌。r/vim/Set options in vimrc depending on $UID/current user?

vim 如何在命令行执行一段脚本、输出结果到 stdout?

好多年没用谷歌了,错过了好几亿。

这个好像可以: vim --cmd ‘:echo expand("$UID") |q‘

你至少验证一下再告诉我吧 :sweat:

当然验证过ok了。你那边不行吗?那个cmd后面参数两边奇怪的符号是单引号。vim 9.0

123

噢,我这边是 NVim。

现安装原版试了一下,感觉这还不是正常的方案,Vim 会短暂打开一下,在终端上产生大量空行:

  1. 终端清屏
  2. 运行命令
$ /opt/local/bin/vim --cmd ':echo expand("$UID") |q'
501







$

空行的行数取决于 Vim 窗口(也是终端窗口)的高度。

而 NVim 则是闪烁一下没有任何输出,更像是 NVim 修复了 Vim 的 Bug :joy:

只是大概想着 敲了一下:h getuid 然后搜到了。确实不是libuv的函数 是neovim把它作为luv-miscellaneous-utilities放到uv这个命名空间了。更新到最新release应该能找到这个函数

对,是有这个问题,好像是新开的终端里没运行过vim第一次运行会这样,我这边刚开始已经运行过了,所以没有空行。新开终端会有。

vim估计是没朝这方面发展,没有需求。

使用 vim.loop.getuid() 就可以了。loop 是之前 API 命名的一个失误,libuv 相关功能都在 loop 下。预计接下来会添加 deprecation warning,让插件开发者逐步切换到 uv 命名。

@netjune Vim 下使用 :echo trim(system('id -u'))id 属于 coreutils 包的一部分,基本通用。

所以还是 Emacs 更好玩。

这些vim知识也算专业级了 :+1:

nvim的命名空间挺奇怪,为啥都放在uv里面,不再开个空间。

这个功能本来就是基于 uv 实现的啊。线程管理、异步 TCP/UDP、异步文件读写、FS 事件监听等都在 uv 空间里。而 Vim 只能通过外部工具的方式查询。

应该是你的配置将终端置于 termcap mode 导致的,如果你使用默认的 Vim 是不会这样的:

vim --clean --cmd ':echo expand("$UID") | q'

而 Nvim never uses the termcap database, only |terminfo| and |builtin-terms|.

我比较倾向于 Neovim 的做法,自动探测 terminal 的能力。因为即便你设置了 terminal 的某项,而 terminal 可能并不支持。一个程序除非必须,不应该去设置别的程序。Vim 的做法会导致疑惑和混乱。

set t_ti='' t_te=''

:h termcap-options