2010-05-13 34 views
5

Tôi muốn đạt được mức tương tự như được yêu cầu tại đây Saving current directory to bash history nhưng trong vỏ zsh. Tôi đã không thực hiện bất kỳ thủ thuật zsh nào trước đây nhưng cho đến nay tôi có:Lưu thư mục hiện tại vào lịch sử zsh

function precmd { 
hpwd=$history[$((HISTCMD-1))] 
if [[ $hpwd == "cd" ]]; then 
cwd=$OLDPWD 
else 
cwd=$PWD 
fi 
hpwd="${hpwd% ### *} ### $cwd" 
echo "$hpwd" >>~/.hist_log 
} 

Ngay bây giờ tôi lưu lệnh được chú thích với tên thư mục vào tệp nhật ký. Cái này làm việc tốt cho tôi. Chỉ nghĩ rằng có thể có một cách để thay thế trong bộ đệm lịch sử.

+3

bản sao có thể có của [Làm cách nào để tôi (từ tập lệnh) thêm nội dung nào đó vào lịch sử lệnh zsh?] (Http://stackoverflow.com/questions/2816225/how-can-i-from-a-script-add -something-to-the-zsh-command-history) –

Trả lời

6
function _-accept-line() { 
    [[ -z "${BUFFER" ]] || [[ "${BUFFER}" =~ "### ${(q)PWD}\$" ]] || BUFFER="${BUFFER} ### ${PWD}" 
    zle .accept-line 
} 
zle -N accept-line _-accept-line 

Sẽ thêm ### ${PWD} vào dòng lệnh của bạn. Không phải là giải pháp tốt nhất bạn có thể sử dụng, nhưng nó hoạt động.

UPD: trả lời dựa trên nhận xét @Dennis Williamson:

function zshaddhistory() { 
    print -sr "${1%%$'\n'} ### ${PWD}" 
    fc -p 
} 
+0

Cảm ơn Dennis và Zyx. Nó hoạt động như mong đợi. Dennis, nó là một bản sao. Bằng cách nào đó câu hỏi đó không xuất hiện trong quá trình tìm kiếm của tôi. Bài viết của bạn về lịch sử bash/zsh là trợ giúp và thông tin. – Sandeep

+0

Ai đó có thể giải thích cho tôi tại sao 'fc -p' là cần thiết? Tại sao khi tôi không đặt 'fc -p' ở đây, danh sách lịch sử sẽ nhận được hai mục nhập cho mỗi lệnh (đầu tiên là mục nhập bao gồm đường dẫn và mục nhập thứ hai là đơn giản)? –

+0

Tôi đã đấu tranh với zsh cố gắng phân tích các ký tự '#', nhưng chuyển đổi trên 'tương tác setopt 'đã giải quyết và tôi hài lòng với thiết lập này ngay bây giờ. Nó bloate lịch sử lệnh một chút tốt như bạn đi qua nó mặc dù, mà làm cho tôi buồn. –

3

Thay vì lưu trữ nó trên tất cả các lệnh tôi được thêm vào sau vào beginging của precmd của tôi() chức năng để lưu trữ nó khi tôi thay đổi thư mục:

if [ "$LAST_DIR" != "$PWD" ] 
    then 
      print -s "##dir## $PWD" 
      LAST_DIR=$PWD 
    fi 

Thêm dòng '## dir ## dir name' độc lập vào lịch sử mỗi lần lệnh được chạy từ một thư mục mới.

+1

Tôi thích 'print -s" $ PWD # Path "', theo cách này tôi có thể đưa lên mục lịch sử này tất cả bình thường giống như, và nó đã sẵn sàng để tôi nhấn Enter để tự động cd vào đường dẫn đó (đây là một tính năng của 'zsh', nếu bạn chỉ cung cấp một đường dẫn nó' cd'/'pushd' cho nó). ** KHÔNG BAO GIỜ ** Tôi tin rằng cách tiếp cận này về cơ bản là thiếu sót: Nếu bạn có hai thuật ngữ mở, mỗi thuật ngữ khác nhau, sau đó giữ các thư mục tương ứng, nhưng chuyển giữa các lệnh phát hành, không thể biết được lệnh dir nào đã xảy ra trong! Điều này là không thành công :( –

Các vấn đề liên quan