如何在 bash TUI 中显示行号?

如何在 bash TUI 中显示行号?

我正在尝试在 bash 上添加对行号的支持项目我喜欢(主要是作为一种有趣的练习)。

首先,我研究了设置状态行的函数(因为我想从中启发自己,因为它将在窗口底部水平打印一条恒定线):

status_line() {
    # '\e7'        : Save cursor position.
    #                This is more widely supported than '\e[s'.
    # '\e[%sH'     : Move cursor to bottom of the terminal.
    # '\e[30;41m'  : Set foreground and background colors.
    # '%*s'        : Insert enough spaces to fill the screen width.
    #                This sets the background color to the whole line
    #                and fixes issues in 'screen' where '\e[K' doesn't work.
    # '\r'         : Move cursor back to column 0 (was at EOL due to above).
    # '\e[m'       : Reset text formatting.
    # '\e[%sH\e[K' : Clear line below status_line.
    # '\e8'        : Restore cursor position.
    #                This is more widely supported than '\e[u'.

    buffer_name="${file_name:-New Buffer}"
    (( modified == 1 )) && buffer_name+="*"
    counter="Ln $((file_line+1)), Col $((file_column+1))"

    printf "\e7\e[%sH%s%*s%s\e[%sH\e[K\e8"\
            "$((LINES-1))"\
            "[$buffer_name]"\
            "$((COLUMNS-${#buffer_name}-${#counter}-4))" ""\
            "[$counter]"\
            "$LINES"

}

项目代码的一部分。现在我知道我可以使用\n并替换H为使其垂直工作的内容(因为我需要行号,所以显然更好垂直),但我不太了解 printf 语法(在这种情况下,不是谈论 C 函数,而是在 shell 脚本中使用什么)。

有什么办法可以垂直地在这里做吗? (不一定需要制作完整的功能,只需一些无需执行 for 循环/循环即可工作的指示/提示或实现)。

我知道我可以做一些事情:

printf '%s\n' {1..10}

但我不确定如何使其水平工作,而无需重写/写入打开文件时显示的文本(与状态行所做的相反,根据我自己的理解,状态行作为单独的文本对象工作)。

答案1

我不会在函数中执行此操作,而是status_line使用该draw_line函数:它知道当前行是什么,因此可以将其更改为在每行开头输出行号。

printfshell 中的参数与 C 中的参数很接近,包括显示%d数字和您可能想要在此处使用的大小说明符。您还需要COLUMNS适当减少,或在宽度计算中考虑行号。

相关内容