Tiếp tục Zsh-Terminal (OS X Lion)


17

OS X Lion có tính năng "Tiếp tục lại", tức là khi bạn mở lại một ứng dụng, nó sẽ khôi phục tất cả các cửa sổ và nội dung của chúng. Điều đó cũng làm việc cho Terminal. Nhưng nếu bạn sử dụng Zsh thay vì Bash thì nó không khôi phục thư mục đã mở. Làm thế nào tôi có thể sửa lỗi này?


Liên quan đến các câu trả lời dưới đây: làm cho terminal.app nhận biết thư mục cũng hữu ích để mở các thiết bị đầu cuối mới trong cùng thư mục với thư mục hiện tại
nhooyr

Câu trả lời:


18

CẬP NHẬT : Điều này không hoàn toàn chính xác, vì lý do được đề cập trong các ý kiến. Sử dụng câu trả lời dưới đây . Cảm ơn @ChrisPage đã đi thêm một dặm :)

Câu trả lời có thể được tìm thấy bằng kỹ thuật đảo ngược cách bash thực hiện /etc/bashrc. Tôi đã thử nhiều cách tiếp cận từ khắp nơi trên mạng nhưng cách của Apple dường như hoạt động tốt nhất (hình minh họa).

Trong của bạn .zshrcthêm như sau

# Set Apple Terminal.app resume directory
if [[ $TERM_PROGRAM == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]] {
  function chpwd {
    local SEARCH=' '
    local REPLACE='%20'
    local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"
    printf '\e]7;%s\a' "$PWD_URL"
  }

  chpwd
}

Hạnh phúc nối lại.

Để làm rõ, câu trả lời này liên quan đến thông điệp bí ẩn trong tùy chọn Terminal.app của OS X Lion:

** Các chương trình thông báo cho Terminal của thư mục làm việc hiện tại bằng các chuỗi thoát. Bạn có thể cần định cấu hình trình bao của mình hoặc các chương trình khác để kích hoạt hành vi này. *

Câu trả lời này hoạt động khi bạn sử dụng zsh làm vỏ của bạn. Terminal Resume cho bash đã được Apple triển khai.


1
Có lẽ không phải là một điều lớn trong thực tế, nhưng tôi thấy stock / etc / bashrc có dòng cuối cùng chpwdnhư printf '\e]7;%s\a' "$PWD_URL"với dấu ngoặc kép. Cảm ơn vì tiền hỗ trợ.
Ryan McCuaig

Điều này hiện đang đi vào oh-my-zsh (xem github.com/robbyrussell/oh-my-zsh/pull/522 ). Bạn sẽ cần đảm bảo rằng bạn đã bật plugin osx trong zshrc của mình.
Ryan McCuaig

2
Cũng lưu ý rằng mã này chỉ mã hóa phần trăm không gian. Đối với điểm thưởng, hãy mã hóa phần trăm tất cả các ký tự URL bất hợp pháp (và xem liệu bạn có thể làm điều đó mà không cần gọi bất kỳ chương trình nào không). Điều này rất quan trọng nếu bạn muốn nó hoạt động với tất cả các tên đường dẫn hợp lệ. Ngoài ra, một số ký tự thậm chí không được coi là một phần của chuỗi thoát, do đó, mã hóa phần trăm là bắt buộc để đưa chúng đến thiết bị đầu cuối. Tôi đã có thể làm điều này cho bash, nhưng tôi đã không thử kiểm tra nó với zsh.
Chris Trang

1
Các trích dẫn xung quanh "$ PWD_URL" là bắt buộc để ngăn tên đường dẫn bị xóa. EDIT: Điều này là bắt buộc trong bash, nhưng tùy chọn trong zsh. Tôi thích sử dụng các trích dẫn một cách nhất quán để nó di động.
Chris Trang

Cảm ơn Ryan, Chris. Tôi đã cập nhật tập lệnh để sử dụng dấu ngoặc kép cho thống nhất.
captainpete

27

Đây là bản chuyển thể của tôi về / etc / bashrc cho zsh. Tôi đã bao gồm mã hóa phần trăm cho tất cả các ký tự URL yêu cầu nó, điều này rất quan trọng nếu bạn muốn nó hoạt động với tất cả các tên tệp và thư mục hợp lệ.

Điều này đăng ký một precmdhook, cho phép nhiều hơn một chức năng được đăng ký trong các tập lệnh và tập tin cấu hình khác.

CẬP NHẬT Tháng 3 năm 2019: Đặt LC_ALLthành trống để nó không ghi đè LC_CTYPE. Sử dụng precmdđể cập nhật thư mục làm việc tại mỗi dấu nhắc thay vì sử dụng chpwdđể cập nhật thư mục mỗi khi nó bị thay đổi, các đường ống lệnh của lệnh có thể thay đổi tạm thời và thiết bị đầu cuối không nên hiển thị các lệnh đó. Ngoài ra, có thể hữu ích khi mỗi lần cập nhật trạng thái thiết bị đầu cuối trong trường hợp nó bị thay đổi trong lệnh trước đó. Sử dụng printf -vđể ghi rõ ràng vào biến thay vì sử dụng cú pháp subshell.

# Tell the terminal about the working directory whenever it changes.

if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then

    update_terminal_cwd() {
        # Identify the directory using a "file:" scheme URL, including
        # the host name to disambiguate local vs. remote paths.

        # Percent-encode the pathname.
        local url_path=''
        {
            # Use LC_CTYPE=C to process text byte-by-byte. Ensure that
            # LC_ALL isn't set, so it doesn't interfere.
            local i ch hexch LC_CTYPE=C LC_ALL=
            for ((i = 1; i <= ${#PWD}; ++i)); do
                ch="$PWD[i]"
                if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
                    url_path+="$ch"
                else
                    printf -v hexch "%02X" "'$ch"
                    url_path+="%$hexch"
                fi
            done
        }

        printf '\e]7;%s\a' "file://$HOST$url_path"
    }

    # Register the function so it is called at each prompt.
    autoload add-zsh-hook
    add-zsh-hook precmd update_terminal_cwd
fi

Cảm ơn, giải pháp được chấp nhận đã không làm việc cho tôi, nhưng giải pháp này thì có.
eelco

Điều này là làm việc cho tôi là tốt.
sikachu

4
Cũng cần lưu ý rằng giải pháp này đã có trong oh-my-zsh , chỉ cần kích hoạt terminalappplugin.
Simon

1
Chỉ cần được rõ ràng, @Simon nghĩa này là hiện nay trong oh-my-zsh, bổ sung kể từ khi câu trả lời này đã được viết.
Chris Trang

Đó là chính xác @ChrisPage, tôi xin lỗi vì cụm từ mơ hồ (tiếng Anh không phải là tiếng mẹ đẻ của tôi). Điều tôi muốn nói chỉ là, bạn không cần phải dán cái này vào trong .zprofilehoặc bất cứ thứ gì, giống như tôi đã làm trước khi nhận ra nó thực tế có sẵn trong oh-my-zsh. Đó là trong giải pháp chính xác và bạn xứng đáng với tất cả các khoản tín dụng.
Simon
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.