考虑这个 shell 命令:
$ MANPAGER='vim -Nu NONE -R -' man git-credential-cache
它使man(1)
显示git-credential-cache(1)
在 Vim 中的手册页。
但是,手册页的名称(显示在缓冲区的第一行)是GIT-CREDENTIAL-CAC(1)
. 请注意HE
名称末尾的缺失:
我希望这个名字改为:
GIT-CREDENTIAL-CACHE(1)
^^
我跑去strace(1)
查看使用了哪些系统调用man(1)
:
$ MANPAGER='vim -Nu NONE -R -' strace -o log man git-credential-cache
在日志文件的末尾,我可以看到一个read(2)
和write(2)
系统调用,使用缓冲区名称GIT-CREDENTIAL-CAC(1)
:
read(7, "GIT-CREDENTIAL-CAC(1) "..., 4096) = 2720
...
write(8, "GIT-CREDENTIAL-CAC(1) "..., 2720) = 2720
因此,似乎是man(1)
而不是vim(1)
截断了手册页的名称。
这是日志文件的完整内容,另一个日志文件包含相同strace(1)
命令的输出,但带有用于跟踪子进程的附加-f
参数,以及通向该man(1)
进程的进程树:
$ pstree -lsp $(pidof man)
systemd(1)---lightdm(947)---lightdm(1114)---upstart(1123)---sh(1324)---xfce4-session(1335)---xfce4-panel(1347)---panel-8-whisker(1396)---xterm(22546)---bash(22547)---strace(23182)---man(23184)---vim(23194)
有没有办法防止man(1)
截断GIT-CREDENTIAL-CACHE(1)
成GIT-CREDENTIAL-CAC(1)
?
我问这个问题的原因是因为截断会导致在使用Neovim man 插件时显示错误消息:
┌ Taken from `:h man.vim` in Neovim
├────────┐
$ MANPAGER='nvim +Man!' man git-credential-cache
man.vim: command error (7) man -w git-credential-cac: No manual entry for git-credential-cac
环境:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.6 LTS
Release: 16.04
Codename: xenial
$ man --version
man 2.7.5
$ vim --version | head -n2
VIM - Vi IMproved 8.1 (2018 May 18, compiled Sep 3 2019 11:05:36)
Included patches: 1-1967
$ nvim --version | head -n1
NVIM v0.4.0-1856-g82d52b229
也不
man
是谁在截断它:因此,您将不得不摆弄任何
git
用来生成其联机帮助页并重建它们的东西(上次我检查了它们正在使用asciidoc
的东西——宇宙中最慢的东西;-))。