内置函数或命令,不能用外部程序,搜了半天没找到资料,难道不支持吗?
终于找到一个emacs能做到而vim做不到的功能?
emacs里面有函数user-uid
, group-gid
, 功能丰富
内置函数或命令,不能用外部程序,搜了半天没找到资料,难道不支持吗?
终于找到一个emacs能做到而vim做不到的功能?
emacs里面有函数user-uid
, group-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")'
与 emacs --batch --eval '(print ...)'
等效的 vim 写法是什么?
这个还真的可以,挺神奇。我之前试了:echo $UID
, :echo getenv("UID")
, 都不行。这个用法你怎么找到的?我看expand的帮助里也没提到这种$
开头的用法。
好多年没用谷歌了,错过了好几亿。
这个好像可以: vim --cmd ‘:echo expand("$UID") |q‘
你至少验证一下再告诉我吧
当然验证过ok了。你那边不行吗?那个cmd后面参数两边奇怪的符号是单引号。vim 9.0
噢,我这边是 NVim。
现安装原版试了一下,感觉这还不是正常的方案,Vim 会短暂打开一下,在终端上产生大量空行:
$ /opt/local/bin/vim --cmd ':echo expand("$UID") |q'
501
$
空行的行数取决于 Vim 窗口(也是终端窗口)的高度。
而 NVim 则是闪烁一下没有任何输出,更像是 NVim 修复了 Vim 的 Bug 。
只是大概想着 敲了一下: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知识也算专业级了
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