如何在 mac 上获得漂亮的 git 编辑器体验,就像在 devcontainers 中一样?

How do I get a pretty git editor experience on mac like I do in devcontainers?

提问人:jamiet 提问时间:11/15/2023 更新时间:11/15/2023 访问量:48

问:

我是 Visual Studio Code 开发容器的狂热用户,原因之一是我可以轻松获得非常漂亮的 git 编辑体验,用于编写提交消息和变基等操作。

git commit experience

git rebase experience

我知道这种颜色编码是通过开发容器功能提供的,ghcr.io/guiyomh/features/vim。这是我devcontainer.json:vim

{
    "name": "testgiteditor",
    "image": "mcr.microsoft.com/devcontainers/base:bullseye",
    "features": {
      "ghcr.io/guiyomh/features/vim": {}
    }
  }

devcontainer 功能只不过是安装脚本的包装器,在这种情况下,该安装脚本是 https://github.com/guiyomh/features/blob/main/src/vim/install.sh。该脚本似乎没有做任何特别的事情,它基本上可以运行apt-get -y install --no-install-recommends vim

我想在我的主机(即 mac)上获得相同的体验,但简单地安装 vim 并不能提供相同的体验

git commit experience on mac

我不明白在我的容器中安装vim有什么特别之处,它提供了这种漂亮的体验。有谁知道我如何在主机 Mac 上获得相同的体验?

如果有帮助,以下是容器中的输出:vim --version

VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Oct 01 2021 01:51:08)
Included patches: 1-2434
Extra patches: 8.2.3402, 8.2.3403, 8.2.3409, 8.2.3428
Modified by [email protected]
Compiled by [email protected]
Huge version without GUI.  Features included (+) or not (-):
+acl               -farsi             +mouse_sgr         +tag_binary
+arabic            +file_in_path      -mouse_sysmouse    -tag_old_static
+autocmd           +find_in_path      +mouse_urxvt       -tag_any_white
+autochdir         +float             +mouse_xterm       -tcl
-autoservername    +folding           +multi_byte        +termguicolors
-balloon_eval      -footer            +multi_lang        +terminal
+balloon_eval_term +fork()            -mzscheme          +terminfo
-browse            +gettext           +netbeans_intg     +termresponse
++builtin_terms    -hangul_input      +num64             +textobjects
+byte_offset       +iconv             +packages          +textprop
+channel           +insert_expand     +path_extra        +timers
+cindent           +ipv6              -perl              +title
-clientserver      +job               +persistent_undo   -toolbar
-clipboard         +jumplist          +popupwin          +user_commands
+cmdline_compl     +keymap            +postscript        +vartabs
+cmdline_hist      +lambda            +printer           +vertsplit
+cmdline_info      +langmap           +profile           +virtualedit
+comments          +libcall           -python            +visual
+conceal           +linebreak         -python3           +visualextra
+cryptv            +lispindent        +quickfix          +viminfo
+cscope            +listcmds          +reltime           +vreplace
+cursorbind        +localmap          +rightleft         +wildignore
+cursorshape       -lua               -ruby              +wildmenu
+dialog_con        +menu              +scrollbind        +windows
+diff              +mksession         +signs             +writebackup
+digraphs          +modify_fname      +smartindent       -X11
-dnd               +mouse             -sound             -xfontset
-ebcdic            -mouseshape        +spell             -xim
+emacs_tags        +mouse_dec         +startuptime       -xpm
+eval              +mouse_gpm         +statusline        -xsmp
+ex_extra          -mouse_jsbterm     -sun_workshop      -xterm_clipboard
+extra_search      +mouse_netterm     +syntax            -xterm_save
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -Wdate-time -g -O2 -ffile-prefix-map=/build/vim-DtwDbo/vim-8.2.2434=. -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 
Linking: gcc -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lm -ltinfo -lselinux -lacl -lattr -lgpm -ldl 

