Tại sao gõ '<<<' thay vì tạo ra '<< EOF \ n <' khi ở chế độ shell-script?


13

Bất cứ khi nào tôi chỉnh sửa tập lệnh shell trong emacs và nhập ba chevron để chuyển hướng một chuỗi thô sang stdin, emacs sẽ chèn các ký tự 'EOF' và một dòng mới ở giữa chúng, vì vậy

cat <<< 'some string'

trở thành

cat <<EOF
< 'some string'

Tôi có thể quay lại và xóa các ký tự phụ để lấy bộ đệm ở trạng thái tôi muốn, nhưng đây là hành vi rất đáng ghét và dường như chỉ xảy ra trong chế độ shell-script, thường là lần duy nhất tôi gõ mẫu này. Có cách nào để vô hiệu hóa hành vi này?

Câu trả lời:


13

Điều này được gây ra bởi sh-electric-here-document-mode. Khi được kích hoạt, <<sẽ chèn một bộ xương tài liệu ở đây.

Điều này được kích hoạt theo mặc định. Bạn có thể vô hiệu hóa nó bằng một cái móc, chẳng hạn như:

(add-hook 'sh-mode-hook (lambda () (sh-electric-here-document-mode -1)))

4
Một lựa chọn khác của khóa học là chèn <<<với C-3 <.
glucas

1
Cảm ơn bạn đã cho thấy làm thế nào để tắt nó. Chế độ sh-điện-ở đây-tài liệu này là một tính năng khá vô dụng, IMO.
Dan Mould

Ngoài ra: sh-mode-hookkhông làm việc cho tôi, nhưng sh-set-shell-hookđã làm.
Felipe Lema

17

glucas hoàn toàn chính xác, nhưng để bổ sung cho câu trả lời của anh ấy, tôi có đoạn mã này tôi đã sử dụng để làm cho tài liệu ở đây thông minh hơn một chút.

Lời khuyên này, cùng với sh-electric-here-document-modekích hoạt, làm cho nó để nếu bạn nhập hai chevron, tài liệu tự động ở đây sẽ được tạo, nhưng sau đó nếu ký tự tiếp theo bạn nhập là một chevron khác, nó sẽ hoàn nguyên và bạn sẽ chỉ còn lại <<<.

(defadvice sh--maybe-here-document (around be-smart-about-it activate)
  "Do normal here doc auto insert, but if you type another chevron, revert and leave just <<<."
  (if (and (= (current-column) 1)
           (looking-back "^<")
           (looking-at "\nEOF")
           (save-excursion
             (forward-line -1)
             (end-of-line 1)
             (looking-back "<<EOF")))
      (progn (delete-region (search-backward "EOF") (search-forward "EOF" nil t 2))
             (insert "<"))
    ad-do-it))

Tất nhiên, điều này có nghĩa là nếu bạn thực sự muốn bắt đầu một tài liệu ở đây với một chevron, bạn sẽ cần phải chèn nó , C-q<. Vì vậy, nó phụ thuộc vào những gì bạn làm nhiều hơn, nếu bạn làm nhiều chuỗi ở đây hơn các tài liệu ở đây, điều này có thể rất hay, ngay cả khi bạn không, thật hiếm khi bạn muốn bắt đầu một tài liệu ở đây với một chevron và bất tiện

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


À, thật tuyệt!
glucas
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.