我找到了以下方法:
wcd() { cd `wslpath "$1"`; }
cdw() { cd "$(wslpath "$1")"; }
他们需要在路径周围添加双引号:
wcd "F:\folder_xxx"
这对我来说不舒服。
我想要
wcd F:\folder_xxx
我如何实现我的目标?
答案1
用一个魔法别名。
定义一个辅助函数,从 shell 历史记录中提取最后一行:
_thiscommand() { history 1 | sed "s/^\s*[0-9]\+\s\+([^)]\+)\s\+$1\s\+//"; }
为执行该操作的函数指定一个不同的名称:
_real_wcd() { cd "`wslpath "$1"`"; }
定义一个以 结尾的别名
#
,使整个文本在技术上成为评论不受反斜杠扩展的影响:alias wcd='_real_wcd "$(_thiscommand wcd)" #'
请注意,这将抑制全部特殊的 shell 语法处理,包括 $ 变量、链式 && 命令、“引号”等。单词后面的所有内容wcd
都将成为参数。
替代方案:重新定义readline Enter 键处理程序自动添加引号。
定义一个对 $READLINE_LINE 进行编辑的函数:
_fix_wcd_quotes() { if [[ $READLINE_LINE == wcd* ]]; then local before=${#READLINE_LINE} READLINE_LINE=$(echo "$READLINE_LINE" | sed 's/wcd \([^"].*\)/wcd "\1"/') local after=${#READLINE_LINE} READLINE_POINT=$[READLINE_POINT+(after-before)] fi }
绑定一个键到它(例如Alt+1):
bind -m emacs -x '"\e1": _fix_wcd_quotes'
绑定“RETURN”事件以在发出换行符之前发出该键:
bind -m emacs 'RETURN: "\e1\n"'
我认为这在技术上比之前的建议更糟糕,因为一旦出错并引用了你不想引用的内容,它会让你思考你自己输入了额外的引号。
替代方案:定义一个 readline 宏,在当前单词周围插入引号。(未经测试;我只是从 bash(1) 手册中取出它。)
将此绑定添加到
~/.inputrc
:$if Bash # Quote the current or previous word "\C-xq": "\eb\"\ef\"" $endif
使用Ctrl+X,Q来调用它。
答案2
谢谢用户1686之后,我学会了魔法别名。
虽然它在 zsh 上不起作用。
第一个问题是如何获得正确的最后历史记录
- 历史 1 了解全部历史
- 历史 -1 在魔法别名中获取了前一行历史记录(但在终端中是相同的)
- 所以我把它改成
tail -n -1 ~/.zsh_history
第二个是正则表达式
^\s*[0-9]\+\s\+([^)]\+)\s\+$1\s\+//"
不符合情况,测试https://sed.js.org/index.html- 改成
"s/.\+$1\s\+//"
最后
添加以下内容~/.zshrc
,你可以使用echow
它来进行魔法别名测试
_thiscommand() { tail -n -1 ~/.zsh_history | sed "s/.\+$1\s\+//"; }
_real_wcd() { cd `wslpath "$1"`; }
alias wcd='_real_wcd "$(_thiscommand wcd)" #'
_echo_wcd() { echo "$1" }
alias echow='_echo_wcd "$(_thiscommand echow)" #'
然后就wcd F:\xxxx
起作用了!