Trailing space khi sao chép từ console


9

Đây là hành vi gây phiền nhiễu mà tôi đã gặp ở đây và thỉnh thoảng: khi bạn chọn văn bản bằng chuột trong bảng điều khiển (nghĩa là sao chép nó), dán nó và nhận ra rằng bạn có thêm khoảng trắng ở cuối mỗi dòng. Đó là,

line 1                                                                          
line 2                                                                          

thay vì

line 1
line 2

Vì vậy, không chỉ một không gian ở cuối mỗi dòng.

Tôi không thể tái tạo vấn đề một cách đáng tin cậy và không thể tìm thấy câu trả lời. Tôi tin rằng với một số phần mềm, nó chỉ xuất hiện sau một thời gian.

Nhưng tôi đã nhận thấy rằng khi tôi mở cùng một tệp vim, trước tiên, ngay từ bảng điều khiển, sau đó tmux, nó hoạt động tốt trong trường hợp trước. Và không có trong cái sau. Xem xét TERM=xterm-256colortrong giao diện điều khiển và TERM=screen-256colortrong tmuxphỏng đoán của tôi là nó phải làm với thiết bị đầu cuối không làm đúng cách hoặc không cho phép các ứng dụng thực hiện đúng. Tôi đoán là khá mơ hồ. Vì vậy, câu hỏi đầu tiên là "Chính xác thì điều gì gây ra nó?"

Và một cái khác là, "Làm thế nào để tôi đi về nó?" Trường hợp xấu nhất là khi tập tin được đặt ở xa. Tôi đã sử dụng để sao chép nó cục bộ và mở nó geditgần đây. Bây giờ tôi được cho là có một tùy chọn để mở nó trong bảng điều khiển mới (vì tôi chủ yếu làm việc theo tmuxphiên) và sao chép từ đó. Điều này có thể được thực hiện đơn giản hơn?

Khi tôi chạy vimtừ tmuxvới TERM=xterm-256color vim, nó cư xử kỳ lạ. Giống như không vẽ nền nơi không có văn bản. Và tôi có vẻ không ổn khi thay đổi TERMbiến (làm cho phần mềm nghĩ rằng nó đang xử lý với thiết bị đầu cuối khác).

Khi chỉnh sửa tập tin cục bộ, tôi thường làm :!gedit %.

Câu trả lời:


3

Bạn sẽ có khoảng trắng ở cuối dòng khi chọn và sao chép từ thiết bị đầu cuối nếu ứng dụng hiển thị khoảng trắng tại vị trí đó. Các ứng dụng có thể hiển thị các khoảng trắng để xóa những gì đã có trước đó. Thiết bị đầu cuối có các lệnh để xóa toàn bộ một dòng hoặc xóa các ký tự bên phải con trỏ; các ứng dụng chọn giữa điều đó và hiển thị các không gian dựa trên những gì chúng cho là hiệu quả nhất. Ví dụ: nếu bạn nhập một số nội dung tại dấu nhắc, sau đó nhấn Backspace, ứng dụng (ví dụ: trình bao) có thể ghi đè ký tự cuối cùng bằng dấu cách.

Nếu bạn có kết nối X11, bạn có thể sử dụng xselhoặc xclipsao chép tệp vào bảng tạm cục bộ.

Về mặt thực nghiệm, Vim dường như trải qua những khó khăn khi không hiển thị các dòng kết thúc bằng khoảng trắng (ngay cả khi bộ đệm chứa một dòng kết thúc bằng khoảng trắng). Vì vậy, sao chép từ đó là một tùy chọn nếu bạn không có kết nối X11.

Một thay thế sẽ là hậu xử lý sau khi sao chép:

xsel | sed 's/  *$//' | xsel

