쉘 프롬프트에서 zsh의 줄을 주석 처리하는 간단하고 안전하며 안정적인 방법이 있습니까?

쉘 프롬프트에서 zsh의 줄을 주석 처리하는 간단하고 안전하며 안정적인 방법이 있습니까?

명령어를 쳤다가 먼저 다른 일을 해야 한다는 걸 깨닫는 경우가 많고, 모든 것을 기억하고 모든 매개변수를 파악하거나 나중에 다시 입력하고 싶지 않기 때문에 보통 #처음에 히스토리에 저장해두기 때문에 나는 분을 사용할 수 있습니다.

setopt interactivecomments일반적으로 .zshrc에서 이미 해당 기능을 활성화했지만 때로는 sudo반드시 설정되지 않은 작업을 수행하기 위해 일부 서버에서 공유 계정을 사용해야 하므로 #해당 줄 앞에 추가하면 성가신 응답이 나타날 수 있습니다.

zsh: command not found: #

괜찮습니다. 그냥 사용하면 된다고 생각할 수도 있지만 :그렇게 간단하지는 않습니다.

$ : do_thing "1" && do_thing "2" && do_thing "3"

do_thing "2" && do_thing "3"어떤 경우에는 별 문제가 아닐 수도 있지만 이와 같은 경우는 어떻습니까 ?

$ : cd /some/deeply/nested/directory && rm -rf *

대부분의 명령은 그렇지 않습니다.그래서해롭습니다. 하지만 이 경우에는 내가 입력한 명령을 실행하기 전에 다른 작업을 수행해야 한다는 사실을 깨닫기 때문에 항상 명령을 실행하고 싶지 않습니다.하지만.

입력한 명령을 저장하는 안정적이고 빠르며 무해하고 쉬운 방법은 무엇입니까?

echo같은 문제가 있었고 :그다지 우아해 보이지 않았습니다.

{내가 보기에는 and }또는 (and 안의 모든 것을 그룹화하는 것이 효과가 있을 것 같지만 )어느 것도 그렇게 하지 않습니다. 그들이 나에게 주었어

zsh: parse error near `}'

그리고

zsh: parse error near `)'

답변1

그냥 사용작은 push-line부품, 이는 기본적으로 이 목적으로 사용되는 모드에서 Alt+ Q및 +에 바인딩됩니다.CtrlQemacs

이렇게 하면 지금까지 입력한 내용이 보류됩니다(대기열에서버퍼 스택zsh 문서에서) 추가 명령을 입력할 수 있도록 편집 버퍼를 지웁니다. 다른 명령이 종료된 후 실행하는 명령은푸시이전 콘텐츠는 편집 버퍼로 자동으로 호출됩니다.

zsh더 나은 위젯(그러나 제어할 수 없는 상황에서 사용하는 경우 도움이 되지 않음 ~/.zshrc)은 push-input전체 위젯을 푸시 하는 것입니다.입력하다그리고 현재 행뿐만이 아닙니다. 여러 줄 명령을 입력할 때 $PS2프롬프트 다음에 명령이 계속되는 것이 더 좋습니다.

bindkey '^Q' push-input
bindkey '^[q' push-input

Alt푸시된 행 또는 입력은 + G( get-line위젯) 를 사용하여 검색할 수도 있습니다 .


다른 쉘에서 작동하는 또 다른 방법은 모드 또는 모드 에서 Ctrl+ 가 있는 행을 삭제한 다음 이를 킬링에 저장하는 것 입니다 .UemacsEscddvi

Ctrl나중에 모드에서 +를 사용하거나 명령 모드에서 /를 사용하여 호출할 수 있습니다 . 모드에서는 + 루프를 사용하여 탐색할 수도 있습니다.YemacspPviemacsAltY살인 반지(과거 잘라내기/복사한 문자열을 기억하세요).

모드 에서는 vi명명된 레지스터에 명령을 저장할 수도 있습니다 vi. 예를 들어, "xddvi 명령 모드에서는 행을 삭제하고 레지스터에 저장하며 x나중에 vi를 사용하여 다시 불러올 수 있습니다 "xP.


interactive_comments귀하의 질문에 대한 보다 직접적인 대답으로, 닫을 때 일부 코드(또는 목록 포함)를 주석 처리하려면 for _()(짧은 형식의 loop for, 여기서는 빈 목록을 반복함) 또는 if (())(짧은 형식의 loop if, 여기에 빈 산술을 삽입할 수 있습니다. 그 앞의 표현식은 0으로 해석됩니다).

foo && bar || baz이는 and-or 목록을 주석 처리 하지만 barin foo; bar또는 foo & bareg 목록은 주석 처리하지 않습니다.

이는 또한 지금까지 입력한 텍스트가 구문적으로 유효하므로 미완성 코드(예: 미완성 인용 텍스트, for 루프...)에 적용되지 않는다고 가정합니다.

동일한 주의 사항이 있는 또 다른 접근 방식은 :||(시작과 )끝 부분에 삽입하는 것입니다. 그러면 유효한 코드가 모두 주석 처리됩니다.


1 기술적으로 말하면 현재버퍼 편집Alt+를 사용하여 줄 바꿈을 입력 Enter하거나 기록 또는 버퍼 스택에서 여러 줄 명령을 호출하는 경우 여전히 여러 줄을 포함할 수 있습니다.

답변2

Stéphane의 첫 번째 제안(푸시 라인 위젯)이 더 간단하고 빠르며 대부분의 경우 더 바람직하지만 다음 중 하나를 명령에 추가할 수도 있다는 것을 알았습니다.

return &&

또는

return;

방금 입력한 명령을 다시 실행하기 전에 여러 명령을 실행해야 한다는 것을 알고 ( )를 여러 번 누르고 싶지 않은 경우 optionQ이 방법이 더 잘 작동할 수 있습니다 . (나중에 제안한) 것보다 더 기억에 남는다 altQ.for _()

관련 정보