Đổi tên hàm tự xác định


2

Có một premd () hoạt động khá nhiều, như kiểm tra thông tin VCS, tôi muốn tắt nó khi tôi điều hướng trên các ổ đĩa mạng được gắn chậm.

Tôi đã đưa ra những điều sau đây mà tôi có thể nói slowtrước khi đổi sang ổ chậm và fastđể đổi lại, tôi tự hỏi liệu có thứ gì dễ hơn không?

precmd_slow() {
    not_much
}
precmd_fast() {
    precmd_slow
    somemore1
    somemore2
}

precmd() {
    precmd_fast
}

slow() {
    precmd() {
        precmd_slow
    }
}

fast() {
    precmd() {
        precmd_fast
    }
}

Câu trả lời:


0

Không phải là giải pháp đẹp nhất nhưng tôi sẽ chỉ sử dụng một điều kiện đơn giản bên trong precmdchức năng kiểm tra xem thư mục hiện tại có được gắn kết hay không. Bây giờ làm điều đó phụ thuộc vào loại gắn kết. Nếu các thư mục được biết đến, một cái gì đó như thế này sẽ hoạt động.

slowdirs="/home/joe/slowdir1:/home/joe/slowdir2:/mnt/slowdir3"
precmd() {
  isslow=0
  echo $slowdirs | tr \: \\n |
    while read line; do
      if [[ $PWD == $line* ]]; then
        isslow=1
        break
      fi
    done
  if [[ $isslow == 0 ]] ; then
     # do slow stuff

  fi
  # do non slow stuff

}

Những gì nó làm là kiểm tra nếu thư mục hiện tại bắt đầu bằng (nằm bên trong), hoặc là, một trong những thư mục được liệt kê trong slowdirsbiến. Nếu nó không phải là một trong những thư mục "chậm", hãy chạy "lệnh chậm", nếu không nó sẽ bỏ qua chúng.


0

Tôi thích giải pháp này được cung cấp bởi chepner trên StackOverflow, mà tôi sẽ trích dẫn trực tiếp:

Ngoài hàm premd, còn có một mảng được gọi là premd chứa danh sách các hàm cần gọi cùng một lúc. Bạn có thể tự thao tác, nhưng zshcontrib có chức năng add-zsh-hook để đơn giản hóa các vấn đề.

Mã số:

# precmd_slow and precmd_fast defined as before

autoload add-zsh-hook
add-zsh-hook precmd precmd_fast

fast () {
    add-zsh-hook -d precmd precmd_slow
    add-zsh-hook precmd precmd_fast
}

slow () {
    add-zsh-hook -d precmd precmd_fast
    add-zsh-hook precmd precmd_slow
}

0

Bạn có thể sử dụng whence -fđể gõ một hàm, thay thế tên của nó và từ chối định nghĩa hàm kết quả:

rename_func() {
    if (( $# != 2 )); then
        echo "Usage: rename_func <oldname> <newname>" >&2
        return 1
    fi
    oldname=$1
    newname=$2
    local code=$(echo "$newname () {"; whence -f $oldname | tail -n +2)
    unset -f $oldname
    eval "$code"
}

Thay thế dòng đầu tiên sẽ hoạt động vì whenceluôn áp dụng định dạng có thể dự đoán được cho hàm:

$ test() { true }
$ whence -f test
test () {
        true
}
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.