So copying from that is an option if you don't have an X11 connection.Không phải với screentrình giả lập thiết bị đầu cuối giống như, AFAICT ( TERM=screen*). Nói về xselđiểm tốt, bây giờ tôi đang nghĩ đến việc tạo một vimlệnh, đầu ra lệnh shell sẽ được ban hành cục bộ, như :XSelCommand %-> ssh server cat path/to/file | xsel. Điều đó có vẻ tốt hơn so với việc gắn các hệ thống tệp từ xa hoặc sao chép tệp cục bộ.
x-yuri

Vì vậy, với một lệnh như thế này : command! XSelCommand echo 'ssh ' . system('hostname')[:-2] . ' ' . shellescape('sh -c ''cat "$1"'' -- ' . shellescape(expand('%'))) . ' | xsel', hoặc như thế này : command! -range=% RXSelCommand echo 'ssh ' . system('hostname')[:-2] . ' ' . shellescape('sh -c ''cat "$1" | sed -n "<line1>,<line2>p"'' -- ' . shellescape(expand('%'))) . ' | xsel', người ta có thể sao chép nội dung của tệp, chứ không phải đầu ra. Tuy nhiên, tùy chọn dễ dàng hơn là mở tệp trong local vimqua ssh và do :%!xsel. Hoặc làm :r!ssh HOST CMD, và một lần nữa :%!xsel.
x-yuri

Tôi đã xoay sở để giải quyết hai vấn đề xselcho đến nay: 1) :%!xselkhông hoạt động vim, nhưng :%!xsel -ihoạt động, được cho là vì vimchuyển hướng stdoutcũng như stdin; một lựa chọn nữa là :w !xsel, 2) sao chép các tập tin qua 4000 byte không làm việc khi dán để chrometextareaví dụ, nhưng công trình cho gedit; tab bị treo trong 10 giây hoặc lâu hơn, nhưng sau đó không có gì được dán; Bạn có biết đó là loại ma thuật gì không?
x-yuri

... Và không có gì xảy ra khi sao chép từ geditsang chromebằng nút chuột giữa.
x-yuri

@ x-yuri Tôi không biết tại sao sẽ có giới hạn kích thước. Hãy thử thay đổi xsel/ nút chuột giữa thành xsel -b/ Ctrl + V, sử dụng cơ chế lựa chọn hơi khác nhau có thể là lỗi khác nhau.
Gilles 'SO- ngừng trở nên xấu xa'

3

Đó thực sự là một số câu hỏi và không có câu trả lời nào làm được nhiều hơn việc đọc lướt qua những phần thú vị:

  • khi bạn chọn văn bản bằng chuột trong bảng điều khiển (nghĩa là sao chép nó), dán nó và nhận ra bạn đã có thêm khoảng trắng ở cuối mỗi dòng.
  • Khi tôi chạy vim từ tmux với TERM = xterm-256color vim, nó hoạt động rất kỳ lạ.

Hầu hết các thiết bị đầu cuối (như xterm) lưu trữ dữ liệu mà bạn có thể chọn trên màn hình. Không có phần ẩn đằng sau nó nói với thiết bị đầu cuối rằng ứng dụng có nghĩa là điền vào một nền.

Các ứng dụng cập nhật màn hình bằng cách di chuyển con trỏ xung quanh, viết văn bản (có thể bao gồm các khoảng trắng thực tế - hoặc các tab mà thiết bị đầu cuối hiển thị dưới dạng khoảng trắng) và xóa các phần của màn hình.

Xóa là một vấn đề đặc biệt (đối với chọn / dán), vì nhiều thiết bị đầu cuối (như xterm) sẽ lấp đầy khu vực bị xóa của màn hình bằng màu hiện tại (tính năng xóa màu mặt sau (bce) trong mô tả thiết bị đầu cuối). Nhưng đồng thời, các khu vực bị xóa không còn có các ký tự được lưu trữ trong các vị trí đó của màn hình. Thiết bị đầu cuối sử dụng biểu diễn trên màn hình sẽ cho phép bạn chọn mọi thứ trừ khu vực bị xóa. (Trong trường hợp đặc biệt, thiết bị đầu cuối của bạn có thể đã xóa các vùng được bao quanh bởi văn bản, nó sẽ giả vờ là khoảng trắng để chọn).

