首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使我的插件在Windows中使用“`set编码=utf-8”从PowerShell运行?

如何使我的插件在Windows中使用“`set编码=utf-8”从PowerShell运行?
EN

Stack Overflow用户
提问于 2019-05-28 14:08:48
回答 4查看 403关注 0票数 0

我想要的

我想为Vim使用一个插件,我使用著名的插件管理器病原体(https://github.com/tpope/vim-pathogen)。

插件是vim-ps1 (https://github.com/PProvost/vim-ps1),并为文件扩展名为*.ps1的Windows文件提供语法着色。

我的配置

为了安装我的插件,我只是将它克隆到包目录中。我在运行Windows的办公计算机上,所以我的vimfiles目录(而不是.vim linux版本)如下所示:

代码语言:javascript
复制
    vimfiles
     ├── autoload
     │    └── pathogen.vim
     ├── bundle
     │    ├── nerdtree
     │    └── vim-ps1
     ├── spell
     ├── template
     └── vimrc

所以有两个插件,vim-ps1我想安装,和nerdtree,只是为了确保我的问题不是来自插件(我假设nerdtree有特殊的问题)。

vimrc文件是由_vimrc文件加载的,因为我想对设置进行版本化。有关此问题的更多信息,请参见https://stackoverflow.com/a/18203545/7964523

代码语言:javascript
复制
    runtime vimrc

问题所在

使用set encoding=utf-8,我不能使用插件

当我打开一个*.sp1时,什么都不会发生。下面是用于调试的vimrc文件的内容:

代码语言:javascript
复制
    runtime! debian.vim
    set nocompatible

    execute pathogen#infect("~/vimfiles/bundle/{}")
    syntax on
    filetype plugin indent on

    set encoding=utf-8

:scriptnames的输出是

代码语言:javascript
复制
      1: ~\_vimrc
      2: ~\vimfiles\vimrc
      3: ~\vimfiles\autoload\pathogen.vim
      4: C:\Program Files (x86)\Vim\vim81\syntax\syntax.vim
      5: C:\Program Files (x86)\Vim\vim81\syntax\synload.vim
      6: C:\Program Files (x86)\Vim\vim81\syntax\syncolor.vim
      7: C:\Program Files (x86)\Vim\vim81\filetype.vim
      8: ~\vimfiles\bundle\vim-ps1\ftdetect\ps1.vim
      9: ~\vimfiles\bundle\vim-ps1\ftdetect\ps1xml.vim
     10: ~\vimfiles\bundle\vim-ps1\ftdetect\xml.vim
     11: C:\Program Files (x86)\Vim\vim81\ftplugin.vim
     12: C:\Program Files (x86)\Vim\vim81\indent.vim
     13: C:\Program Files (x86)\Vim\vim81\plugin\getscriptPlugin.vim
     14: C:\Program Files (x86)\Vim\vim81\plugin\gzip.vim
     15: C:\Program Files (x86)\Vim\vim81\plugin\logiPat.vim
     16: C:\Program Files (x86)\Vim\vim81\plugin\manpager.vim
     17: C:\Program Files (x86)\Vim\vim81\plugin\matchparen.vim
     18: C:\Program Files (x86)\Vim\vim81\plugin\netrwPlugin.vim
     19: C:\Program Files (x86)\Vim\vim81\plugin\rrhelper.vim
     20: C:\Program Files (x86)\Vim\vim81\plugin\spellfile.vim
     21: C:\Program Files (x86)\Vim\vim81\plugin\tarPlugin.vim
     22: C:\Program Files (x86)\Vim\vim81\plugin\tohtml.vim
     23: C:\Program Files (x86)\Vim\vim81\plugin\vimballPlugin.vim
     24: C:\Program Files (x86)\Vim\vim81\plugin\zipPlugin.vim
     25: C:\Program Files (x86)\Vim\vim81\scripts.vim
     26: C:\Program Files (x86)\Vim\vim81\syntax\vim.vim
     27: C:\Program Files (x86)\Vim\vim81\ftplugin\vim.vim
     28: C:\Program Files (x86)\Vim\vim81\indent\vim.vim

您可以看到加载了vim-ps1目录中的一些文件。":set runtimepath?的输出是

代码语言:javascript
复制
    runtimepath=
    ~\vimfiles\bundle\nerdtree,
    ~\vimfiles\bundle\vim-ps1,
    ~/vimfiles,
    C:\Program Files (x86)\Vim/vimfiles,
    C:\Program Files (x86)\Vim\vim81,
    C:\Program Files (x86)\Vim/vimfiles/after,
    ~/vimfiles/after

您还可以看到nerdtreevim-sp1文件夹在那里,但它们都不能工作。

没有set encoding=utf-8,我就很难显示字符

现在,我从我的set encoding=utf-8文件中删除行vimrc。我打开*.sp1,语法着色功能就能工作了!Nerdtree也能工作。

但是我现在很难显示一些字符,比如字符代码ac (使用vim命令ga检查),在utf-8中被解释为¬,在拉丁文中是¼

:scriptnames的输出提供了更多的行,包括与语法插件相关的行(参见46、47、48):

代码语言:javascript
复制
      1: ~\_vimrc
      2: ~\vimfiles\vimrc
      3: ~\vimfiles\autoload\pathogen.vim
      4: C:\Program Files (x86)\Vim\vim81\syntax\syntax.vim
      5: C:\Program Files (x86)\Vim\vim81\syntax\synload.vim
      6: C:\Program Files (x86)\Vim\vim81\syntax\syncolor.vim
      7: C:\Program Files (x86)\Vim\vim81\filetype.vim
      8: ~\vimfiles\bundle\vim-ps1\ftdetect\ps1.vim
      9: ~\vimfiles\bundle\vim-ps1\ftdetect\ps1xml.vim
     10: ~\vimfiles\bundle\vim-ps1\ftdetect\xml.vim
     11: C:\Program Files (x86)\Vim\vim81\ftplugin.vim
     12: C:\Program Files (x86)\Vim\vim81\indent.vim
     13: ~\vimfiles\bundle\nerdtree\plugin\NERD_tree.vim
     14: ~\vimfiles\bundle\nerdtree\autoload\nerdtree.vim
     15: ~\vimfiles\bundle\nerdtree\lib\nerdtree\path.vim
     16: ~\vimfiles\bundle\nerdtree\lib\nerdtree\menu_controller.vim
     17: ~\vimfiles\bundle\nerdtree\lib\nerdtree\menu_item.vim
     18: ~\vimfiles\bundle\nerdtree\lib\nerdtree\key_map.vim
     19: ~\vimfiles\bundle\nerdtree\lib\nerdtree\bookmark.vim
     20: ~\vimfiles\bundle\nerdtree\lib\nerdtree\tree_file_node.vim
     21: ~\vimfiles\bundle\nerdtree\lib\nerdtree\tree_dir_node.vim
     22: ~\vimfiles\bundle\nerdtree\lib\nerdtree\opener.vim
     23: ~\vimfiles\bundle\nerdtree\lib\nerdtree\creator.vim
     24: ~\vimfiles\bundle\nerdtree\lib\nerdtree\flag_set.vim
     25: ~\vimfiles\bundle\nerdtree\lib\nerdtree\nerdtree.vim
     26: ~\vimfiles\bundle\nerdtree\lib\nerdtree\ui.vim
     27: ~\vimfiles\bundle\nerdtree\lib\nerdtree\event.vim
     28: ~\vimfiles\bundle\nerdtree\lib\nerdtree\notifier.vim
     29: ~\vimfiles\bundle\nerdtree\autoload\nerdtree\ui_glue.vim
     30: ~\vimfiles\bundle\nerdtree\nerdtree_plugin\exec_menuitem.vim
     31: ~\vimfiles\bundle\nerdtree\nerdtree_plugin\fs_menu.vim
     32: ~\vimfiles\bundle\nerdtree\nerdtree_plugin\vcs.vim
     33: C:\Program Files (x86)\Vim\vim81\plugin\getscriptPlugin.vim
     34: C:\Program Files (x86)\Vim\vim81\plugin\gzip.vim
     35: C:\Program Files (x86)\Vim\vim81\plugin\logiPat.vim
     36: C:\Program Files (x86)\Vim\vim81\plugin\manpager.vim
     37: C:\Program Files (x86)\Vim\vim81\plugin\matchparen.vim
     38: C:\Program Files (x86)\Vim\vim81\plugin\netrwPlugin.vim
     39: C:\Program Files (x86)\Vim\vim81\plugin\rrhelper.vim
     40: C:\Program Files (x86)\Vim\vim81\plugin\spellfile.vim
     41: C:\Program Files (x86)\Vim\vim81\plugin\tarPlugin.vim
     42: C:\Program Files (x86)\Vim\vim81\plugin\tohtml.vim
     43: C:\Program Files (x86)\Vim\vim81\plugin\vimballPlugin.vim
     44: C:\Program Files (x86)\Vim\vim81\plugin\zipPlugin.vim
     45: C:\Program Files (x86)\Vim\vim81\scripts.vim
     46: ~\vimfiles\bundle\vim-ps1\syntax\ps1.vim
     47: ~\vimfiles\bundle\vim-ps1\ftplugin\ps1.vim
     48: ~\vimfiles\bundle\vim-ps1\indent\ps1.vim

不改变:set runtimepath?的输出

我想要克服的

我设法识别了触发器(见上文)。

我把线移了set encoding=utf-8

  • 不管它在执行病原体的线路后的位置如何,这个问题都是一样的。
  • 在执行病原体的线上,我得到了这个错误: E117:未知函数: pathogen#infect E15:无效表达式: pathogen#infect("~/vimfiles/bundle/{}")

所以这是最糟糕的。

如何使插件与set encoding=utf-8一起工作?

Edit1

在运行Vim8.1时,我应用了@Matt建议的解决方案。问题仍然存在,但与病原体无关。

添加set fileencodings=utf-8,default没有任何改变。

我从我的终端vim -Vdebug运行并分析了输出文件debug。我的用户名包含了十六进制unicode中的字母é编码的e9,并且在调试文件中的某个时候我得到了

代码语言:javascript
复制
    Searching for "C:\Users\Aur<e9>lien/vimfiles/pack/*/start/*"

请参阅<e9>部分。它是四个单独的字符<e9> (我可以将光标放在每个字符上)。

如果没有set fileencodings=utf-8,defaultset encoding=utf-8,调试文件的输出是正确的(除了斜杠和反斜杠,但它可以工作):

代码语言:javascript
复制
    Searching for "C:\Users\Aurélien/vimfiles/pack/*/start/*"

这解释了为什么它不适用于set encoding=utf-8,但我无法解释这种行为。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-06-03 13:47:35

解决方案是修改Windows中的参数,以便正确使用UTF-8 .它位于“控制面板”>“时钟和区域”>“区域”下。在“管理”选项卡下,单击“更改系统区域设置.”。为此您需要拥有管理员权限。

更改设置第1部分:

然后选中"Beta:使用Unicode UTF-8进行全球语言支持“之前的复选框(见下面的截图)。

更改设置第2部分:

我不知道这个参数到底发生了什么变化。实际上,在堆栈溢出中有一个关于它的问题:What does "Beta: Use Unicode UTF-8 for worldwide language support" actually do?。目前还没有任何答案。

Microsoft论坛上的旧线程没有提供更多信息:https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/6f9f1695-9d64-43f3-8527-6b895599233a/use-unicode-utf8-for-worldwide-language-support

票数 0
EN

Stack Overflow用户

发布于 2019-05-28 16:43:15

看上去你在运行Vim 8,所以你根本不需要病原体。只要在~/vimfiles/pack/bundle/start下移动你的插件,你就完成了。阅读:help packages获取更多信息。

此外,根据我将set encoding=utf-8设置为的经验,配置中的第一行(不包括注释)省去了许多麻烦。

票数 0
EN

Stack Overflow用户

发布于 2019-06-02 12:15:16

我找到了一个解决方案:从不同于Windows的终端运行Vim。我使用的终端是Git (https://gitforwindows.org/)附带的终端。正如@Matt提到的,它是基于薄荷的。

将Windows PowerShell的代码页从默认的850 (拉丁语-1)更改为65001 (utf-8)没有任何影响。我不需要使用PowerShell,但是另一种解决方案会对那些需要帮助的人有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56344115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档