Giữ lịch sử trên mỗi thư mục làm việc (xem mỗi phiên shell)


11

Có cách nào để làm cho tính năng lịch sử của vỏ hiện đại được đặt trong một đường dẫn không?

Các bối cảnh làm việc của tôi được phân chia thành các đường dẫn trên hệ thống tệp và mô hình hoạt động shell, chẳng hạn như các lệnh được phát đi lặp lại, có xu hướng khác biệt với từng 'dự án'. Sẽ thật tuyệt nếu tôi có thể phạm vi tính năng lịch sử cho các lệnh được ban hành từ đường dẫn hiện tại (hoặc đường dẫn phụ).

Câu trả lời:


5

Với zsh, bạn có thể làm:

mkdir -p ~/.zsh/dirhist

Và thêm vào ~ / .zshrc:

HISTSIZE=1000
SAVEHIST=10000
setopt HIST_SAVE_NO_DUPS INC_APPEND_HISTORY
HISTFILE=~/.zsh/dirhist/${PWD//\//@}
chpwd() {
  [[ $PWD = $OLDPWD ]] || fc -Pp ~/.zsh/dirhist/${PWD//\//@}
}

chpwd()được gọi bất cứ khi nào thư mục hiện tại thay đổi. Ở đó, chúng tôi đặt lại tệp lịch sử thành một cái gì đó giống như ~/.zsh/dirhist/@foo@barkhi bạn cdđến /foo/bar.


Tôi thích cách tiếp cận này, vì nó không yêu cầu thay đổi thói quen sử dụng vỏ của tôi và trong vài ngày thử nghiệm, nó có vẻ tốt.
sohocoke

9

Không phải là một câu trả lời gọn gàng mà là một giải pháp thay thế nếu bạn đang sử dụng bashlàm vỏ của mình: bạn có thể tạo một số bí danh trong đó .bashrc.

Ví dụ:

alias a='cd /tmp/A ; history -w ; history -c ; export HISTFILE=/home/user/.a_history ; history -r $HISTFILE'
alias b='cd /tmp/B ; history -w ; history -c ; export HISTFILE=/home/user/.b_history ; history -r $HISTFILE'

Sau đó, nếu bạn gõ a:

  1. bạn sẽ được chuyển đến trong thư mục dự án của bạn
  2. lịch sử hiện tại sẽ được lưu ( history -w)
  3. sau đó lịch sử lưu trong bộ nhớ sẽ được đặt lại ( history -c)
  4. tệp lịch sử dự án sẽ được đặt thành /home/user/.a_historyvà đọc ( history -r)

Tôi nhận ra câu hỏi của tôi đã bỏ qua một mong muốn / yêu cầu, xin lỗi vì chi tiết bị thiếu. Cụ thể: Tôi không muốn phải nhớ sử dụng bí danh / hàm; tức là phạm vi hoạt động như một phần bổ trợ cho cách tôi thường tương tác với trình bao.
sohocoke

Không xuất khẩu HISTFILE. Không có lý do để xuất nó sang các chương trình khác và ~ / .bashrc được thực thi cho mọi quy trình bash tương tác, do đó, mã của bạn để thiết lập nó sẽ được chạy trong mọi bash. Nói chung, nếu một biến được xác định bằng vỏ không được xuất theo mặc định, bạn hiếm khi nên xuất nó.
Chris Trang

1

Nếu bạn đang sử dụng ZSH, hãy xem plugin nhỏ này tôi mới viết để xử lý việc này:

https://github.com/ericfreese/zsh-cwd-history

Nó lưu trữ một thư mục riêng HISTFILEcho mỗi thư mục bạn đã thực hiện các lệnh và thêm một chpwdhook để chuyển giữa HISTFILEcác thư mục khi bạn thay đổi thư mục.

Nó cũng cung cấp một tiện ích zle mà bạn có thể liên kết với một phím bấm sẽ chuyển đổi HISTFILEgiữa "toàn cầu" ban đầu HISTFILEHISTFILEthư mục làm việc hiện tại của bạn.

Ban đầu nó được dựa trên plugin lịch sử mỗi thư mục của Jim Hester , nhưng sau đó đã được viết lại từ đầu để khắc phục nhiều vấn đề với plugin đó.


Liên kết chỉ có câu trả lời không được khuyến khích ở đây, vui lòng thêm một số giải thích về những gì nó đang hoạt động.

0

Tôi đã viết một plugin ZSH làm những gì bạn muốn: https://github.com/tymm/zsh-directory-history

Ngược lại với các giải pháp khác, plugin của tôi tự động quay lại lịch sử toàn cầu. Điều đó có nghĩa là bạn không phải chuyển đổi giữa lịch sử thư mục và lịch sử toàn cầu.

Tuy nhiên, các giải pháp khác nhẹ hơn một chút tôi đoán.

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.