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
적절하게 줄이거나 너비 계산에서 줄 번호를 고려해야 합니다 .