我正在尝试在 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
函数:它知道当前行是什么,因此可以将其更改为在每行开头输出行号。
printf
shell 中的参数与 C 中的参数很接近,包括显示%d
数字和您可能想要在此处使用的大小说明符。您还需要COLUMNS
适当减少,或在宽度计算中考虑行号。