跳回)
oh-my-zsh last-working-dir 插件記住上次工作目錄并自動(dòng)跳回【免費(fèi)下載鏈接】ohmyzsh A delightful community-driven (with 2,500 contributors) framework for managing your zsh configuration. Includes 300 optional plugins (rails, git, macOS, hub, docker, homebrew, node, php, python, etc), 140 themes to spice up your morning, and an auto-update tool that makes it easy to keep up with the latest updates from the community.項(xiàng)目地址: https://gitcode.com/gh_mirrors/oh/ohmyzsh導(dǎo)讀last-working-dir是 Oh My Zsh 內(nèi)置的一個(gè)輕量級(jí)目錄記憶插件它會(huì)在你每次切換目錄時(shí)把當(dāng)前路徑寫入緩存文件并在新開啟的 shell 中前提是啟動(dòng)目錄為$HOME自動(dòng)跳回上次離開的目錄同時(shí)提供一個(gè)lwd命令讓你隨時(shí)手動(dòng)返回。本文以插件官方文檔為主體結(jié)合 last-working-dir.plugin.zsh 源碼講清它的安裝方式、工作原理、lwd用法以及如何借助SSH_USER環(huán)境變量為不同 SSH 密鑰使用者維護(hù)相互隔離的目錄記憶文件。插件功能一覽根據(jù) README.md該插件提供兩項(xiàng)核心能力自動(dòng)追蹤并跳轉(zhuǎn)持續(xù)記錄最近一次使用的工作目錄新建 shell 時(shí)若啟動(dòng)目錄恰好是$HOME會(huì)自動(dòng)cd回上次記錄的位置。lwd手動(dòng)跳轉(zhuǎn)命令在任何時(shí)刻執(zhí)行l(wèi)wd即可直接跳回緩存中記錄的最后工作目錄。這套行為與打開終端就回到上次工作現(xiàn)場的開發(fā)習(xí)慣高度契合適合作為常用終端的默認(rèn)插件之一。安裝與啟用在.zshrc的plugins數(shù)組中追加插件名plugins(... last-working-dir)修改完成后重新加載配置source ~/.zshrc或新開終端即可生效。標(biāo)準(zhǔn)插件目錄位于倉庫 plugins/last-working-dirOh My Zsh 啟動(dòng)時(shí)會(huì)通過 oh-my-zsh.sh 中的插件加載邏輯自動(dòng) source 對(duì)應(yīng)的.plugin.zsh文件如果你在$ZSH_CUSTOM/plugins/下放置同名插件則會(huì)優(yōu)先加載自定義版本。源碼級(jí)原理緩存文件與 chpwd 鉤子插件全部邏輯集中在 last-working-dir.plugin.zsh總共 30 行核心由一個(gè)全局標(biāo)記、一個(gè) chpwd 鉤子、一個(gè)跳轉(zhuǎn)函數(shù)構(gòu)成。目錄變化的記錄chpwd 鉤子插件利用 zsh 的chpwd鉤子機(jī)制感知目錄切換autoload -U add-zsh-hook add-zsh-hook chpwd chpwd_last_working_dir chpwd_last_working_dir() { # Dont run in subshells [[ $ZSH_SUBSHELL -eq 0 ]] || return 0 # Add .$SSH_USER suffix to cache file if $SSH_USER is set and non-empty local cache_file$ZSH_CACHE_DIR/last-working-dir${SSH_USER:.$SSH_USER} builtin echo -E $PWD | $cache_file }實(shí)現(xiàn)要點(diǎn)鉤子注冊(cè)add-zsh-hook chpwd chpwd_last_working_dir把記錄函數(shù)掛到chpwd事件上此后每次cd成功都會(huì)觸發(fā)寫入。子 shell 過濾[[ $ZSH_SUBSHELL -eq 0 ]] || return 0保證在子 shell如命令替換、管道內(nèi)里切換目錄時(shí)不會(huì)污染記憶文件只有主 shell 的目錄變化才會(huì)被記錄。緩存文件位置默認(rèn)寫入$ZSH_CACHE_DIR/last-working-dir。$ZSH_CACHE_DIR由 oh-my-zsh.sh 初始化默認(rèn)取$ZSH/cache若該目錄不可寫則回退到${XDG_CACHE_HOME:-$HOME/.cache}/oh-my-zsh。安全覆寫|是 zsh 中繞過noclobber選項(xiàng)的強(qiáng)制覆寫語法builtin echo -E用-E避免把路徑中的反斜杠序列當(dāng)轉(zhuǎn)義符解析保證路徑原樣落盤。手動(dòng)跳轉(zhuǎn)lwd 函數(shù)lwd() { local cache_file$ZSH_CACHE_DIR/last-working-dir${SSH_USER:.$SSH_USER} [[ -r $cache_file ]] cd $($cache_file) }lwd先確認(rèn)緩存文件可讀再用命令替換讀取其中保存的路徑并執(zhí)行cd。文件內(nèi)容即上一次記錄的$PWD因此可以放心手動(dòng)調(diào)用。自動(dòng)跳轉(zhuǎn)僅限新 shell 起始目錄為 $HOME插件在加載時(shí)并不盲目跳轉(zhuǎn)而是通過一個(gè)全局標(biāo)記加上兩個(gè)前置條件來控制typeset -g ZSH_LAST_WORKING_DIRECTORY [[ -z $ZSH_LAST_WORKING_DIRECTORY ]] || return 0 [[ $PWD $HOME ]] || return 0 if lwd 2/dev/null; then ZSH_LAST_WORKING_DIRECTORY1 fiZSH_LAST_WORKING_DIRECTORY用typeset -g聲明為全局變量記錄是否已執(zhí)行過自動(dòng)跳轉(zhuǎn)。若該變量已非空說明當(dāng)前會(huì)話已跳轉(zhuǎn)過直接跳過若啟動(dòng)目錄不是$HOME例如在文件管理器里指定目錄打開終端、或通過zsh -c執(zhí)行腳本則不打擾用戶保留當(dāng)前目錄。只有首次加載且位于$HOME時(shí)才嘗試lwd成功則置位標(biāo)記2/dev/null吞掉跳轉(zhuǎn)失敗時(shí)的報(bào)錯(cuò)。進(jìn)階特性為不同 SSH 密鑰隔離目錄記憶官方文檔專門介紹了一個(gè)多用戶場景同一系統(tǒng)賬號(hào)被多個(gè) SSH 用戶通過不同密鑰登錄時(shí)可通過SSH_USER環(huán)境變量讓插件為每個(gè)登錄者維護(hù)獨(dú)立的 lwd 緩存文件。其原理對(duì)應(yīng)源碼中的這一行l(wèi)ocal cache_file$ZSH_CACHE_DIR/last-working-dir${SSH_USER:.$SSH_USER}。zsh 的${SSH_USER:.$SSH_USER}語法表示當(dāng)SSH_USER已設(shè)置且非空時(shí)在文件名后追加.SSH_USER后綴例如last-working-dir.a.testexample.com未設(shè)置時(shí)則退化為默認(rèn)的last-working-dir。這樣不同登錄者之間互不干擾各自記住各自的最后目錄。配置步驟如下來源README.md讓 SSH 服務(wù)端允許傳遞環(huán)境變量。編輯/etc/sshd/sshd_configPermitUserEnvironment yes在authorized_keys中為不同公鑰附加環(huán)境變量聲明把SSH_USER指向?qū)?yīng)的登錄者標(biāo)識(shí)environmentSSH_USERa.testexample.com ssh-ed25519 AAAAC3Nz...之后該密鑰登錄產(chǎn)生的會(huì)話會(huì)攜帶SSH_USERa.testexample.comlwd的讀寫都會(huì)落到帶該后綴的緩存文件上。需要說明的是PermitUserEnvironment yes同時(shí)會(huì)允許authorized_keys里的environment指令生效修改 sshd 配置后通常需要重啟 sshd 服務(wù)且該特性是 SSH 服務(wù)端層面的能力受具體發(fā)行版與 SSH 版本影響。使用注意事項(xiàng)與排障緩存文件非預(yù)期位置若$ZSH_CACHE_DIR不可寫Oh My Zsh 會(huì)自動(dòng)回退到$HOME/.cache/oh-my-zsh此時(shí) lwd 緩存文件也會(huì)出現(xiàn)在那里屬正常行為。lwd無效檢查$ZSH_CACHE_DIR/last-working-dir是否存在且可讀若文件不存在從未在某個(gè)目錄停留過lwd會(huì)靜默不動(dòng)作。自動(dòng)跳轉(zhuǎn)未觸發(fā)確認(rèn)新終端起始目錄確實(shí)是$HOME且該會(huì)話是首次加載插件ZSH_LAST_WORKING_DIRECTORY未置位。與dirpersist、dirhistory等目錄類插件的關(guān)系它們關(guān)注點(diǎn)不同——dirhistory是方向鍵瀏覽歷史dirpersist是持久化dirstack而本插件只負(fù)責(zé)記住并回到最后一個(gè)目錄可獨(dú)立使用也可按需組合。相關(guān)文件速查插件文檔plugins/last-working-dir/README.md插件實(shí)現(xiàn)plugins/last-working-dir/last-working-dir.plugin.zsh緩存目錄初始化與插件加載入口oh-my-zsh.sh.zshrc參考模板plugins(...)配置處templates/zshrc.zsh-template小結(jié)last-working-dir以極簡實(shí)現(xiàn)完成了記住上次目錄 新 shell 自動(dòng)跳回 手動(dòng)lwd跳轉(zhuǎn)的完整閉環(huán)chpwd鉤子負(fù)責(zé)記錄lwd負(fù)責(zé)回跳ZSH_LAST_WORKING_DIRECTORY與$PWD $HOME兩個(gè)條件保證只在合適時(shí)機(jī)自動(dòng)介入SSH_USER后綴機(jī)制則讓多密鑰共用賬號(hào)的場景也能各記各的目錄。將其加入plugins數(shù)組即可在每次打開終端時(shí)無縫續(xù)接上一次的工作現(xiàn)場?!久赓M(fèi)下載鏈接】ohmyzsh A delightful community-driven (with 2,500 contributors) framework for managing your zsh configuration. Includes 300 optional plugins (rails, git, macOS, hub, docker, homebrew, node, php, python, etc), 140 themes to spice up your morning, and an auto-update tool that makes it easy to keep up with the latest updates from the community.項(xiàng)目地址: https://gitcode.com/gh_mirrors/oh/ohmyzsh創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考