제가 가끔 겪는 짜증나는 동작은 다음과 같습니다. 콘솔에서 마우스로 텍스트를 선택(예: 복사)하고 붙여넣으면 각 줄 끝에 추가 공백이 나타납니다. 그건,
line 1
line 2
바꾸다
line 1
line 2
따라서 각 줄의 끝에는 공백만 있는 것이 아닙니다.
문제를 안정적으로 재현할 수 없으며 답변을 찾을 수 없습니다. 나는 일부 소프트웨어에서는 그것이 잠시 후에야 분명해진다고 믿습니다.
하지만 방금 동일한 파일을 에서 열 때 vim
처음에는 콘솔에서 열었고 다음에는 에서 열었을 때 tmux
전자의 경우에는 제대로 작동한다는 것을 알았습니다. 후자는 그렇지 않습니다. TERM=xterm-256color
콘솔과 에서 TERM=screen-256color
이를 고려하면 tmux
터미널이 이 작업을 올바르게 수행하지 않거나 애플리케이션이 이를 올바르게 수행하지 못하는 것과 관련이 있는 것 같습니다. 나는 이것이 다소 모호한 추측이라고 생각합니다. 그래서 첫 번째 질문은 “이 문제의 원인이 정확히 무엇입니까?”입니다.
또 다른 질문은 "어떻게 해야 합니까?"입니다. 최악의 시나리오는 파일이 원격에 위치한다는 것입니다. 나는 그것을 로컬로 복사한 다음 가장 최근의 것으로 열곤 했습니다 gedit
. 이제 새 콘솔에서 열고(주로 tmux
세션에서 작업하므로) 거기에서 복사할 수 있는 옵션이 있어야 합니다. 이것을 더 간단하게 만들 수 있습니까?
내가 도망치면 vim
이상하게 tmux
행동 TERM=xterm-256color vim
합니다. 텍스트가 없으면 배경이 그려지지 않는 것과 같습니다. 나에게는 변수를 변경하는 것이 적절하지 않은 것 같습니다 TERM
(소프트웨어가 다른 터미널을 다루고 있다고 생각하게 만듭니다).
저는 보통 로컬 파일을 편집할 때 이렇게 합니다 :!gedit %
.
답변1
응용 프로그램이 거기에 공백을 표시하는 경우 터미널에서 선택하고 복사할 때 줄 끝에 공백이 표시됩니다. 애플리케이션은 이전 콘텐츠를 삭제하기 위해 공백을 표시할 수 있습니다. 터미널에는 전체 줄을 삭제하거나 커서 오른쪽에 있는 문자를 삭제하는 명령이 있습니다. 응용 프로그램은 가장 효율적이라고 생각하는 것을 기준으로 표시 공간과 표시 공간 중에서 선택합니다. 예를 들어 프롬프트에 무언가를 입력한 다음 백스페이스 키를 누르면 응용 프로그램(예: 셸)이 마지막 문자를 공백으로 덮어쓸 수 있습니다.
X11 연결이 있는 경우 파일을 사용 xsel
하거나 로컬 클립보드에 복사할 수 있습니다.xclip
실험적으로 Vim은 (버퍼에 공백으로 끝나는 줄이 있더라도) 공백으로 끝나는 줄을 표시하지 않으려고 애쓰는 것 같습니다. 따라서 X11 연결이 없는 경우 X11 연결에서 복사하도록 선택할 수 있습니다.
또 다른 방법은 복사 후 사후 처리하는 것입니다.
xsel | sed 's/ *$//' | xsel
답변2
이것은 실제로 몇 가지 질문이며 답변 중 흥미로운 부분을 건너뛰는 답변은 없습니다.
- 콘솔에서 마우스로 텍스트를 선택(예: 복사)하고 붙여넣으면 각 줄 끝에 추가 공백이 있음을 알 수 있습니다.
- TERM=xterm-256color vim을 사용하여 tmux에서 vim을 실행하면 이상하게 동작합니다.
xterm과 같은 대부분의 터미널은 선택할 수 있는 데이터를 저장합니다.존재하다화면. 뒤에 숨겨진 부분이 없으면 앱이 배경을 채우도록 의도되었음을 터미널에 알립니다.
애플리케이션은 커서를 이동하고 텍스트(터미널에 표시되는 실제 공백이나 탭이 포함될 수 있음)를 작성하여 화면을 업데이트합니다.표현공백으로) 화면의 일부를 지웁니다.
많은 터미널(예: xterm)이 삭제를 수행하므로 삭제는 선택/붙여넣기의 특정 문제입니다.가득한화면의 지워지는 부분을 현재 색상으로(단말기 설명의 배경색 지우기(bce) 기능) 그러나 동시에 지워진 영역은 더 이상 화면의 해당 위치에 문자를 저장하지 않습니다. 터미널의 화면 표현을 사용하면 지워진 영역을 제외한 모든 것을 선택할 수 있습니다. (특별한 경우로, 귀하의 단말기는할 수 있다선택 가능한 공간인 것처럼 보이는 텍스트로 둘러싸인 영역을 제거했습니다.
이 모든 것은 골치 아픈 일입니다. xterm은 오래 전에 후행 공백을 무시하는 기능을 제공했습니다. 대부분의 다른 터미널에서는 이 기능을 제공하지 않습니다. 옵션이므로 xterm을 실행하는 경우에는 켜지지 않을 수 있습니다. xterm 기능을 복사하는 대부분의 터미널 개발자는 옵션을 복사하지 않습니다.
tmux로 이동하세요. bce 기능을 지원하지 않습니다. 개발자들은 이를 수행하지 않기로 결정했습니다. 따라서 tmux에서 실행되는 일반 애플리케이션은 후행 공백을 생성합니다. 터미널 설명을 무시하면 vim이 배경이 지워질 것이라고 가정한다는 것을 모르기 때문에 tmux를 혼란스럽게 합니다.사용현재 색상. 삭제하시면 됩니다. 색깔이 없습니다.
한편, GNU 화면 개발자들은 얼마 전 이 기능을 지원하기로 결정했습니다. 이는 선택사항입니다...
추가 자료:
- 배경색 삭제 지원(bce) [원본: Vim 복사-붙여넣기 후행 공백 문제] #109(tmux 오류 보고)
- 내 터미널에 색칠되지 않은 공간이 표시됩니다.(ncurses FAQ)
- 터미널 문제(이 주제에 대한 유용한 토론)
highlightSelection
(xterm 매뉴얼)trimSelection
(xterm 매뉴얼)하이라이트 선택을 설정하면 후행 공백을 포함하여 선택한 텍스트를 볼 수 있습니다. 화면(또는 줄)을 지우면 공백이 없는 상태로 재설정됩니다. 응용 프로그램이 화면에 특정 줄을 쓸 때 일부 줄에는 후행 공백이 포함될 수 있습니다. 그러나 뒤에 공백이 있는 줄을 붙여넣고 싶지 않을 수도 있습니다. 이 리소스가 true이면 xterm은 선택한 텍스트에서 후행 공백을 제거합니다. 줄 바꿈을 유발하는 공백에는 영향을 주지 않으며 선택 항목에서 후행 줄 바꿈을 자르지도 않습니다. 기본값은 "거짓"입니다.
- 패치 #105 - 1999/6/5 - XFree86 3.9Pp(xterm 변경 로그)
새로운 리소스 구현
trimSelection
, xterm이 선택한 줄의 후행 공백을 잘라낼 수 있습니다. 이는 강조 표시에 영향을 주지 않습니다. - 패치 #27 - 1996/8/21 - XFree86 3.1.2Ek(xterm 변경 로그는
highlightSelection
)이 패치는 나의 오랜 불만 사항 중 하나를 해결합니다. xterm의 선택은 선택된 항목을 명확하게 표시하지 않습니다(David의 요청에 따라 리소스가 제어되며 기본값은 이전 동작으로 설정됩니다).
답변3
터미널 화면에서 복사하여 붙여넣는 것은 원본 소스 자료가 아닌 화면 출력을 다루기 때문에 결코 완전히 신뢰할 수 없습니다. 일부 응용 프로그램이 터미널이 원래 텍스트가 무엇인지 추측하지 못하도록 하는 비정상적인 방식으로 텍스트를 다시 터미널에 에코하는 경우 사용자나 터미널이 이에 대해 할 수 있는 일은 아마도 없을 것입니다.
원본 텍스트가 터미널에 렌더링되면 원본 텍스트에 대한 많은 정보가 손실될 수 있습니다. 예를 들어 공백이 탭 문자나 일련의 공백에 의해 생성되었는지 또는 두 줄의 텍스트가 원래 한 줄이었는지 여부 등이 있습니다. 한 줄 또는 두 개의 별도 줄로 묶인 텍스트입니다.
터미널은 터미널에 에코된 원본 텍스트를 복사하여 붙여넣을 수 있도록 최선을 다하지만 항상 알 수는 없습니다.
실험적으로 다음을 시도해 보세요.
less
여러 터미널 줄에 걸쳐 있는 매우 긴 줄이 포함된 파일을 보는 데 유용합니다 .- 행 중 하나를 세 번 클릭합니다(전체 행 선택).
less
여러 물리적 줄에 걸쳐 있는 전체 논리적 줄을 선택하고, 다른 곳에 붙여넣으면 하나의 긴 줄로 유지됩니다. - j몇 개의 행 만큼부분그 긴 줄의 일부가 화면 상단에서 사라졌습니다.
- 한 번 또는 여러 번 누르면 k전체 논리적 행이 다시 보기로 스크롤됩니다.
- 논리 라인을 다시 세 번 클릭합니다. 이번에는 물리적인 라인 하나만 선택되었습니다. 이는
less
화면의 물리적 선이 하나씩 다시 그려지고, 터미널은 더 이상 물리적 선이 서로 연결되어 있다는 것을 알 수 없기 때문입니다. - 이제 전체 논리 줄을 수동으로 끌어서 다른 곳에 붙여 넣으면 줄 바꿈이 포함되어 있음을 알 수 있습니다.
귀하의 터미널(또는 그 버전 less
)이 내 것보다 다소 똑똑할 수 있기 때문에 YMMV는 이 실험에 반대표를 던졌습니다.
일반적으로 출력을 생성하는 소프트웨어가 멍청할수록 원본 자료를 정확하게 복사하여 붙여넣을 수 있는 가능성이 더 높아집니다. cat
한편으로는 거의 어리석습니다. (물론 당신은 "멍청하다"가 칭찬이라는 것을 이해합니다!)
아래 줄 끝에 추가 공백 문자가 표시되면 해당 문자가 실제로 에코되기 tmux
때문일 수 있습니다 . 자체 터미널 에뮬레이션을 수행한 다음 새 터미널 시퀀스를 다시 발행하여 기본 터미널에 렌더링한다는 점을 tmux
기억하십시오 . tmux
어쩌면 어떤 경우에는 존재할 수 있다고 생각되는 다른 문자를 덮어써야 할 수도 있다고 생각하기 때문에 해당 공백 문자를 반영할 수도 있습니다. 어떤 이유로든 터미널은 공백 문자가 실제로 원본 콘텐츠의 일부가 아니라는 사실을 알지 못할 수 있습니다.
답변4
Fedora 17 Linux 및 konsole 터미널 창을 사용하여 구문 vim 플러그인을 사용하여 vim을 열었고 이 오류를 일관되게 재현할 수 있었습니다. 다음 세 줄의 Python 코드를 vim에 넣었습니다.
a = "generic assignment"
b = "cursor is on this line"
c = "generic assignment"
그런 다음 시각적으로 줄을 선택하여 여기에 붙여넣었습니다.
a = "generic assignment"
b = "cursor is on this line"
c = "generic assignment"
두 번째 줄에서 공백이 어떻게 많이 복제되는지 확인하세요. 이것은 짜증나는 일임에 틀림없다.
1행과 3행은 예상대로 복사되지만 두 번째 행은 터미널 창의 맨 오른쪽까지 공백을 복사합니다.
해결책:
마우스로 선택하기 전에 강조 표시된 줄(vim 커서)을 복사하려는 줄에서 멀리 이동하세요. 그러면 이 줄에 추가 공백이 나타나지 않습니다.
내 생각에는 구문 및 색상 강조 플러그인이 이러한 문제를 일으키는 것 같습니다.