- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个小的 vim 插件,并在进行增量更改时 :source %
-ing .vim 文件。
在每次更改和 :source
命令之后,最新的更改似乎没有被加载/应用,所以我想取消 :source
/unload以某种方式无需关闭和重新打开 VIm 即可打开文件。
是否有(更好的)方法来做到这一点?编写 VIm 插件和尝试新功能时正确的工作流程应该是什么?
谢谢
最佳答案
为了总结评论。
需要定义函数和命令 -> function!
, command!
需要清除自动命令。我通常这样做:
augroup MyPluginNameOrFeature
au! " <- this clears all autocommands defined in the group MyPluginNameOrFeature
au Event pattern action
aug END
需要绕过反重新收录守卫。例如,我的插件通常是这样定义的:
" plugin/foobar.vim
let s:k_version = '100'
if &cp || (exists("g:loaded_foobar")
\ && (g:loaded_foobar>= s:k_version)
\ && !exists('g:force_reload_foobar'))
finish
endif
let g:loaded_foobar= s:k_version
let s:cpo_save=&cpo
set cpo&vim
... plugin definitions (mappings, commands, autocommand, abbreviation)
... understand that functions are in autoload-plugin which don't have anti-reinclusion guards
let &cpo=s:cpo_save
这意味着您必须在保存和重新加载之前增加版本号,或者您需要设置 g:force_reload_foobar
在重新加载脚本之前设置为 1。因此我的 :Reload
命令(它与其他两个答案中提供的相同 - 这个支持相对于 'runtimepath'
选项的命令行自动完成)
对于我们可以创建的对象:
function! namespace#make_my_object(args)
let res = {}
" don't write the following if you want to be able
" to override the member function definitions when reloading the script
" and if you want to be able to decode which function appears in
" the callstack
" :function! res.foo() abort
" code
" :endfunction
" Instead write:
let res.foo = function('s:foo') " with later vim versions
let res.foo = function(s:getSNR('s:foo')) " with older vim versions
return res
endfunction
function! s:foo() dict abort
code
endfunction
function! s:getSNR(...) abort
" needed to assure compatibility with old vim versions
if !exists("s:SNR")
let s:SNR=matchstr(expand('<sfile>'), '<SNR>\d\+_\zegetSNR$')
endif
return s:SNR . (a:0>0 ? (a:1) : '')
endfunction
否则如果你已经提取了:let o = namespace#make_my_object(42)
,重新获取脚本不会更新对象方法的定义。 :Reload plugin/foobar.vim | :call o.foo()
覆盖/重新初始化一个变量真的很容易。只是给它一个新的值(value)。但是,如果您的 vim 版本不够新,您将无法更改数据类型。在你这边检查 vim 的行为很容易:
let s:foo = 'bar'
let s:foo = {}
如果最后出现错误,您可能需要添加显式 :silent! unlet s:foo
.但是,如果您打算通过 vim-client-server 功能和 vimrunner 在 tracis-CI 中测试它,请不要将它留在您的脚本中,一旦提交。而是测试 if exists('s:foo') |unlet s:foo | endif
-- :silent
在 redir
中使用时不是那么安静正如 vimrunner 所做的那样。
有时我们不想重新初始化一个变量,而是希望保留之前的值。在这种情况下,请编写如下内容:
let s:foo = get(s:, 'foo', default_value)
let g:foo = get(g:, 'foo', another_default_value)
在它们的情况下没什么可做的,因为它们会自动被新定义覆盖。主要要注意的是当你提供<Plug>mappings
使用默认和唯一的键绑定(bind)来触发它们。
例如:
nnoremap <silent> <Plug>(some-feature) TheActionToExecute
if !hasmapto('<Plug>(some-feature)', 'n')
nmap <silent> <unique> <leader>default-keybinding <Plug>(some-feature)
endif
<unique>
对于检测歧义/太多想要绑定(bind)到相同键序列的操作非常有用。
这与菜单相同:提供新的定义会覆盖之前的定义。但是将操作绑定(bind)到新的菜单条目(名称和优先级)就像将映射绑定(bind)到新的键序列:旧的不会被删除。充其量你暂时(在你的 vim session 期间)在语义上重载了一些 trigger->action 定义:有几种方法可以触发语义上相同的 Action 。它通常不是那么重要。
我没有具体说明 ftplugins 或其他脚本类型的情况。我看到的唯一区别与反重新包含保护有关,并且映射、命令和缩写在 ftplugin 的情况下是本地缓冲区。
关于vim - 如何在获取并更改 vim 脚本后卸载它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40254993/
1.使用start-all.sh启动hadoop服务时,提示输入 您确定要继续连接吗(是/否) 当我通过脚本启动它时如何抑制这个提示,现在我正在使用期望模块,但我认为可能有一种更简单的方法来做到这一点
我安装了在 Ubuntu 12.04 下运行的 Geonode R 2.01。我尝试使用以下命令卸载它: sudo apt-get remove --purge geonode sudo apt-ge
假设我有 AppDomainA,它启动 AppDomainB。 AppDomainB 然后启动 AppDomainC。 如果在 AppDomainA 中卸载 AppDomainB,AppDomainC
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我尝试使用以下命令从我的 Ubuntu 中卸载 NGinX: sudo apt-get remove nginx-core nginx-full nginx-light nginx-extras n
我已经从 /Applications/ 中删除了 MacVim目录,但当我输入 vim 时在终端中显示错误:no such file or directory: /Applications/MacVi
我的页面中有一个 iframe,该 iframe 嵌入了一个不在我的服务器上的网站。 我正在寻找一种在 iframe 重定向之前触发函数的方法。例如,当用户单击 iframe 内的链接并且 ifram
看来我被 Visual Studio 的 Atomineer Pro 文档加载项挟持了!试用期结束了,我没有用了!但现在每次我在 Visual Studio 中做某事时,我都会收到一条错误消息并发送到
我有一个使用 WiX 完成的安装程序。安装完成后,它会启动一个应用程序,在 Explorer 进程中注入(inject)一些代码。 目前,当我卸载时,重新启动管理器会启动并关闭我的应用程序和资源管理器
在我的网络应用中,我需要在用户离开页面之前发送他们更改的最新数据。 我在页面卸载时调用这样的函数: window.onbeforeunload=sendData; 这就是函数内部调用的内容 funct
我使用 jQuery 和 history.js 来管理部分页面之间的动态转换;这样我就可以避免重新加载整个文档。其中一些部分页面调用自己独特的 javascript 文件。虽然页面之间的转换运行良好,
我需要处理应用程序包的变化,我这样写我的 mainfest mainfest.xml 我的接收器类
我目前在使用大量内存方面遇到了麻烦,我正在尽一切努力削减和优化涉及内存的代码...目前我的游戏的大部分 Nib 文件都加载了所有它在 ViewDidLoad 中的变量,现在我的问题是,在我的 view
如何从系统中删除 composer Php Dependecny Manager? 它说卸载无法继续,因为以下应用程序正在使用需要删除的文件。 Windows 资源管理器 最佳答案 我遇到了同样的问题
所以我使用 stow 在服务器上安装了 Python 2.7.1 源代码 .我过去很粗心,在处理源代码安装时我试图保持井井有条。所以,输入 stow。现在我使用 wget 安装了 easy_insta
有谁知道如何卸载 MacRuby?我在使用 RubyCocoa 然后决定试用 MacRuby,在安装 MacRuby 之后,RubyCocoa 已经停止工作。所以我想删除 MacRuby,但我找不到任
我无法从 64 位 EC2 卸载 mongo。在/usr/bin 我有 mongo 和 mongod 等等。当我从任何地方键入 mongo 时,它会在 1.8 版打开 shell。我现在下载了 2.0
本文实例讲述了Android编程实现监控apk安装,卸载,替换的方法。分享给大家供大家参考,具体如下: ?
1说明 mysql++是mysql开发团队为OO编程提供的C++开发库,是对mysql提供的底层数据存取API进行的C++封装,用其手册上的说法是:复杂而又庞大,当然功能也更强大。 Mysql+
自从我开始建立我的网站那天起,我安装了很多包,有时是为了测试一堆代码,有时是为了项目本身(后来我发现这不是需要的包)。但是现在,当我运行 pip freeze 时,我有一个包列表,我很难卸载不使用的包
我是一名优秀的程序员,十分优秀!