Tmux에서 스크롤 백 버퍼를 지우려면 어떻게해야합니까?


답변:


211

이 같은 질문이 꽤 오랫동안 나를 괴롭 혔습니다. 내가 생각해 낸 최고의 것이 있습니다. 이것을 .tmux.conf 파일에 넣으십시오.

bind -n C-k clear-history

이것은 ctrl-k를 tmux clear-history 명령에 바인드합니다. 바인드 후 -n을 사용하면 tmux 명령 접두어 (기본적으로 ctrl-b)를 실행할 필요가 없습니다. bash를 사용하므로 ctrl-l은 이미 명령 줄에 "clear"를 입력하는 것과 같습니다. 이 두 키를 사용하면 멋진 ctrl-l, ctrl-k 콤보가 생겨 모든 스크롤 버퍼를 화면 밖으로 옮기고 ( "clear") 모든 기록을 삭제합니다 (tmux "clear-history"명령).

터미널, iTerm 또는 Konsole의 1 키 콤보만큼 좋은 것은 아니지만 항상 명확한 역사를 입력하는 것보다 낫습니다.


15
좋은. bind k send-keys "clear"\; send-keys "Enter"지우기 부분을 수행하고 있지만 내장 기능을 사용하는 ctrl+l것이 더 간단 clear-history하며 스크롤 백 기록을 제거하는 것이 좋습니다.
Henrik N

1
이 바인딩은 내 창을 조여서 모든 창에서 모든 텍스트를 제거하고 주위의 경계를 제거합니다! 그에 대한 아이디어가 있습니까?
Ian Vaughan

Yikes. 어떤 쉘 프로그램을 사용하십니까? 우연히 ctrl + k에 대해 이미 정의 된 동작이 있습니까?
juanpaco

iTerm2. ctrl + k는 이미 tmux 바인딩 세트없이이 작업을 수행하므로 iTerm2 맵핑이어야합니다.
Ian Vaughan

기묘한. iTerm2도 사용합니다. 한동안 업데이트하지 않았으므로 버전이 다를 수 있습니다. 또한 vik 바인딩에 문제가 발생했기 때문에 더 이상 Ck를 사용하지 않습니다. 나는 지금 Cn을 사용합니다.
juanpaco

58

@juanpaco가 올바르게 언급했듯이 clear-history스크롤 백 버퍼를 지우는 명령입니다.
또한 같은 명령으로 화면의 내용을 지우고 싶다고 덧붙입니다. 발행 send-keys -R난에 다음을 사용할 수 있도록, 리셋 (클리어) 화면을 내.tmux.conf

bind-key b send-keys -R \; clear-history

화면과 스크롤 백 버퍼가 지워집니다.


1
tmux 문서에서 직접 send-keys: "-R 플래그는 터미널 상태를 재설정합니다." 업데이트 만하면됩니다.
z5h

20
-R 사용의 단점은 Ctrl + l로 터미널을 지우는 경우와 달리 현재 입력 행이 숨겨져 있다는 것입니다. 내가 한 것은bind -n C-l send-keys C-l \; clear-history
volpato

6
내가 모르는 것처럼, clear-history명령 을 입력 할 상태에 도달하려면을 Ctrl+B누른 다음 콜론 ( :)으로 명령을 시작하십시오 .
palswim

1
@ volpato 나는 당신의 접근 방식을 좋아하지만 여전히 스크롤 백에 버퍼의 하나의 '화면'을 남깁니다. 왜 그런지 모르겠다. -R은 프롬프트를 비우지 만 끝에 Cm을 추가하여 '해결'했습니다 (그러나 두 번째 줄에 표시).
Gdogg

2
이것을 응축 할 수 있습니다 send-keys -R C-l \; clear-history.
ivan December

35

여기에 대한 모든 대답은 새로운 키 바인딩 추가에 대해 이야기합니다.

가끔하고 싶을 때 매핑이 전혀 필요하지 않습니다 ...

접두사 기본값은 <Ctrl-b>

그냥 입력 <prefix>: 관련 창에서 다음을 입력 clear-history하고 Enter 키를 누릅니다.

tmux의 멋진 점 중 하나는 이와 같은 명령을 실행하거나 쉘 / 스크립트에서 실행 tmux command하거나 키보드 단축키를 만들 수 있다는 것입니다.


8
처음 세 문자를 입력 한 다음 처음에 cle자동 완성한 <tab>다음 두 번째에 사용 <up arrow>하여 이전 항목에 액세스 할 수 있습니다. 이 방법은 매우 빠릅니다.
bct