Tất cả điều đó gây phiền toái, và xterm từ lâu đã cung cấp một tính năng để bỏ qua các khoảng trắng ở cuối. Hầu hết các thiết bị đầu cuối khác không cung cấp điều đó. Và vì đó là một tùy chọn, nó có thể không được bật nếu bạn tình cờ chạy xterm. Hầu hết các nhà phát triển thiết bị đầu cuối sao chép các tính năng của xterm không sao chép các tùy chọn.

Truy cập tmux: nó không hỗ trợ tính năng bce. Các nhà phát triển của nó đã quyết định không. Vì vậy, các ứng dụng bình thường chạy trong tmux sẽ tạo ra các khoảng trống. Khi bạn ghi đè mô tả thiết bị đầu cuối, nó sẽ nhầm lẫn tmux, vì nó không biết rằng vim thực sự giả định rằng nền sẽ bị xóa bằng cách sử dụng màu hiện tại. Bạn chỉ cần tẩy xóa. Không màu.

Mặt khác, các nhà phát triển của màn hình GNU đã quyết định quay lại để hỗ trợ tính năng này. Đó là tùy chọn ...

Đọc thêm:

  • Hỗ trợ xóa màu nền (bce) [là: Sao chép Vim và dán vấn đề không gian dấu vết] # 109 (báo cáo lỗi tmux)
  • Thiết bị đầu cuối của tôi hiển thị một số không gian không màu (Câu hỏi thường gặp)
  • Rắc rối với thiết bị đầu cuối (thảo luận hữu ích về chủ đề này)
  • highlightSelection (hướng dẫn sử dụng xterm)
  • trimSelection (hướng dẫn sử dụng xterm)

    Nếu bạn đặt highlightSelection, bạn có thể thấy văn bản được chọn, bao gồm mọi khoảng trắng ở cuối. Xóa màn hình (hoặc một dòng) đặt lại nó về trạng thái không chứa khoảng trắng. Một số dòng có thể chứa dấu cách khi ứng dụng ghi chúng vào màn hình. Tuy nhiên, bạn có thể không muốn dán các dòng có dấu cách. Nếu tài nguyên này là đúng, xterm sẽ cắt các khoảng trắng ở văn bản được chọn. Nó không ảnh hưởng đến các không gian dẫn đến một dòng được bao bọc, cũng sẽ không cắt bớt dòng mới từ lựa chọn của bạn. Mặc định này sai".

  • Bản vá số 105 - 1999/6/5 - XFree86 3.9Pp (thay đổi xterm)

    triển khai tài nguyên mới trimSelection, cho phép xterm cắt các khoảng trống ở các dòng được chọn. Điều này không ảnh hưởng đến việc làm nổi bật.

  • Bản vá số 27 - 1996/8/21 - XFree86 3.1.2Ek (thay đổi xterm đề cập đến highlightSelection)

    Bản vá này khắc phục một trong những sự kìm kẹp lâu dài của tôi: lựa chọn của xterm không hiển thị rõ ràng những gì đang được chọn (theo yêu cầu của David, nó được kiểm soát bởi một tài nguyên, mặc định cho hành vi cũ hơn).


Ý tưởng chung có vẻ rõ ràng, nhưng tôi có thể không hiểu chi tiết của một số tuyên bố, hoặc không chắc chắn nếu tôi làm, như ... Terminals which use the on-screen representationcác loại thiết bị đầu cuối khác là gì? Có phải chúng được bao phủ trong câu trả lời của bạn? As a special case, your terminal could have erased regions surrounded by text, which it will pretend are spaces for selectionỞ đây bạn có thể có nghĩa là "đánh dấu là bị xóa". Và đây là những khu vực nào? Khoảng cách ở giữa dòng? Dòng trống bao quanh bởi văn bản? Đây có lẽ là những người ít rõ ràng nhất.
x-yuri

