쉘 스크립트를 다시 들여 쓰기


11

공백과 탭을 혼합하여 사용하는 대형 쉘 스크립트가 있습니다. Eclipse의 형식과 같은 구문을 기반으로 전체 파일을 다시 들여 쓰기하고 싶습니다. 이 작업을 수행하는 프로그램이 있습니까?

나는 모든 것들이 함께 붙어있는 논리를 알아내는 데 어려움을 겪고있다.

   if [ "$CANCELLATION" ]
   then
   while test $num -gt 0
    do
    if [ "$cjb" -gt 0 ]

Vim에서 함수를 호출하는 방법을 배웠지 만 작동하지 않았습니다.

이맥스-모든 줄 바꿈

답변:


13

이맥스는 그렇게 할 수있다 :

  • 파일을 Emacs에로드
  • 파일 상단의 Ctrl- space를 누르십시오
  • 커서를 파일의 맨 아래로 이동
  • 눌러 Alt- X입력 untabify한 후return
  • 눌러 Alt- X입력 indent-region한 후return

이것은 탭을 제거하고 모든 것을 올바르게 들여 쓰기합니다.

이 작업을 더 자주 수행해야하고 Emacs를 편집기로 사용하지 않는 경우 모두 스크립트로 압축 할 수 있습니다.

#!/usr/bin/emacs --script

(setq require-final-newline 'visit)

(defun indent-files (files)
  (cond (files
         (find-file (car files))
         (untabify (point-min) (point-max))
         (indent-region (point-min) (point-max))
         (save-buffer)
         (kill-buffer)
         (indent-files (cdr files)))))

(indent-files command-line-args-left)

;; EOF ;;

1
실제로 emacs 녀석은 아니지만 슈퍼 쉘 vim이 작동하지 않는 경우. 나는 그것을 시도 할 것이다.
jsymolon

1
M->에 대한 일반적인 바인딩입니다 end-of-buffer. 키보드에서 손을 떼는 것은 악하기 때문입니다.
dmckee --- 전 운영자 고양이

3
또한 전체 버퍼가 함께 할 수있는 표시 C-x h하는 실행, mark-whole-buffer.
Victor

훌륭한! 두 가지 : (i) untabify모든 것이 선택 해제 된 후에 지역을 다시 선택해야 하며, (2) 메뉴에있는 것만 사용하지 않았습니까? 그럴 가치가 있습니다!
alle_meije

5

Vi / Vim에서 올바른 파일 구문 ( :set syntax=sh)을 설정 한 후에는 gg=G(또는 1G=G)을 눌러 전체 파일의 들여 쓰기를 수정할 수 있습니다.

전체 파일을 적절한 형식으로 지정하는 명령은 다음과 같습니다.

ex +"set syn=sh" +"norm gg=G" -cwq foobar.sh

참고 : 위 명령을 실행하기 전에 백업하십시오.

포맷을 먼저 테스트하려면 Vim에서 파일을 편집하고 다음을 실행하십시오 :norm gg=G.

참조 : Vi SE에서 잘못 들여 쓰기 된 코드 다시 들여 쓰기


2
방금 이것을 시도했지만 (Vim 8.0) 제대로 작동하지 않았습니다. 내 생각에 그것은 마치 C 코드 인 것처럼 쉘 스크립트를 들여 쓰려고 시도했다. 올바르게하지만 중괄호를 처리 if하고 fi키워드. 아마도 일부 플러그인이 필요합니까?
Keith Thompson

실제로, 당신은 설정 filetype=sh(또는 ft) 해야합니다 .
lingfish

이것은 전혀 효과가 없습니다. 복잡한 Bash 스크립트가 엉망입니다.
Roel Van de Paar

2

shfmt 가 당신을 위해 속임수를 쓰는 것처럼 보입니다 . 들여 쓰기가 포함 된 쉘 / bash 코드를 형식화합니다.

shfmt -l -w script.sh

1
이것이 질문에 대한 답변이 될 수 있지만, 그 이유에 대한 설명을 제공 할 수 있다면 더 나은 답변이 될 것 입니다. 어쩌면 당신은 그것을 사용하는 방법의 예를 줄 수 있습니까?
DavidPostill

큰! 이것은 효과가 있었다! 나는 두 개의 공백을 동일하게 사용 했으므로 내 명령은 다음과 같습니다.shfmt -i 2 -ci ~/mariadb-qa/pquery-run.sh
Roel Van de Paar

0

아마도 Super Shell Indent를 원할 것입니다 . ~ / .vim / indent에 저장하고 다음 vim에있을 때 실행하십시오.:source ~/.vim/indent/sh.vim

.vimrc에서 파일 기반 스마트 들여 쓰기를 설정하려고 할 수도 있습니다.

" Turn on smart indenting
filetype indent on
set smartindent

vim이 당신의 서식을 망칠 염려가 없다면 vimrc 에도이 줄을 추가하십시오.

" When you load/save a shell script, auto indent it
autocmd BufRead,BufWritePre *.sh normal gg=G

어쨌든, 여기 당신이 기다리고있는 것이 있습니다. 다음에 vim에서 쉘 스크립트를 편집 할 때 스마트 들여 쓰기를 설정하고 수퍼 쉘 ID를 설치했다고 가정하면 다음 키를 눌러 스크립트를 다시 들여 쓰기하십시오.gg=G

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.