Vi & Vim

使用vi和Vim系列文本编辑器的人员的问答

4
将操作限制为一段代码
在我的日常工作中,有很多次我需要操作特定的功能,例如突出显示或搜索变量,但是我从未设法限制编辑/搜索的范围。 vim中是否有一种方法可以有选择地说,找到$color这些括号内的所有引用,或这种折叠等。如果可能的话,最好是相对通用的,以便可以将其应用于编辑/替换文本。 举个例子: $color = "#fff"; function PickColor () { $color = "#bbb"; $newColors = ["#000", "#fbf", $color]; foreach ($newColors as $c) { if ($c == "#fff") { break; } } } $differentColor = $color; 这段代码是一个相对较差的示例,但是,如果我需要替换$ color的所有实例,那么如何在函数PickColor的上下文中执行此操作。再举一个例子,使用#和*你可以去反对整个文件文本对象的下一个实例,你会如何限制了搜索只是这个功能(基本包搜索),其范围可以跨越成千上万行和输球您的位置,还是错误地替换了您不应该使用的其他功能?

3
如何将文本从一个寄存器移动到任意数量的寄存器?
有没有办法将文本从一个寄存器“管道”到另一个寄存器或一组寄存器?例如,通过移至"q寄存器。"1"5 我经常希望为同一宏创建稍有不同的版本,因此能够将“模板”宏复制到多个寄存器,然后就地修改每个寄存器,这很有用。 举一个实际的例子,这是促使我想到这个问题的问题。 我需要将以下内容从硬件描述语言转换为许多重复的块, RAM64(in=in, load=load0, address=address[0..5], out=out1); 至 RAM64(in=in, load=load1, address=address[0..5], out=out2); RAM64(in=in, load=load2, address=address[0..5], out=out3); RAM64(in=in, load=load3, address=address[0..5], out=out4); RAM64(in=in, load=load4, address=address[0..5], out=out5); 我有一个宏,它使用增量函数执行此操作,该函数yypW^At)^A存储在register中"a。 有时,我需要递增的模式要稍有不同,例如 RAM512(in=in, load=load1, address=address[0..8], out=out2); RAM512(in=in, load=load2, address=address[0..8], out=out4); RAM512(in=in, load=load3, address=address[0..8], out=out6); RAM512(in=in, load=load4, address=address[0..8], out=out8); 其中,在寄存器中的宏"b会yypW^At)^A^A。 我想要一个寄存器来执行此操作,但是对于从1-5开始的每个增量。"a可以(以某种方式)将该寄存器复制到寄存器b到e。然后,我将每个寄存器粘贴到缓冲区中,进行所需的修改(添加更多项,更改跟随t运动的字符等),然后将修改后的表达式重新拉回到寄存器中。理想情况下,该最后一步甚至可以包含在复制寄存器的命令中 这使我不必重复宏中不需要更改的所有字符。以我的示例为例,这可能是微不足道的,但我可以预见,在某些时候做我想做的事情可能会很有帮助。

1
有前置插入模式吗?
我试图写一个字符串,所有字符都从z到a,我认为如果可以向后写,这会容易得多。 这个想法就像是INSERT模式,在该模式下,在插入每个字符后光标不会前进。我找不到这样的东西,所以我想知道这种模式是否已经存在或可以通过某种方式实现? 注意:我知道我可以颠倒文字,但这不是重点。

2
我如何在vimrc中区分vim和vimdiff?
我在vim中有一个函数,它将打开所有缓冲区作为选项卡。但是,在添加此功能后,vimdiff也会将要比较的文件作为不同的选项卡打开,因此不会显示差异。有什么方法可以找出正在调用vimrc文件的vim还是vimdiff? function! OpenTabs() let bf=len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) if bf > 1 exe "tab 5sball" endif endfunction
10 vimrc  vimdiff 

2
vimgolf如何记录所有击键?
我不时喜欢参加vimgolf赛。这可能是有启发性的。 他们如何记录所有击键?那一定是vim功能。任何人都知道如何做到这一点。在某些情况下记录所有内容可能会派上用场。

3
什么是暂存窗口?
有时我会看到一个打开的窗口,其中显示name scratch。 我知道这是某种临时缓冲区/窗口。 我该如何装箱? :h scratch 什么也不返回。

