<C-t>
在:pop<CR>
我的计算机上。当我将其绑定到<C-[>
或nnoremap <C-[> <C-t>
时nnoremap <C-t> :pop<CR>
,当我使用新绑定的键 时,Ctrl+[
Vim 的运行速度比使用默认键 时慢得多。Ctrl+t
我的方法错了吗?
我应该如何绑定按键才能让它以正常速度运行?
我确认这不是意外,并且尝试了多次以确保新绑定的密钥运行速度比默认密钥慢。
<C-t>
在:pop<CR>
我的计算机上。当我将其绑定到<C-[>
或nnoremap <C-[> <C-t>
时nnoremap <C-t> :pop<CR>
,当我使用新绑定的键 时,Ctrl+[
Vim 的运行速度比使用默认键 时慢得多。Ctrl+t
我的方法错了吗?
我应该如何绑定按键才能让它以正常速度运行?
我确认这不是意外,并且尝试了多次以确保新绑定的密钥运行速度比默认密钥慢。
我在 vim 8.2、vim 9 和 nvim 0.10.2 中发现了两个奇怪的行为omap
。它可能适用于所有运算符(至少d
,,,我已经测试过了),但我将在下面选择一个例子y
。c
d
用 表示行尾␊
。
缓冲区是
␊
abc␊
光标位于b
。
使用 时dge
,除了 之外,缓冲区会被清除,c
这并不奇怪。但是,使用d2ge
(或 ,2dge
相当于 ,d3ge
,d4ge
等),光标会移动到第一行的开头,并且不会删除任何内容(或对于运算符c
,我们不会处于插入模式)!
缓冲区是
abc␊
光标位于a
。使用db
,没有任何变化。这是因为 不b
包括。但是,使用dge
,即包括 ,同样没有任何变化!
我尝试在手册中查找,但无济于事。有人可以解释这种行为吗,希望可以参考 vim 手册?非常感谢!
为什么这对我有用:我正在开发一个vim 插件,将 vim单词移动扩展到没有单词边界的语言,比如中文。一个重要特性是与 ASCII 文本上的 vim 兼容。因此,我需要了解 vim/nvim 中的此类行为细节。
我怎样才能在 Vim 中突出显示一行中的前 10 个单词?
我在 Stackoverflow 上找到了第一个单词的答案:
/^\s*\w\+/
但顺便说一句,我不知道如何修改它以适应 10 个单词或任意数量的单词。
当我用 Vim 将从电子书中复制的文本粘贴到源代码中时,我遇到了问题,“不可中断空格”在编译时会导致 gcc 出现错误消息。
典型的错误信息是:
filename.c:69:6: error: stray ‘\302’ in program
69 | <U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0>return 1;
我使用过的简单解决方案是运行:%s/\%ua0/ /g
- 使它们成为常规空间。
有没有办法让这种情况在 Vim 中输入时自动发生(即从终端粘贴),例如命令或设置.vimrc
?
我有一个如下所示的文件:
Stroszek;12/01/1977;5.74;Drama,Comedy;7.142;Bruno S.(2),Eva Mattes(1),50 Cent(2),Wilhelm von Homburg(2),Burkhard Driest(2),Clayton Szalpinski(0),Ely Rodriguez(0),Alfred Edel(0),Scott McKain(0),Pitt Bedewitz(0),Ralph Wade(0),Michael Gahr(2),Vaclav Vojta(0),Yüksel Topcugürler(0)
Patients;01/03/2017;5.889;Drama,Comedy;25.000;Pablo Pauly(2),Soufiane Guerrab(2),Moussa Mansaly(2),Nailia Harzoune(1),Franck Falise(0),Yannick Renier(2),Alban Ivanov(2),Jason Divengele(0),Côme Levin(2),Dominique Blanc(1),Anne Benoît(1),Rabah Nait Oufella(2)
Carnage;16/09/2011;9.4;Drama,Comedy;45.454;Kate Winslet(1),Jodie Foster(1),Christoph Waltz(2),John C. Reilly(2),Elvis Polanski(0),Eliot Berger(0),Julie Adams(1),Joseph Rezwin(2),Tanya Lopert(1),Nathan Rippy(2),Lexie Kendrick(1)
我想使用 vim 命令将其转换为如下所示:
Stroszek;12/01/1977;5.74;Drama,Comedy;7.142;21222000000200
Patients;01/03/2017;5.889;Drama,Comedy;25.000;222102202112
Carnage;16/09/2011;9.4;Drama,Comedy;45.454;11220012121
我希望文件末尾的数字是第一个文件中括号内的数字。问题是由于第一行中的 50 cent 中的 '50',我不能删除除第六个字段中的数字之外的所有内容,因为那样会保留 50。
我尝试过如下命令:
:%s/\v(.*)(\(\d\))(.*)/\=substitute(submatch(2), '\D', '', 'g')/g
和 :
:%s/\v(.*)(\(\d\))(.*)/\2/g
但似乎都无法正常工作。有人知道该怎么做吗?
我编写了一个函数,给定一个目录和标题,显示一个弹出窗口,其中包含该文件夹中包含的所有文件:
function! ListFiles(dir, title)
let l:dir = a:dir
let l:title = a:title
let l:files = glob(l:dir . '/*', 0, 1)
let l:file_list = []
for l:file in l:files
call add(l:file_list, fnamemodify(l:file, ':t'))
endfor
" Define custom highlight groups
highlight PopupMenu guifg=#ffffff guibg=#333333 ctermfg=white ctermbg=darkred
highlight PopupMenuSelected guifg=#000000 guibg=#ffff00 ctermfg=black ctermbg=yellow
" Create a popup menu with the file list
let l:selected_file = popup_menu(l:file_list, {
\ 'title': ' ' . l:title . ' ',
\ 'callback': 's:HandleFileSelection',
\ 'line': &lines / 2,
\ 'col': &columns / 2,
\ 'highlight': 'PopupMenu',
\ 'border': [],
\ 'close': 'click',
\ 'padding': [1, 2, 1, 2],
\ 'mapping': 0,
\ 'filter': 'popup_filter_menu',
\ 'wrap': 0
\ })
" Define a function to handle the selection
function! s:HandleFileSelection(id, result)
let l:file_name = ""
if a:result != -1
let l:file_name = getbufline(winbufnr(a:id), a:result)[0]
endif
echom "FOO.".l:selected_file
return l:file_name
endfunction
" Return file
echom "BAR.".l:selected_file
return l:selected_file
endfunction
但是,当我运行它时,我可以看到,一旦您在某个项目上按下回车键,在出现消息(带有选定的文件)BAR...
之前会显示该消息(带有数字) 。FOO...
因此看起来代码首先执行ListFiles
函数的返回,然后执行处理程序的返回。
为什么会发生这种情况?哪种方法可以仅获得所选项目的单个返回值?
我希望真正了解 Vim 的人可以帮助我解决这个问题。我在 Windows 10 笔记本电脑上使用 MSWin32-64 版本的 Gvim。我安装了 Cygwin。我可以从 Cygwin bash shell 启动 Gvim,并且 Gvim 继承了 bash 的环境,最值得注意的是 $PATH。我解释这一点是因为我希望避免诸如“你为什么要这样做”之类的烦人评论。现在我来解释一下这个问题。
Gvim 命令行上的 ! 打开一个新终端,shell ($SHELL, &shell) 执行 ! 之后命令行上的所有内容。在 _vimrc 中,我让&shell=bash和让$SHELL=/full/path/to/shell。
好吧,如果 Gvim 的 cwd 与当前缓冲区的目录 (%) 相同,那么这个方法就没问题。但如果不同,Vim 会将 % 传递为 ..\parent\subdir\buffer.bla。我找不到解决这个问题的方法。我可以更改斜杠的方向:
:echom substitute(@% ,"\\", "/", "g")
但是 bang 忽略了这一点。它根本不做任何插值。好吧,还有 system()。它允许我插入一个参数,例如 result = system(substitute(@% ,"\", "/", "g")),但我想在新终端中查看所有输出、错误消息等,而 system 不执行终端(即它在后台运行一个新进程并返回程序的标准输出)。
就这样。