1
<Ctrl-b> the c` 키를 누른 후 입력을 시작할 때 새 창을 만들도록 설정되어 있기 때문에 이것은 작동하지 않습니다 .
fraxture

이 때 <Ctrl-b>를 누른 후 다음 Enter 키를 눌러 - @fraxture 난 당신이 오해 생각 :그것은 당신에게 대화 형 프롬프트를 제공합니다 - 당신이 'C'를 입력 할 위치 그건
JonnyRaa

21

CTRL-L명확한 역사 를 결합 하려면 다음에 추가하십시오 ~/.tmux.conf.

bind u send-keys C-l \; run-shell "sleep .3s" \; clear-history

예를 들어 MySQL 쉘에있는 경우에도 작동합니다.


1
예를 들어, 작동하지 않는 것 같습니다 tail -f some.log. ctrl-Z이것과 결합하는 방법 이 있습니까? 제대로 된 것 같습니다.
Aaron Gibralter 2016 년

19

나는 send-keys -R조금 느리게 사용 하는 것을 발견했다 -여기 하나의 명령으로 화면과 기록을 지우는 다른 방법이있다

bind-key C send-keys "clear && tmux clear-history" \; send-keys "Enter"  

중첩 된 tmux 호출이보다 명백한 것으로 사용됩니다.

bind-key C send-keys "clear" \; send-keys "Enter" \; clear-history

히스토리에서 화면의 현재 텍스트를 지우지 못함 -clear-history 명령은 키를 보내기 위해 별도의 스레드에서 실행되는 것으로 나타납니다.


5
이 방법에는 한 가지주의 사항이 있으며 로컬 쉘에서만 작동한다는 것입니다. 활성 창에 기록 할 문자열로 tmux clear-history를 전송하기 때문입니다. 나는 그것을 다음에 적응시켰다 :bind-key E send-keys "C-k" \; send-keys "C-u" \; send-keys "clear" \; send-keys "Enter" \; run-shell "sleep .3s; tmux clear-history"
Santi P.

12

가장 간단한 방법으로 방금이라는 쉘 스크립트를 만들고 cls화면과 스크롤 백 버퍼를 지우고 싶을 때마다 실행합니다.

이게 전부입니다 :

cls

clear;
tmux clear-history;

3
그러나 명령 행에 액세스 할 수 없으면 어떻게됩니까? 서버가 실행 중이고 로그를보고있는 경우 등.
zudduz

어디에서 통나무를보고 있을까요? 웹 서버를 통해? 그렇다면 왜 tmux가 관련되어 있는지 알 수 없습니까?
Brad Parks

1
서버 로그와 vim 편집기를 동시에 볼 수있는 것이 좋습니다.
zudduz

TMUX 스플릿을 사용합니까? 그렇지 않다면 창을 2로 나누고 로그를 하나보고 tmux 세션 내에서`tmux split '을 실행하여 다른 창에서 vim을 사용하십시오.
Brad Parks

10

이것은 TMUX 2.6에서 가장 잘 작동하여 화면을 지우고 스크롤을 수행하지만 프롬프트는 계속 표시합니다.

Ctrl-L 사용

bind-key -n C-l send-keys C-l \; send-keys -R \; clear-history

6

Ctrl-L은 콘솔 응용 프로그램에서 화면을 다시 그리는 데 사용됩니다. 에 바인딩 할 때 나는 발견send-keys -R 일부 응용 프로그램 (예 : vim, mc)에서 화살표 키가 더 이상 올바르게 작동하지 않을 수 있습니다.

콘솔 응용 프로그램에서 다시 그리기 기능을 유지하기 위해 다음을 사용했습니다.

bind-key -n C-l if-shell -F '#{alternate_on}' 'send-keys C-l' 'send-keys -R C-l; clear-history'

tmux 옵션이 켜져 있어야합니다 alternate-screen(기본적으로 설정되어 있음).


3

위의 내용과 다른 출처 중 일부를 사용했습니다.

bind k send-keys C-u \; send-keys C-k \; send-keys " clear && tmux clear-history" \; send-keys "Enter" \; run-shell "sleep .3s" \; send-keys "Up" \; send-keys C-u 

"clear && tmux clear-history"의 선행 공간은 명령이 히스토리 파일에 기록되는 것을 방지합니다 (이러한 방식으로 선행 공간을 처리하도록 쉘 설정을 제공합니다. Google "공백 무시 공간"+ 쉘 이름) 정보). 나는 터미널에서 ctrl-k와 더 인라인이기 때문에 내 명령 에이 명령을 표시하지 않기를 원합니다.