Các loại khác: các ứng dụng (như lời nguyền) có mức độ "biết" cao hơn nếu chúng xóa toàn bộ màn hình hoặc sơn lại một dòng và có dữ liệu để tái tạo lại mọi thứ theo nhiều cách. "Đã đánh dấu là đã xóa": ví dụ xterm có thể hiển thị khoảng trống cho các khu vực bị xóa, nhưng thực sự không có ký tự.
Thomas Dickey

fwiw, "màn hình" và "tmux" là những ví dụ phổ biến của các ứng dụng có thể thao tác với thiết bị đầu cuối để lựa chọn hoạt động khác nhau.
Thomas Dickey

2

Trong rất nhiều ứng dụng Terminal hiện đại, có các cài đặt như "Cắt dấu cách" trong các tùy chọn chuột / sao chép. Chúng có mặt cho Konsole (KDE) & Yakuake.


2

Sao chép và dán từ màn hình đầu cuối sẽ không bao giờ đáng tin cậy hoàn toàn vì nó xử lý đầu ra màn hình thay vì nguyên liệu gốc. Nếu một số ứng dụng lặp lại văn bản đến thiết bị đầu cuối một cách bất thường và kết quả là thiết bị đầu cuối không thể đoán được văn bản gốc là gì, thì có lẽ bạn hoặc thiết bị đầu cuối không thể làm gì nhiều về nó.

Rất nhiều thông tin về văn bản gốc có khả năng bị mất khi được kết xuất đến một thiết bị đầu cuối: ví dụ: một khu vực của khoảng trắng được tạo bởi một tab hoặc bởi một loạt các khoảng trắng, hoặc liệu hai hàng văn bản ban đầu có dài không dòng được bọc hoặc hai dòng riêng biệt.

Thiết bị đầu cuối cố gắng làm hết sức mình để cho phép bạn sao chép và dán văn bản gốc đã lặp lại vào thiết bị đầu cuối nhưng không thể luôn biết.

Để thử nghiệm, hãy thử điều này:

  • Sử dụng lessđể xem tệp chứa các dòng rất dài bao quanh nhiều dòng thiết bị đầu cuối.
  • Bấm ba lần vào một trong những dòng đó (đối với toàn bộ dòng chọn). lessđã chọn toàn bộ dòng logic kéo dài nhiều dòng vật lý và nếu bạn dán nó ở nơi khác, nó sẽ được giữ nguyên thành một dòng dài.
  • Nhấn jmột số dòng để một phần của dòng dài đó biến mất khỏi đỉnh màn hình.
  • Nhấn kmột hoặc nhiều lần để cuộn toàn bộ dòng logic trở lại xem.
  • Nhấp ba lần vào dòng logic một lần nữa. Lần này chỉ có một dòng vật lý được chọn. Đó là bởi vì lesssơn lại dòng vật lý màn hình bằng dòng vật lý và thiết bị đầu cuối không còn cách nào để biết rằng các dòng vật lý được kết nối với nhau.
  • Bây giờ nếu bạn kéo và chọn toàn bộ dòng logic theo cách thủ công và dán nó vào nơi khác, bạn sẽ thấy rằng nó đã nhúng dòng mới.

YMMV trong thử nghiệm đó vì thiết bị đầu cuối của bạn (hoặc phiên bản less) có thể thông minh hơn hoặc ít hơn so với của tôi.

Nói chung, phần mềm tạo ra đầu ra càng nhiều thì cơ hội của bạn càng có thể sao chép và dán chính xác nguyên liệu ban đầu. cat, đối với một, là khá nhiều ngu ngốc như nó được. (Tất nhiên bạn hiểu rằng "ngu ngốc" là một lời khen!)

