Tương tác vim / xterm lạ: tự động chèn thanh ghi `" `khi mở tệp


7

Điều này đang khiến tôi phát điên. Tôi đang sử dụng XTerm (330) và vim 8.0.1365 mới nhất (trên FreeBSD).

Đôi khi, không phải lúc nào cũng vậy, khoảng 1 trên 5, khi tôi mở một tệp bằng vim, một dòng vui nhộn được chèn ở trên dòng 1. Sau nhiều lần gãi đầu, tôi nhận ra đó là dòng cuối cùng tôi đã xóa trong một phiên trước đó. Nói cách khác, có vẻ như ""P(dán thanh "ghi) đang chạy.

Sau một số điều tra thêm, tôi thấy điều này chỉ xảy ra khi tôi đã *sunKeyboard: trueđặt trong tài nguyên XTerm và khi tôi sử dụng phông chữ được hiển thị, chẳng hạn như -fa "DejaVu Sans Mono:size=24". (Tôi đã nói với bạn điều đó thật lạ phải không?). Tôi không có .vimrcvà không có .vimthư mục, để tránh mọi thủ thuật chơi plugin trên tôi.

Tôi có thể tái tạo hiệu ứng phần nào với các lệnh sau:

#!/bin/sh
rm -f .viminfo; echo inserted >bar; echo x >baz
vim -c d -c wq bar
echo '*sunKeyboard: true' > XTerm
export XAPPLRESDIR=$PWD
for i in 1 2 3 4 5 6; do
   xterm -fa "DejaVu Sans Mono:size=24" -e vim baz
done

Điều này sẽ tạo ra các tập tin cần thiết, đặt insertedvào thanh "ghi và gọi vim một vài lần. Nếu bạn thấy một tệp một dòng với xdòng đầu tiên, tất cả đều ổn; nhập qcho lần gọi tiếp theo Nếu tuy nhiên bạn thấy

inserte2
x

bạn đã tái tạo vấn đề. Cũng lưu ý rằng ký tự cuối cùng của dòng 1 đã được thay thế bằng 2. Điều này dường như đến từ .đăng ký. Dưới đây là các thanh ghi:

:reg
--- Registers ---
""   inserted^J
"1   inserted^J
".   2
"%   baz
  • Thử kịch bản nhiều lần, bạn có thể tái tạo vấn đề không? Hãy chắc chắn để di chuyển .vimrc.vimtạm thời ra khỏi đường.
  • Nếu vậy, bạn có thể cho tôi biết những gì đang xảy ra ở đây?
  • Bất kỳ đề xuất làm thế nào để đi đến tận cùng của điều này?

CẬP NHẬT

Có vẻ như tôi không phải là người duy nhất: https://github.com/vim/vim/issues/2238


set t_RS=hoặc set t_SH=trong vimrc của bạn làm việc?
Thánh lễ

@Mass Có, một trong số chúng hoạt động, tức là không chèn thêm dòng ma thuật. Với các mục này, :reglệnh không còn hiển thị ".nội dung.
Jens

Bạn đã kiểm tra xem github.com/vim/vim/pull/2126 có khắc phục được sự cố của bạn không? Chính xác thì đầu ra của :echo v:termresponsecái gì?
Christian Brabandt

@ChristianBrabandt Đầu ra là ^[[>19;331;0c. Trang github là một mê cung nhỏ ngoằn ngoèo, tôi không biết làm thế nào để lượm lặt thông tin từ đó. Gần phía dưới nó nói "đã đóng", nhưng dường như tôi không thể tìm thấy số bản vá, chẳng hạn như "đã sửa trong 8.0. ####". Cảm ơn đã dành thời gian để bình luận!
Jens

Câu trả lời:


4

Khi vim khởi động, nó sẽ thẩm vấn trình giả lập thiết bị đầu cuối của bạn, nó đáp ứng với các mã đầu cuối. vim thường chụp cái này trong v:termresponse. Tuy nhiên, đôi khi, các mã được thông qua và chúng thường trông giống như các lệnh vim và gây ra hành vi ngoài ý muốn.

Hai trong số các tùy chọn kiểm soát những gì vim gửi dường như gây ra nhiều vấn đề cho mọi người:

t_RS    request terminal cursor style           *t_RS* *'t_RS'*
t_SH    set cursor shape                        *t_SH* *'t_SH'*

Chúng được thêm vào gần đây để cho phép vim đặt hình dạng con trỏ và xác định con trỏ đầu cuối mặc định. Đặt một trong hai thứ này thành trống ( set t_SH=hoặc set t_RS=) khiến vim bỏ qua kiểm tra. Đó là phản hồi từ thiết bị đầu cuối của bạn gây ra vấn đề.

Đây rất có thể là một lỗi vim, vì nó sẽ hoạt động theo mặc định trong xterm. Bên cạnh việc đặt các tùy chọn này thành trống, tôi đề nghị,

  • cập nhật lên phiên bản vim mới nhất
  • báo cáo lỗi (xem :h bugs), lưu ý cẩn thận trình giả lập nền tảng và thiết bị đầu cuối của bạn, hành vi chính xác được nhìn thấy và giá trị của v:termresponse.
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.