用命令行快速切换目录

【感谢@CuGBabyBeaR 的热心翻译。如果其他朋友也有不错的原创或译文,可以尝试提交到伯乐在线。】

和很多人一样,我也是在电脑前度过一天的大部分时间。为了提高效率(并且不让我的身体有太多的抱怨),我试着建立一个优化的环境。例如,我使用Vim写代码,使用Vimperator浏览网页,使用 i3 窗口管理器。其他日常事情就是文件系统导航(从一个目录切换到另一个目录——译者注)。我更喜欢使用命令行来,但是一遍又一遍的输入 cd ~/some/very/deep/often-used/directory 变得很麻烦。

autojumpz 和 fasd 这样的自动工具,通过提供一个指向你常用文件夹的快捷方式来处理这个问题。就我个人来说,我希望有一个更加手动的方法,我将这个方法向大家分享。我发现用这个方法后,效率有很大的提高,并且希望你们也能提高效率。

 

使用符号链接跳转

实际上这个手工解决方案总结起来是在一个隐藏文件夹下(例如 ~/.marks)储存符号链接.这里有4个shell函数:jump, mark, unmark, 和marks:

将它们放在你的.zshrc或.bashrc 文件,你就可以开始跳转了(Mac OS X用户需要一个稍微有些不同的makes函数版本,请见下方)。我也把这转换成了一个叫做jump的oh-my-zsh插件,但是这玩意目前还在pull-request。为了添加一个新书签,cd到目录然后使用一个你喜欢的名字标记上它。

这段文字将在目录~/.marks中添加一个叫做deep的符号链接。跳转到这个目录,在文件系统中的任何地方输入以下命令。

移除标签(即符号链接),输入:

你可以通过输入如下指令来浏览所有的标签

没了

 

添加tab补齐

为了给jump和unmark函数添加Tab补齐,添加如下代码到.zshrc中(感谢tiziano88):

或者添加如下代码到.bashrc中(感谢microcolonel)

现在如果你输入jump或者unmark 然后回车,你会看见一个所有可用的标签.碉堡了!

 

给Mac OS X>用户:

如guygurari指出的,Mac OS X用户需要一个稍微有些不同的makes函数版本:

如果你喜欢我所讲的东西,你可能想在Twitter上follow我

 

译者注:

此功能Windows下也可以实现。做4个批处理 :jump.bat、mark.bat、unmark.bat、marks.bat。每个BAT的内容如下:

jump.bat:

 

mark.bat

 

unmark.bat

 

marks.bat

将4个BAT都放在系统环境变量%PATH%中任意一个目录下,或者将bat文件所在目录添加进%PATH%中就行了。因为Window在vista/win7在引入这个功能,因此只能在vista/win7以上的系统中使用。还有一点不一样的是,链接文件保存在bat文件所在目录下的.marks隐藏文件夹下,而不是某个系统文件夹,这样在删除的时候也不用乱找了。

使用的时候和上述描述一样,使用如下命令:

跳转:

就是marks的功能就没有那么强了…

1 收藏 5 评论

关于作者:熊铎

野生业余程序员搞搞Android 玩玩前端 仅此而已 个人主页 · 我的文章 · 19 ·     

相关文章

可能感兴趣的话题



直接登录
最新评论
  • sean   2013/08/23

    试试https://github.com/rupa/z,功能更加强劲

  • g936140   2013/08/23

    Fix jump.bat to allow jump to different drive:
    if not exist "%MARKPATH%/%1" (echo "No such mark: %1") else cd/d "%MARKPATH%/%1"

  • 这个思路很不错,赞一个,我使用了一下,发现一些bug,完善了一下,这个是OS X版本,供大家直接使用
    修复如下:
    1. jump、mark 没传东西时会出现一些神奇的符号链接(改成可以设置一个默认mark名)
    2. 同一个名字多次mark时会在被mark的目录里创建一个符号链接而不是 ~/.marks 中
    3. tab 补全在 OS X 的 bash 下不是很好使,改了一个

    • jim   2013/08/26

      #借用楼主思路 我也实现了个简单的
      #m 标记
      #m 1 删除
      #j 查看所有
      #j 数字跳转
      export markfile=$HOME/.marks

      m()
      {
      grep -w "$(pwd)$" $markfile 1>/dev/null 2>&1
      if [ $? -ne 0 ]; then
      echo $(pwd) >> ${markfile}
      else
      if [ ! -z "$1" ];then
      grep -v "$(pwd)" $markfile > $markfile.tmp ; mv $markfile.tmp $markfile
      else
      echo "mark exists!"
      fi
      fi
      }

      j()
      {
      if [ ! -z "$1" ] && [ $1 -le $(wc -l ${markfile}|awk '{print $1}') ] ; then
      cd $(sed -n "$1p" ${markfile})
      elif [ -z "$1" ]; then
      nl ${markfile}
      else
      echo "no this!"
      fi
      }

  • robertsong   2013/08/23

    非常实用。

跳到底部
返回顶部