Nếu bạn có thêm một ký tự khoảng trắng ở cuối dòng tmux, có lẽ vì tmuxnó thực sự lặp lại ký tự đó. Hãy nhớ rằng tmuxmô phỏng thiết bị đầu cuối của chính nó và sau đó phát lại các chuỗi thiết bị đầu cuối mới để kết xuất đến thiết bị đầu cuối bên dưới. Có lẽ nó đang lặp lại nhân vật không gian đó bởi vì nó tin rằng trong một số trường hợp có thể cần phải ghi đè lên một số nhân vật khác mà nó nghĩ có thể ở đó. Dù lý do là gì, thiết bị đầu cuối có lẽ không có cách nào để biết rằng nhân vật không gian không thực sự là một phần của nội dung ban đầu.


Bạn làm cho tôi đưa ra một cách giải quyết: catmột tệp và sao chép đầu ra của cat. Ít nhất trong trường hợp cụ thể của tôi nó hoạt động. Cảm ơn :) Nhưng nếu đó là một tệp dài ... Chà, tôi đã suy nghĩ về việc gắn hệ thống tập tin từ xa ( sshfs), sau đó tôi có thể chỉnh sửa một tệp với geditví dụ như là một tệp cục bộ.
x-yuri

Nếu dữ liệu bạn muốn sao chép có trong tệp, bạn có thể sử dụng xsel -bi < filenameđể sao chép tất cả dữ liệu đó một cách an toàn ... Tuy nhiên, hãy sử dụng phiên bản gần đây của xsel
Matija Nalis

1

Sử dụng Fedora 17 Linux và cửa sổ đầu cuối konsole, tôi mở vim với bổ trợ vim tổng hợp, tôi có thể tái tạo lỗi này một cách nhất quán. Tôi đặt ba dòng trăn này trong vim:

a = "generic assignment"
b = "cursor is on this line"
c = "generic assignment"

Sau đó, tôi trực quan chọn những dòng đó và dán nó ở đây:

a = "generic assignment"
b = "cursor is on this line"                                                                                     
c = "generic assignment"

Lưu ý cách dòng thứ hai có hàng tấn khoảng trắng được sao chép. Điều đó chắc chắn sẽ gây phiền nhiễu.

Dòng 1 và 3 được sao chép như mong đợi, nhưng dòng thứ hai sao chép khoảng trắng cho đến vị trí ngoài cùng bên phải của cửa sổ terminal.

Giải pháp giải quyết vấn đề:

Di chuyển dòng được tô sáng (con trỏ vim) ra khỏi các dòng bạn muốn sao chép trước khi chọn nó bằng chuột. Sau đó, các khoảng trắng thừa không xuất hiện trên một dòng đó.

Tôi đoán đó là cú pháp và tô sáng các tiện ích bổ sung đang gây ra những vấn đề này.


Tôi có dòng 1 đệm với không gian là tốt.
x-yuri

0

Tôi cũng sử dụng xterm-256colorvà luôn không thích khoảng trắng ở cuối khi sao chép giữa các thiết bị đầu cuối, ví dụ như sao chép toàn bộ tệp giữa hai máy chủ từ xa. Những gì tôi thấy dễ nhất chỉ là sao chép toàn bộ tập tin và sau đó trong lần chạy đích:

:%s/\s\+$//g

Điều này sẽ loại bỏ tất cả các khoảng trắng theo dõi từ toàn bộ tệp. Thật nhanh và dễ dàng.


Thỉnh thoảng tôi nhận được ít dòng hơn trong bản gốc (dòng mới không phải luôn luôn truyền bá). Bạn có thể muốn kiểm tra điều này sau khi thực hiện thay thế.
x-yuri

-1

xterm-256colorbây giờ dường như hoạt động chính xác (đầy đủ màu sắc và không có vấn đề vẽ nền) và có chức năng BCE (xóa màu ngược). Bạn có thể kích hoạt nó trong tmux bằng cách đặt cái này vào ~/.tmux.conf:

set -g default-terminal "xterm-256color"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.