Cách làm * sh dòng ngắn hơn


7

Gần đây tôi đã gặp một dòng zsh

ls_colors_parsed=${${(@s.:.)LS_COLORS}/(#m)\**=[0-9;]#/${${MATCH/(#m)[0-9;]##/$MATCH=$MATCH=04;$MATCH}/\*/'=(#b)($PREFIX:t)(?)*'}}

Điều này không chỉ đốt cháy bóng mắt của tôi, nó còn vượt xa giới hạn 80 char. Thật không may, tôi không thấy bất kỳ cách rõ ràng để rút ngắn nó. Tôi có nhiều dòng như thế này (được tạo thành từ những sự thay thế phức tạp đến mức không thể cắt thành từng mảnh). Cách xử lý chính tắc như thế này là gì nếu tôi muốn chúng dài <80 ký tự.


2
Bạn làm ở \\nbất cứ đâu.
mikeerv

1
Cách chính tắc là viết các dòng dài hơn 80 ký tự.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


2

Bạn có thể ngắt dòng dài bằng cách thoát dòng mới , đó là \ngay lập tức theo sau là dòng mới:

ls_colors_parsed=${${(@s.:.)LS_COLORS}/(#m)\**=[0-\
9;]#/${${MATCH/(#m)[0-9;]##/$MATCH=$MATCH=04;$MATC\
H}/\*/'=(#b)($PREFIX:t)(?)*'}}

CẢNH BÁO

Trong khi bạn có thể phá vỡ một dòng theo cách gần như ở khắp mọi nơi, có những trường hợp ngoại lệ. Nó sẽ không làm việc trong văn bản trích dẫn đơn hoặc sau \của một dãy thoát ( \n, \x40, ...). Một số cấu trúc shell khác cũng có thể bị hỏng: Nếu bạn cố gắng ngắt giữa ($PREFIX:t)trong ví dụ của mình, nó sẽ không hoạt động chính xác.


Và nếu bạn đang sử dụng thụt đầu dòng, nó có thể không hoạt động chính xác như bạn mong đợi trong một số tình huống.
một CVn

@ MichaelKjorling Đúng vậy. Các vết lõm thực chất chỉ là một loạt các không gian. Vì vậy, bạn chỉ có thể thụt lề ở những nơi bạn có thể viết cùng một khoảng trắng trong phiên bản dòng đơn của mã: giữa các từ (như được nhận ra bởi trình bao)
Adaephon

1

Bạn có thể làm một cái gì đó như:

setopt extendedglob
alias 'verbose{{=read -rd "" -u9 _code 9<<-"}}";\
  eval "${_code//[[:space:]]#$'\''\n'\''[[:space:]]#}"'

verbose{{
  ls_colors_parsed=${
    ${(@s.:.)LS_COLORS}
      /(#m)\**=[0-9;]#
      /${
          ${MATCH
            /(#m)[0-9;]##
            /$MATCH=$MATCH=04;$MATCH
          }
            /\*
            /'=(#b)($PREFIX:t)(?)*'
      }
  }
}}

Các dòng mới được bao quanh bởi các ký tự khoảng cách được loại bỏ trước khi được chuyển qua để evalgiải thích.


Cảm ơn, điều này có thể hữu ích, nhưng có hai nhược điểm: 1. Nó chậm hơn (sử dụng quy trình con) và 2. Nó phá vỡ các thay thế thực sự sử dụng khoảng trắng (như ${param/ /)
PythonNut

@PythonNut, điểm tốt. Xem chỉnh sửa cho một thay thế giải quyết những người.
Stéphane Chazelas
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.