첫 번째 전송 키 Cu 및 전송 키 Ck는 "clear && tmux clear-history"가 성공적인지 확인하기 위해 프롬프트에 현재 입력 된 모든 것을 지 웁니다 (예 : 프롬프트에 "ABCDEFG"를 입력하고 D와 E 사이에 커서를 놓으면 "ABCD clear && tmux clear-historyEFG"가 쉘로 전송되지 않아 실패 할 수 있습니다.

전송 키 "위로"및 마지막 전송 키 Cu는 쉘 내부 히스토리에서 마지막 항목을 지 웁니다. 위에서 언급 한 후행 공간에도 쉘의 내부 히스토리에는 "clear ..."행이 포함됩니다. 보내기와 Ctrl-u는 이것을 제거합니다.

마지막으로, iTerm에서 나는 ctrl-k를 ctrl-a k에 매핑하도록 설정했습니다 (나는 tmux 접두사가 ctrl-a로 설정되어 있음). 수년 동안 손이하고 싶은 ctrl-k를 입력 할 수 있습니다 그래서. iTerm> 환경 설정> 프로파일> 키로 이동하고 16 진 코드 "0x01 0x6B"를 전송하는 바로 가기를 추가하여이를 수행합니다. tmux 및 iTerm에서 16 진 코드를 사용하는 방법에 대한 자세한 정보를 제공하는 훌륭한 기사가 있습니다. http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

그것은 tmux와 함께 ctrl-k를 제공합니다. tmux가없는 실제 ctrl-k에는 현재 프롬프트에 입력 한 것이 있으면 화면을 지우는 동안 입력 한 내용이 보존됩니다. 언급했듯이이 접근 방식은 입력 한 내용을 지워야하며 "clear ..."명령이 실패하지 않습니다. 그러나 그것은 꽤 가깝습니다!


2

왜 안돼? bind -n C-l send-keys C-l


이것을 추천하지 않는 이유가 있다면 나에게도 알고 싶습니다.
가스통 산체스

2
우선, 그것은 필요하지 않습니다. -n C-l기본적으로 '이것을 잡아라'라고 말하면 즉시 같은 것을 통과합니다. (즉, 이것은 no-op입니다.) ... 둘째, 당신의 의도 는 꺼져 있습니다 . 스크롤 뒤로 돌아 가지 않고 화면을⌃L 지 웁니다 . 이 질문의 목적은 보이는 터미널이 아닌 (tmux의) 스크롤 백 을 지우는 것 입니다 . ⌃B [
ELLIOTTCABLE

2

많은 연구와 시간을 보낸 후. zsh 및 terminal.app에서 나를 위해 가장 좋은 방법을 찾았습니다.

prefix-c화면을 지우는 데 사용 하고prefix-C 기록을 지우하고는 버퍼 스크롤 나는 그것이 짜증나는 찾을 수 있기 때문에 위의 어떤 라인을 떠나지 않습니다.

Vim없이

# clear screen
bind c send-keys 'C-l'
# clear screen and history
bind C send-keys -R \; send-keys C-l \; clear-history \; send-keys

Vim으로

# check if the pane is running vim
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \ | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"

# clear screen
bind c if-shell "$is_vim" "send-keys c" "send-keys 'C-l'"
# clear screen and history
bind C send-keys -R \; send-keys C-l \; clear-history \; send-keys

2

개별 tmux 창을 지우는 빠른 수정을 위해 별명을 설정할 수 있습니다 ...

# Tmux Clear pane
alias tc='clear; tmux clear-history; clear'

1

그래서, 나는 위에서 오랫동안 plu 의 접근 방식 사용 했지만 그 한계에 동의했습니다 (기본적으로 ⌃L통과하는 것은 그것을 이해하는 프로그램에 파이프되지 않는 한 의미가 없습니다).

그래서 나는이 스레드에 대한 다른 답변으로 다양한 접근 방식을 개선했습니다. 복잡하지만이 방법은 다른 명령 모두에서 작동 합니다 .

# ⌃K: Clears the current pane (from <https://stackoverflow.com/a/34162098>)
bind-key -n C-k \
   if-shell "test \"$(printf '#{pane_current_command}' | tail -c 2)\" = sh" \
      "send-keys C-l ; run-shell 'sleep .3s' ; clear-history" \
      "split-window -vp 100 ; clear-history -t ! ; kill-pane"

함께 사용해보십시오 tail -f /private/var/log/system.log!


주의 사항 :

여기에 중요한 참고 사항이 있습니다. 셸이 아닌 경우 지워지는 창 크기를 보이지 않게 조정 하는 것입니다. 이로 인해 SIGWINCHes를 수신 대기하는 일부 명령 줄 응용 프로그램에서 크기 조정 동작이 트리거 될 수 있습니다 . 그러나 내 추론은 이것이 큰 문제가 아니라는 것입니다. 왜냐하면 그것들은 어쨌든 '지우려고'하지 않을 프로그램이기 때문 입니다 .

또한 쉘 인용 상황은 이미 엉망이며 삽입 할 때 쉽게 하나 이상 이 될 #{pane_current_command}수 있으므로 조심해야합니다.default-command 설정 .

명령 일치 종료에 대한 테스트에도 동일하게 적용됩니다 "sh". 만약 당신이 default-command비슷한 /bin/bash --login또는 복잡한 것을 가지고 있다면 exec, 실제 명령 은 끝나지 않을 수도 있습니다 "sh"; 테스트 대상을 확인 ⌃B :하려면 실행에 사용 display-message '#{pane_current_command}'하십시오.

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