这是在我的 Mac 上运行相同的输出:

VIM - Vi IMproved 9.0 (2022 Jun 28, compiled Oct 19 2023 08:52:34)
macOS version - x86_64
Included patches: 1-2049
Compiled by Homebrew
Huge version without GUI.  Features included (+) or not (-):
+acl               +file_in_path      +mouse_urxvt       -tag_any_white
+arabic            +find_in_path      +mouse_xterm       -tcl
+autocmd           +float             +multi_byte        +termguicolors
+autochdir         +folding           +multi_lang        +terminal
-autoservername    -footer            -mzscheme          +terminfo
-balloon_eval      +fork()            +netbeans_intg     +termresponse
+balloon_eval_term +gettext           +num64             +textobjects
-browse            -hangul_input      +packages          +textprop
++builtin_terms    +iconv             +path_extra        +timers
+byte_offset       +insert_expand     +perl              +title
+channel           +ipv6              +persistent_undo   -toolbar
+cindent           +job               +popupwin          +user_commands
-clientserver      +jumplist          +postscript        +vartabs
+clipboard         +keymap            +printer           +vertsplit
+cmdline_compl     +lambda            +profile           +vim9script
+cmdline_hist      +langmap           -python            +viminfo
+cmdline_info      +libcall           +python3           +virtualedit
+comments          +linebreak         +quickfix          +visual
+conceal           +lispindent        +reltime           +visualextra
+cryptv            +listcmds          +rightleft         +vreplace
+cscope            +localmap          +ruby              +wildignore
+cursorbind        +lua               +scrollbind        +wildmenu
+cursorshape       +menu              +signs             +windows
+dialog_con        +mksession         +smartindent       +writebackup
+diff              +modify_fname      +sodium            -X11
+digraphs          +mouse             +sound             -xattr
-dnd               -mouseshape        +spell             -xfontset
-ebcdic            +mouse_dec         +startuptime       -xim
+emacs_tags        -mouse_gpm         +statusline        -xpm
+eval              -mouse_jsbterm     -sun_workshop      -xsmp
+ex_extra          +mouse_netterm     +syntax            -xterm_clipboard
+extra_search      +mouse_sgr         +tag_binary        -xterm_save
-farsi             -mouse_sysmouse    -tag_old_static
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
  fall-back for $VIM: "/usr/local/share/vim"
Compilation: clang -c -I. -Iproto -DHAVE_CONFIG_H -DMACOS_X -DMACOS_X_DARWIN -g -O2 -D_REENTRANT -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: clang -L/usr/local/lib -o vim -lm -lncurses -lsodium -liconv -lintl -framework AppKit -L/usr/local/opt/lua/lib -llua5.4 -mmacosx-version-min=13.5 -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/perl/lib/perl5/5.38/darwin-thread-multi-2level/CORE -lperl -L/usr/local/opt/[email protected]/Frameworks/Python.framework/Versions/3.12/lib/python3.12/config-3.12-darwin -lpython3.12 -framework CoreFoundation -lruby.3.2 -L/usr/local/Cellar/ruby/3.2.2_1/lib
vim vscode-dev容器

评论


答:

3赞 romainl 11/15/2023 #1

好吧,这个很有趣。

引用我自己的话:

很长一段时间以来,Vim 的 spartan 默认值一直是一个有争议的话题,在 Vim 7.4 和 Vim 8.0 的发布之间已经决定为新手提供更用户友好的基础设置。设计的方案是,如果在通常的位置找不到,则以静默方式获取特定的运行时文件(见上文)。事实上,它按预期工作:只需在没有自定义配置的情况下启动 Vim,就能真正提供比以前更舒适的体验。defaults.vimvimrc

其中一项公认的有用功能是语法突出显示。这是您在 devcontainer 中习惯的。defaults.vim

当时,新方案并没有受到社区的欢迎,因为虽然它确实为新的视频提供了更好的开箱即用体验,但它打破了几个长期建立的期望,特别是在与 vi 的兼容性方面。

