自动检测我何时键入“ vi”但意为“ cd”?


21

每天大约5次,当我指的是“ cd”时,我键入“ vi”,最后在vi中打开目录。这让我很疯狂。似乎应该有一种方法可以检测到何时键入“ vi +目录”,然后自动将其更改为“ cd +目录”。有什么想法吗?


1
我提供了一种替代方法,您可能也会发现令人困扰的^^(一种方法,它可以使您纠正问题的根源,同时避免在此之前变得烦恼^^)
Olivier Dulac 2014年


1
这也让我很沮丧,直到我发现您可以使用Enter和箭头导航到文件夹中的文件。当您在其上单击Enter时,它将打开。
nuoritoveri 2014年

1
仅需少量修改即可:更改为zsh。进行设置,以便在键入目录名称时将其更改为该目录。使用后缀别名,以便在键入* .sh,*。c,*。config时可以在vi中打开相关文件。当然,这里的警告是,您可能会发现自己在陌生的外壳中省略了“ vi”或“ cd”。
mkingston 2014年

3
这是怎么发生的?
JFA 2014年

Answers:


38

假设您vi以目录作为最后一个参数进行调用:

vi() {
    if [[ -d ${!#} ]]; then
        cd "$@"
    else 
        command vi "$@"
    fi
}

2
@Alex我猜这对于在您错误地键入“ vi”而不是“ cd”的罕见情况下都是完美的,同时又教您现在总是键入“ vi”;)[即,我希望您不要经常必须使用不具备该功能的另一台服务器/机器来减轻您的压力...] [+1,但我也想回答这个问题,只是我只测试了“ $ { 1}“ [然后是CD” $ {1}“]而不是” $ {!#}“ ...]
Olivier Dulac 2014年

5
@OlivierDulac协议-同样危险的是别名rmrm -i,这是许多发行版默认。我通常认为解决问题的最佳方法是解决用户而不是解决问题。
克里斯·

3
@OlivierDulac混叠rmrm -i也许已经保存了你过去,但可能会有些麻烦(可能会),让你在多,在未来更多的麻烦...
jlliagre

1
@Alex Well,您确实在说vi这个问题……
Chris Down

2
@crisron:${!#}间接引用最终参数,command仅在这种情况下才需要避免函数递归。
克里斯·

4

除了@ChrisDown答案,这是另一种方法:绕过目录

使用这种方法,您可以:

vi ./*

即使它包含子目录,它也会在当前目录中的所有文件上启动vi,绕过这些子目录

vi() {
  for arg do
    [ -d "$arg" ] || set -- "$@" "$arg"
    shift
  done
  [ "$#" -gt 0 ] && command vi "$@"
}

这只是对不属于目录的任何参数执行vi ...因此,它不会教您将“ vi”用于“ cd”;)

如果您刚刚这样做,它也不会调用vi:vi somedirectory(即,输错了vi而不是cd)。但是它不会自动在此处cd,因此您仍然记得必须输入cd ^^

我使用“兼容”的方式来更改参数列表,以便它可移植到许多平台。


1
注意::command something启动“ something”命令(即使用$ PATH找到的“ something”的第一次出现),而不是任何名为“ something”的别名或函数。 \something只会绕过别名,但仍会存在该函数(如果存在的话)(在这里,这意味着函数“ vi”将自行调用并循环)。
Olivier Dulac 2014年

@ChrisDown:我们正在向用户提供帮助,我希望不会尝试对自己进行攻击^^。而且评估是要设置一组新的参数(set-...),因此它本身的危险性较小
Olivier Dulac 2014年

@StephaneChazelas:感谢您的编辑!我试图用这种方式编写它,但是我担心无限循环[我相信你不会循环!'for arg'在内部处理开始之前正在评估,因此,即使内部处理更改为“ $ @”,它的“ $ @”列表也已“保存”并重复进行,并且没有更改。]
Olivier Dulac

1

一种解决方案是cd完全停止使用。把shopt -s autocd你的.bashrc还是setopt autocd你的.zshrc。然后,要更改为其他目录,请键入目录名称,而无需任何命令。

vi如果要编辑文件,请不要忘记键入。

如果您确实希望单个命令更改目录或编辑文件,则可以使其功能:

vi () {
  if [ $# -eq 1 ] && [ -d "$1" ]; then
    cd -- "$1"
  else
    command vi "$@"
  fi
}

-6

在Unix中使用别名功能。将cd别名为vi后,问题将得到解决。


5
...这意味着如果vi不手动覆盖别名就无法使用,这似乎是非常不可取的。
克里斯·

3
这个答案有点古怪。它确实回答了原始问题,因为OP没有指定他们在文件上需要vi。答案虽然有些有趣,但肯定没有用。
格里特2014年

1
@ChrisDown否则这将教会您使用适当的名称vim
凯文2014年

@Kevin vim并不比vi更“合适”,在许多系统上,vi都是可用的。
克里斯·

1
@ChrisDown我想最好知道会发生什么。如果您希望使用vim功能,请使用vim。如果不可用,请使用vi并期望使用更多受限制的功能集。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.