我正在寻找一个示例,说明如何在vim脚本中使用findfile函数以递归方式向上搜索文件,特别是使用通配符.
每当我将通配符包含为第一个函数参数的一部分时,这似乎不起作用.
例如,使用以下目录结构:
~/MyProject/
Test.sln
src/
Test.cs
Run Code Online (Sandbox Code Playgroud)
如果我运行以下函数,在编辑文件Test.cs时将pwd设置为〜/ MyProject/src
function! Test()
let a = findfile("*.sln", ".;")
echo a
endfunction
Run Code Online (Sandbox Code Playgroud)
findfile似乎什么也没有返回.但是,如果我修改函数以删除widcard,如下所示:
function! Test()
let a = findfile("Test.sln", ".;")
echo a
endfunction
Run Code Online (Sandbox Code Playgroud)
它做了我所期望的.
我已经在ubuntu和windows上测试了这个,我看到两者都有相同的行为.我在这里做错了什么,或者findfile只是不支持通配符?缺乏对通配符的支持似乎是一个相当奇怪的遗漏.看来我必须在这里做错事.
我正在尝试在Vim中编写一个简单的函数来返回powershell命令的结果.不过,我在结果中不断受到喋喋不休.
我认为这可能是一个编码问题,但你会发现问题很奇怪,因为它"有点工作".但是我没有解决问题的方法.
使用vim中设置的以下非默认shell选项:
set shell=powershell
set shellcmdflag=-c
Run Code Online (Sandbox Code Playgroud)
鉴于以下功能:
function! Test()
let result = system("ls")
call setline(1, result)
endfunction
Run Code Online (Sandbox Code Playgroud)
当我运行时(来自C:\ Windows):
:call Test()
Run Code Online (Sandbox Code Playgroud)
以下内容写入我的缓冲区:
^@^@ Directory: C:\Windows^@^@^@ Mode LastWriteTime Length Name ^@-------
....continues
Run Code Online (Sandbox Code Playgroud)
但是当我运行以下命令时:
:r!ls
Run Code Online (Sandbox Code Playgroud)
我得到了我期望的结果(即ls的powershell结果)更有趣的是当我运行命令时:
:echo system("ls")
Run Code Online (Sandbox Code Playgroud)
结果看起来很正确
我尝试修改我原来的功能如下:
function! Test()
let result = system("ls")
echo result
call setline(1, result)
endfunction
Run Code Online (Sandbox Code Playgroud)
回声的价值正是我所期待的 - 但我仍然看到了胡言乱语
我也尝试过以下修改我的功能:
function! Test()
let result = system("ls")
let conv = iconv(result, "utf-8", &enc)
call setline(1, conv)
endfunction
Run Code Online (Sandbox Code Playgroud)
但结果完全相同(即它们包括^ @ ^ @符号和其他乱码)
我猜测正在发生的是使用>生成utf-16输出重定向的powershell cmds,而vim无法处理这个问题.我从powershell得到以下内容(本例中的文件是gnu32程序):
PS> ls > …Run Code Online (Sandbox Code Playgroud) 在实体框架中,使用存储过程,我想使用乐观并发在我的表上执行更新.在没有修改现有更新存储过程的情况下,我一直无法使用它.我正在尝试确定是否有一种方法可以映射现有的存储过程,以便在没有更新行时发生并发异常.
一些背景资料:
我现有的存储过程如下所示(显然省略了实际的表名和列):
UPDATE Table SET Column = @Column1, Column2 = @Column2 ....
WHERE PK = @PK AND Timestamp = @Timestamp
SELECT PK, Column1, Column2, ....., Timestamp
FROM Table WHERE PK = @PK
Run Code Online (Sandbox Code Playgroud)在该更新失败(由于时间戳不匹配)的情况下的存储过程的选定部分将仍然返回一行.
当我将存储过程修改为以下内容时:
UPDATE Table SET Column = @Column1, Column2 = @Column2 ....
WHERE PK = @PK AND Timestamp = @Timestamp
IF @@ROWCOUNT > 0
SELECT PK, Column1, Column2, ....., Timestamp
FROM Table WHERE PK = @PK
Run Code Online (Sandbox Code Playgroud)
然后一切都按预期工作,并发生并发错误.
或者,如果我使存储过程返回一个输出参数,并将该输出参数映射到Entity Framework的.edmx文件中的"Rows Affected Parameter",那么并发错误也会按预期工作.
这个解决方案(即使用输出参数)最好解释,我发现,这里:http: …