在 wsl2 中执行“cd F:\folder_xxx”时如何省略双引号?

在 wsl2 中执行“cd F:\folder_xxx”时如何省略双引号?

我找到了以下方法:

wcd() { cd `wslpath "$1"`; }
cdw() { cd "$(wslpath "$1")"; }

他们需要在路径周围添加双引号:

wcd "F:\folder_xxx"

这对我来说不舒服。

我想要

wcd F:\folder_xxx

我如何实现我的目标?

答案1

用一个魔法别名

  1. 定义一个辅助函数,从 shell 历史记录中提取最后一行:

    _thiscommand() { history 1 | sed "s/^\s*[0-9]\+\s\+([^)]\+)\s\+$1\s\+//"; }
    
  2. 为执行该操作的函数指定一个不同的名称:

    _real_wcd() { cd "`wslpath "$1"`"; }
    
  3. 定义一个以 结尾的别名#,使整个文本在技术上成为评论不受反斜杠扩展的影响:

    alias wcd='_real_wcd "$(_thiscommand wcd)" #'
    

请注意,这将抑制全部特殊的 shell 语法处理,包括 $ 变量、链式 && 命令、“引号”等。单词后面的所有内容wcd都将成为参数。


替代方案:重新定义readline Enter 键处理程序自动添加引号。

  1. 定义一个对 $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
    }
    
  2. 绑定一个键到它(例如Alt+1):

    bind -m emacs -x '"\e1": _fix_wcd_quotes'
    
  3. 绑定“RETURN”事件以在发出换行符之前发出该键:

    bind -m emacs 'RETURN: "\e1\n"'
    

我认为这在技术上比之前的建议更糟糕,因为一旦出错并引用了你不想引用的内容,它会让你思考自己输入了额外的引号。


替代方案:定义一个 readline 宏,在当前单词周围插入引号。(未经测试;我只是从 bash(1) 手册中取出它。)

  1. 将此绑定添加到~/.inputrc

    $if Bash
    # Quote the current or previous word
    "\C-xq": "\eb\"\ef\""
    $endif
    
  2. 使用Ctrl+X,Q来调用它。

答案2

谢谢用户1686之后,我学会了魔法别名。

虽然它在 zsh 上不起作用。

第一个问题是如何获得正确的最后历史记录

  1. 历史 1 了解全部历史
  2. 历史 -1 在魔法别名中获取了前一行历史记录(但在终端中是相同的)
  3. 所以我把它改成tail -n -1 ~/.zsh_history

第二个是正则表达式

  1. ^\s*[0-9]\+\s\+([^)]\+)\s\+$1\s\+//"不符合情况,测试https://sed.js.org/index.html
  2. 改成"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起作用了!

相关内容