仍然引用我自己的话:

该方案的众多麻烦之一是,开始掌握 Vim 的终生旅程意味着创建自己的 ,这实际上禁用了 。这使新用户处于比以前更糟糕的境地:每个人都喜欢讨厌斯巴达式的默认值,并且不知道如何找回他们习惯的公认有用的东西,因为几乎是一个黑匣子。干得好!vimrcdefaults.vimdefaults.vim

:help defaults.vim如果您不喜欢该机制,则提供了一种禁用该机制的简单方法:

let skip_defaults_vim = 1

事实证明,苹果公司负责 Vim 软件包的人似乎并不是特别喜欢它,从中可以看出:/usr/share/vim/vimrc

" Configuration file for vim
set modelines=0     " CVE-2007-2438

" Normally we use vim-extensions. If you want true vi-compatibility
" remove change the following statements
set nocompatible    " Use Vim defaults instead of 100% vi compatibility
set backspace=2     " more powerful backspacing

" Don't write backup file if vim is being called by "crontab -e"
au BufWrite /private/tmp/crontab.* set nowritebackup nobackup
" Don't write backup file if vim is being called by "chpass"
au BufWrite /private/etc/pw.* set nowritebackup nobackup

let skip_defaults_vim=1

现在,您的机器上似乎至少有两个 Vim:默认的 Vim 位于 ,其运行时目录位于 ,而 Homebrew 的 则位于 ,其运行时目录位于 。/usr/bin/vim/usr/share/vim/opt/homebrew/bin/vim/opt/homebrew/Cellar/vim/<version>/share/vim/vim90

这就是事情变得有点复杂的地方。如上图所示,系统默认使用 Vim,禁用并因此进行语法高亮显示。但是 Homebrew Vim 没有附带系统,所以它应该默认启用语法高亮。vimrcdefaults.vimvimrc

由于默认情况下没有启用语法高亮显示,这可能意味着 Git 使用的是默认的 Vim,而不是 Hombrew Vim。

我可以看到两种解决方案......

  • 将 Git 配置为使用 Homebrew Vim 作为 .core.editor

  • 或者创建一个包含以下内容(并选择性地摆脱 Homebrew Vim),如下所示:~/.vimrc:help defaults.vim

    unlet! skip_defaults_vim
    source $VIMRUNTIME/defaults.vim
    

评论

0赞 jamiet 11/15/2023
匪夷所思。我选择了“创建一个包含以下内容的 ~/.vimrc”,它运行良好,非常感谢。
0赞 jamiet 11/15/2023
一些小笔记,对于未来的我和其他人一样多。1) homebrew 已将 vim 安装到 /usr/local/Cellar/vim/ 中。2) 运行返回 /usr/local/bin/vim,它是指向 /usr/local/Cellar/vim/9.0.2050/bin/vim 的符号链接。3) 运行返回 /usr/local/share/vim/vim90which vim:echo $VIMRUNTIME
0赞 romainl 11/15/2023
是的,Apple Silicon Mac 和 Intel Mac 之间的路径不同。如果你的用例仅限于编辑 git 提交,那么你可能应该考虑完全删除 Homebrew Vim 以减少系统上的熵。如果你真的更喜欢 Homebrew Vim 而不是系统 Vim,那么配置 Git 和你环境的其余部分来使用它而不是系统 Vim 更有意义。
0赞 jamiet 11/15/2023
好建议。我确实使用 vim 来编辑 git 提交,仅此而已。我的是英特尔 mac。再次感谢。
1赞 Friedrich 11/15/2023 #2

如果默认情况下未打开,只需调用(作为命令或在 中)即可启用语法突出显示。请参阅以供参考。:syntax enablevimrc:help :syntax-enable

同时,romainl彻底的根本原因分析仍然有效。我也同意写自己的文章是学习 Vim 的必要步骤。vimrc