考虑这个 shell 命令:
$ MANPAGER='vim -Nu NONE -R -' man git-credential-cache
它使显示Vim 中man(1)
的手册页。git-credential-cache(1)
但是,手册页的名称(显示在缓冲区的第一行上)是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 人插件:
┌ 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
答案1
也不是man
谁在截断它:
$ zcat /usr/share/man/man1/git-credential-cache.1.gz | head -n 10
'\" t
.\" Title: git-credential-cache
.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author]
.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
.\" Date: 09/28/2018
.\" Manual: Git Manual
.\" Source: Git 2.11.0
.\" Language: English
.\"
.TH "GIT\-CREDENTIAL\-CAC" "1" "09/28/2018" "Git 2\&.11\&.0" "Git Manual"
所以你必须摆弄任何git
用来生成其手册页并重建它们的东西(上次我检查过它们正在使用asciidoc
——宇宙中最慢的东西;-))。