Những tính năng zsh nào bạn sử dụng? [đóng cửa]


33

Tôi làm rất nhiều công việc trong thiết bị đầu cuối vì vậy tôi đã học được rất nhiều về vỏ lựa chọn của mình, zsh. Những tính năng nào của zsh bạn sử dụng để làm cho bản thân hiệu quả hơn trong công việc? Một trong những mục yêu thích của tôi là tự động hoàn thành nhiều dir. Vì vậy, thay vì gõ cd /fo{tab}/ba{tab}/ba{tab}tôi chỉ có thể làm cd /fo/ba/ba{tab}và lưu nhiều tổ hợp phím đó!


2
Tôi không biết về tính năng đó, tôi sẽ phải thử tính năng đó!
Roy Rico

1
Tùy chọn nào là thư mục tự động hoàn thành?
quê hương

Câu trả lời:


50

Chỉ cần tìm thấy viên ngọc nhỏ này:

cd old new

Hình thức này cdthay thế tất cả các lần xuất hiện oldtrong đường dẫn đầy đủ của thư mục hiện tại newvà cố gắng thay đổi thư mục làm việc thành đường dẫn kết quả.

Ví dụ: nếu thư mục làm việc của bạn là /home/larry/code/backrub/servervà bạn muốn chuyển sang /home/sergei/code/backrub/server, tất cả những gì bạn cần làm là:

cd larry sergei

7
Ok, quy tắc đó.
quê hương

21

Tôi sẽ giữ những điều mà theo như tôi biết, bash không thể làm được.

  • Fancy hoàn thành. Vâng, bash có một số trong đó, nhưng zsh biết nhiều lệnh hơn, thường chính xác hơn và có nhiều khả năng cấu hình hơn.

  • Toàn **cầu, ví dụ, **/footìm kiếm các tệp được gọi footrong thư mục con theo cách đệ quy. (Và ***/foocũng tuân theo các liên kết tượng trưng.) Hai ký tự thay vì một findlệnh dài (khó có thể đúng nếu một số tên tệp bao gồm các ký tự đặc biệt như dấu cách và dấu ngoặc kép).

  • Ít thường xuyên hơn, vòng loại toàn cầu như trong foo*(*)(như foo*, nhưng chỉ giữ lại các tệp thực thi), foo(.)(chỉ các tệp thông thường, không phải thư mục), foo(-@) (chỉ các liên kết tượng trưng lơ lửng), foo*(m-5)(chỉ các tệp được sửa đổi trong 5 phút foo*(om[1])gần đây ), (tệp được sửa đổi gần đây nhất) v.v.

  • autocd: Nhập tên thư mục là một lệnh thay đổi vào nó ( cdhoặc pushdtùy thuộc vào cách bạn định cấu hình nó). Các cdlệnh là ba nhân vật quá dài! Tôi không thể sử dụng bash trong hơn ba mươi giây mà không cảm thấy đau. Tôi cũng có một vài chức năng một ký tự, chẳng hạn như

