Văn bản tạm thời ở vị trí cửa sổ không có văn bản để chỉnh sửa / lớp phủ?


9

H: làm cách nào để tôi tạm thời hiển thị văn bản trong một cửa sổ tại các vị trí trên màn hình không có văn bản để chỉnh sửa / lớp phủ?

Tôi quen thuộc với ý tưởng cơ bản đằng sau các thuộc tính văn bảnlớp phủ (cũng xem chủ đề này ), đã sử dụng chúng một vài lần, nhưng không có nghĩa là chúng có kinh nghiệm với chúng. Hiểu biết hạn chế của tôi là cần phải có văn bản để chỉnh sửa hoặc lớp phủ, nhưng tôi tự hỏi làm thế nào để sử dụng các phần của cửa sổ không có bất kỳ văn bản nào trong đó.

Đây là một ảnh chụp màn hình cho một ví dụ:

nhập mô tả hình ảnh ở đây

Làm thế nào người ta có thể đặt văn bản (tạm thời) vào một trong các ô màu đỏ trong ảnh chụp màn hình, nghĩa là khoảng trống ở bên phải của văn bản hoặc bên dưới dòng cuối cùng trong bộ đệm?


Nói tóm lại, Bạn có thể sử dụng thuộc tính hiển thị để hiển thị văn bản không có ở đó. Ai đó có thể trả lời đầy đủ trước khi tôi về nhà.
Malabarba

chế độ công ty hoàn thành việc đặt lớp phủ trên văn bản nếu có đủ điểm sau hoặc trước điểm với thuộc tính hiển thị, thay vào đó, nó sử dụng thuộc tính chuỗi sau để hiển thị nội dung bên dưới phần cuối của bộ đệm. Tôi không chắc chắn về việc hiển thị một cái gì đó ở bên cạnh, nhưng dường như có thể với chiều rộng và vị trí phù hợp của lớp phủ.
wasamasa

Bạn có thể không chỉ insertvăn bản vào bộ đệm và điều chỉnh nó?
rekado

Câu trả lời:


6

Tôi đã lấy ra một ví dụ hoạt động của một hàm lấy một chuỗi và tạm thời hiển thị nó với thời gian chờ sau văn bản bộ đệm:

(defun my-momentarily-display-after-buffer-end (string &optional timeout)
  (let ((ov (make-overlay (point-max) (point-max))))
    (overlay-put ov 'after-string
                 (concat (propertize " " 'display
                                     '(space :align-to (+ left-fringe 10)))
                         (propertize string 'display
                                     '(raise -1))
                         "\n\n"))
    (sit-for (or timeout 5))
    (delete-overlay ov)))

Câu thần chú sau đây sẽ dẫn đến ví dụ hộp màu đỏ thấp hơn của bạn:

(my-momentarily-display-after-buffer-end "Nothing to see here...")

Lý do công việc này là do các lớp phủ sử dụng các dấu làm vị trí được hiển thị giữa. Sử dụng vị trí ngoài cùng là bắt đầu và kết thúc lớp phủ cho phép bạn hiển thị văn bản sau nó bằng cách sử dụng thuộc after-stringtính. Vì các lớp phủ có thể chứa văn bản phù hợp, tôi thiết lập nó để xuất hiện thụt lề và với khoảng trắng xung quanh nó.

Ví dụ khác có thể sử dụng cùng một ý tưởng để hiển thị văn bản sau khi kết thúc dòng:

(defun my-momentarily-display-after-line-end (string &optional timeout)
  (let ((ov (make-overlay (line-end-position) (line-end-position))))
    (overlay-put
     ov 'after-string
     (concat (propertize " " 'display
                         `(space :align-to (- right-fringe
                                              ,(1+ (length string)))))
             string))
    (sit-for (or timeout 5))
    (delete-overlay ov)))

Yêu cầu sau đây sẽ dẫn đến ví dụ hộp màu đỏ bên phải của bạn:

(my-momentarily-display-after-line-end "annotation")

Bạn có thể điên hơn rất nhiều và thêm các khuôn mặt để phân biệt các lớp phủ này với văn bản đệm, hiển thị chúng lâu hơn thời gian chờ, điều chỉnh vị trí của chúng, phát hiện khi không có khoảng trống và sử dụng lớp phủ bình thường của văn bản được chỉnh sửa, v.v. Tôi khuyên bạn nên xem mã nguồn của chế độ công ty vì nó rất dễ đọc và thể hiện cách sử dụng lớp phủ phức tạp hơn (và chủ yếu là không có lỗi) để tạo menu bật lên linh hoạt với các tính năng được đề xuất.


2

Bạn có thể tạm thời hiển thị văn bản trong một bộ đệm với chức năng momentary-string-display. Nó nhận một thông báo để hiển thị và một vị trí trong bộ đệm.

Điều này:

(momentary-string-display "hello there" 200)

sẽ đặt chuỗi "hello there" ở vị trí 200 trong bộ đệm. Nó sẽ di chuyển tất cả các văn bản khác tại thời điểm này sang một bên để nhường chỗ cho "thế giới xin chào", nhưng mọi thứ sẽ được khôi phục về vị trí của nó khi bạn nhấn bất kỳ phím nào.

Bạn không cần văn bản trong bộ đệm để tạo lớp phủ, mặc dù đó là một yêu cầu cho thuộc tính văn bản. Đây là một lớp phủ có chiều rộng bằng không dẫn đến văn bản bổ sung sẽ được hiển thị:

(let ((ov (make-overlay 1 1)))
  (overlay-put ov 'before-string "this text is not part of the buffer"))

Lưu ý rằng lớp phủ này sẽ đẩy văn bản đệm; nó sẽ không bao gồm các văn bản tại vị trí nhất định.

Dường như không thể đặt lớp phủ tại bất kỳ vị trí nào trong bộ đệm lớn hơn point-max/ buffer-size, nghĩa là bạn có thể sẽ không thể đặt văn bản ở một vị trí cụ thể bên dưới văn bản bộ đệm trừ khi bạn hack xung quanh hạn chế này. Tất nhiên, bạn có thể đặt văn bản ngay sau văn bản đệm với thuộc after-stringtính trên lớp phủ được ghim vào point-maxvị trí.

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.