2
是否可以从撤消历史记录中删除条目?
我的.vimrc中有以下几行可以帮助缩进: autocmd BufReadPost * set noexpandtab | retab! 4 autocmd BufWritePre * set expandtab | retab! 4 autocmd BufWritePost * set noexpandtab | retab! 4 但是,它们会在撤消历史中产生大量噪音。由于从用户的角度来看,它们基本上什么也不做,因此我想从历史记录中删除它们,或者至少以某种方式挤压它们(如果一起挤压,它们可能会取消?)。有办法吗?
10 vimrc  undo-redo 

2
将缓冲区复制到新选项卡中,而不是将其移动
我经常想在选项卡页面中临时最大化缓冲区,然后返回到我正在查看的旧缓冲区配置。我当前执行此操作的工作流程是使用来关闭所有其他缓冲区,<c-w>o或者将我当前正在查看的缓冲区移动到其自己的选项卡<c-w>T。第二种方法的问题是它从原始选项卡页中删除了缓冲区。 我填充三个文件a.txt,b.txt以及c.txt用a,b和c分别。 % echo a > a.txt % echo b > b.txt % echo c > c.txt 当我在一个标签页中打开所有这三个文件时,将得到以下内容。 然后,我可以自己移动a.txt到选项卡。但是,当我这样做时,a.txt将从原来的标签页中删除。(因此,在a之后<c-w>Tgt) 我希望能够选择<c-w>T保留原始缓冲区内容的时间,创建一个仅包含当前焦点缓冲区的新标签页,然后将我刚刚关注的新标签页聚焦创建。换句话说,<c-w>T除了保留了原来的选项卡页面,而现在a.txt位于两个选项卡页面之外,该命令几乎完全相同。 有没有办法做到这一点?

1
用等号映射Ctrl
我正在尝试将Ctrl和加号映射在一起。这是我在vimrc中尝试的方法: nnoremap <C-=> : echo "Hello" <CR> 但是,似乎未触发映射。关于我可能在做错的任何建议吗?我正在使用macvim。


3
如何管理和记住vimrc中的许多缩写?
我有超过500缩写(iabbr,abbr)和从Java,PHP,C / C ++和乳胶我的vimrc文件中的一些映射。 当我一段时间不使用语言时,要立即记住是不容易的。 我想知道我是否可以对缩写名称进行补全。有没有更好的方法来访问/管理所有这些缩写?

3
使用SSH浏览
我知道可以使用它vim scp://host/path/to/file来编辑本地远程文件,然后在保存(:w)时更新远程计算机。但是我想知道是否可以使用ssh浏览目录(或者是否有插件可以这样做) NERDTree不支持它,并且在浏览文件夹时,尽管netrw允许我导航到目录,但无法打开文件。
10 netrw  ssh 

2
安装2.7版时,Gundo插件需要python 2.4
我已经安装了Python 2.7.9。现在,我收到消息,Gundo插件需要2.4。有解决方法吗? 这是我的vimrc文件: set nocompatible " be iMproved, required filetype off " required " set the runtime path to include Vundle and initialize set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() " alternatively, pass a path where Vundle should install plugins "call vundle#begin('~/some/path/here') " let Vundle manage Vundle, required Plugin 'VundleVim/Vundle.vim' Plugin 'tpope/vim-surround' Plugin …

1
选项“ switchbuf”应如何工作?
我最近发现了该选项switchbuf并尝试使用它,但是我不能说我是否不知道它应该如何工作,或者在我的Vim上实际上不起作用。 关于不同的可能值,医生说: useopen(如果包含),跳到 包含指定缓冲区(如果有)的第一个打开的窗口。 usetab 类似于“ useopen”,但也可以考虑其他标签页中的窗口。 然后set switchbuf=useopen,usetab,我在新的vim实例中使用和以下命令: 打开第一个缓冲区 :e file1 分割萤幕 :split 打开第二个缓冲区 :e file2 返回第一个缓冲区:e file1(我也用过:bN) 转到第一个缓冲区的最后一条命令在第二个拆分中将其打开。据我从文档中了解到,命令应该将光标放置到缓冲区已经打开的第一个拆分处useopen。当我使用制表符而不是拆分尝试相同的命令时,行为也相同。 这是预期的行为吗? 如果可以的话,您能否解释一下该选项应该做什么? 如果不是,我知道我必须调试我的设备,.vimrc但是也许已知有一个共同的设置会干扰我switchbuf吗?
10 vimrc  buffers  split 


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.