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関数について話すのではなく、シェルスクリプトで何を使うのかについて話します)。
ここで垂直にできる方法はありませんか? (必ずしも完全な機能にする必要はなく、forループ/ループを実行せずに動作するいくつかのポインタ/ヒントや実装のみが必要です。)
私ができることがいくつかあることを知っています。
printf '%s\n' {1..10}
しかし、ファイルを開くときに表示されるテキストを書き換えたり書き込んだりせずに水平に機能させる方法はわかりません。 (ステータス行が実行する操作とは異なり、私自身の理解によると、別のテキストオブジェクトとして機能します。)
答え1
関数でこれを行うのではなく、status_line
このdraw_line
関数を使用します。この関数は現在の行が何であるかを知っているので、各行の先頭に行番号を出力するように変更できます。
printf
%d
ここで使用できる表示番号とサイズ指定子を含む、シェルのパラメータはCのパラメータと非常によく似ています。また、COLUMNS
適切に縮小するか、幅の計算で行番号を考慮する必要があります。