chức năng - {
  nếu [[$ # -eq 0]]; sau đó
    cd "$ OLDPWD"
  khác
    dựng sẵn - "$ @"
  fi
}
  • Nội dung zmv, và
bí danh zcp = 'noglob zmv -C'
bí danh zln = 'noglob zmv -L'
bí danh zmv = 'noglob zmv'
  • Trong khi tôi đang ở đó, noglobnội dung.

  • Các hàm precmdpreexechook: Tôi sử dụng preexecđể đặt tiêu đề của thiết bị đầu cuối của mình để bao gồm lệnh đang chạy và precmdđể thay thế lệnh bằng mã thoát của nó. Cái gì đó như

term_title_base = '@% l:% 1 ~'
preexec () {
  in -nr $ '\ e] 2;' "$ {(%) term_title_base} $ *" '$ \ a'
}
tiền tố () {
  in -nr $ '\ e] 2;' "$ {(%) term_title_base} ($?)" '$ \ a'  
}
  • Ctrl + Z:
    • Trên một dòng lệnh trống chạy bg(để Ctrl + Z Ctrl + Z tạm dừng một chương trình và ngay lập tức tiếp tục nó trong nền).
    • Trên một dòng lệnh không trống, tạm dừng phiên bản lệnh hiện tại: hãy để tôi gõ một lệnh khác và khi dòng lệnh thứ hai kết thúc, tôi lấy lại lệnh đầu tiên để chỉnh sửa.
    • Điều này sử dụng chức năng sau đây:
Fancy-ctrl-z () {
  if [[$ # BUFFER -eq 0]]; sau đó
    bg
    zle chơi lại
  khác
    đầu vào đẩy zle
  fi
}
zle -N ưa thích-ctrl-z
bindkey '^ Z' Fancy-ctrl-z
  • Các tùy chọn không liên quan đến hoàn thành quan trọng nhất: setopt append_history autocd extended_glob no_match

3
Yêu lừa ^ Z ^ Z, cảm ơn! Ban đầu, họ đang tìm superuser.com/questions/378018 để tìm giải pháp liên kết nó với một khóa duy nhất nhưng ^ Z ^ Z có ý nghĩa hơn rất nhiều
Evgeniy Dolzhenko

13

Khả năng tự động hoàn tất mọi thứ của zsh bên cạnh các tệp và thư mục.

Ví dụ: với gói git được cài đặt, git-sh {tab} sẽ hiển thị:

- lệnh git -
shortlog - tóm tắt đầu ra nhật ký git
hiển thị chi nhánh - hiển thị các chi nhánh và cam kết của họ
show-index - hiển thị nội dung của tệp idx gói

1
Vâng, điều này là tuyệt vời! Tôi cũng sử dụng điều này khi tôi không chắc chắn chuyển đổi dòng lệnh là gì nhưng tôi không cần phải đi sâu vào tệp người đàn ông.
Frew Schmidt

Tôi tin rằng bash cũng có khả năng này.
Keith Thompson

10

Tôi thực sự thích các bí danh toàn cầu

alias -g L='|less
alias -g DN='>/dev/null'

hãy để tôi làm những việc như

somecommand file arg L

và được phân trang.


Tôi cũng thích G cho grep.
Frew Schmidt

7

Như đã đề cập bởi những người khác, tự động hoàn thành của zsh là tuyệt vời.

Bạn có thể thiết lập tự động hoàn thành cho các lệnh tùy chỉnh mà không gặp quá nhiều rắc rối. Để tab hoàn thành tên người dùng làm đối số cho ngón tay:

# ~/.zshrc
function userlist {
        reply=(`users | tr ' ' '\n' |sort -u `);}
compctl -K userlist finger
set COMPLETE_ALIASES

Các tùy chọn khác tôi muốn đặt:

# turn on spelling correction
setopt correct
# don't save duplicates in command history
setopt histignoredups
# don't allow accidental file over-writes
setopt noclobber

Pushd và popd cũng khá tiện dụng.

# Always pushd when changing directory
setopt auto_pushd
# Have pushd with no arguments act like `pushd $HOME'.
setopt PUSHD_TO_HOME

Mặc định, các phím home và end không mặc định hoạt động trên zsh giống như các phím khác, nhưng bạn có thể sửa lỗi này.

# Make home and end keys work.
[[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line

2
Tôi có xu hướng tìm cách sửa lỗi chính tả khó chịu hơn là thực sự hữu ích.
Frew Schmidt

@Frew heh, bạn không phải là người đầu tiên nói điều đó với tôi. Một trong những tính năng chỉnh sửa đẹp hơn là nó sẽ đưa phiên bản đã sửa vào lịch sử, do đó bạn sẽ không vô tình chạy lại điều tương tự.
theotherreceive

5

Cho phép tự động hoàn thành khi sử dụng scptrên một máy chủ từ xa.

Dấu nhắc bên phải để hiển thị thông tin bổ sung.


Thật! Tôi có một dấu nhắc rất phức tạp nhưng ngắn. Tên máy chủ [dòng hiện tại] <lỗi không>%
Frew Schmidt
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.