Vi & Vim

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

6
仅当文件末尾没有行时才如何在其末尾添加行?
我想通过添加一行来就地编辑文件,但前提是尚不存在以使我的脚本防弹。 通常我会做类似的事情: cat >> ~/.bashrc <<EOF export PATH=~/.composer/vendor/bin:\$PATH EOF 也可以通过ansible(line+ insertafter=EOF+ regexp)完成此操作,但这是另一回事了。 在vi / ex中,我可以执行以下操作: ex +'$s@$@\rexport PATH=\~/.composer/vendor/bin:$PATH@' -cwq ~/.bashrc 但是,然后如何在不重复同一行的情况下理想地检查该行是否已经存在(因此什么也不做)? 或者,也许在Ex编辑器中有一些更简单的方法?

1
数字键盘不能与vi和Putty一起使用?
vim通过SSH 编辑文件时,我将尝试使用键盘上的数字键盘输入长号(例如IP地址)。 Vim似乎不太喜欢。我正在使用Windows的PuTTY将SSH SSH到运行Debian的计算机中。 123无论我是否处于插入模式,按都会输入此信息: s r q 当我使用“普通”(不是数字键盘)数字键时,一切正常。这里发生了什么?
10 terminal  putty 

3
是否有类似“不包含前导空白”的动作?
我a"经常在vim中使用该动作。例如,ca"在重构代码时使用,用变量名替换硬编码的参数。这种方法的问题是,a" 如果没有尾随空白,则包括前导空白: 包括任何结尾的空格,除非没有空格,否则包括前导空格。 因此,当我编辑这样的函数调用时: aFunction(arg1, "toBeReplaced", arg3) #original aFunction(arg1, replacedArg, arg3) #refactored 我必须先手动重新插入该空间,然后再将replacedArg其ca"删除。 是否有任何类似的动作不包含此空白,或者还有其他我可以使用的替代方式,ca"使我不必键入多余的空格? 笔记: cf"只要字符串不包含任何转义引号,它就可以执行我想要的操作,但是需要我将光标放在字符串的开头。我想要可以在字符串中的任何地方使用的东西,而且?"<Enter>cf"键入起来很尴尬。 <Space>与其说是一次击键,不如说是我经常起初常常忘记包含空格,这使我花费了至少四次额外的击键(bi<Space><Esc>)并破坏了我的注意力。因此,替换命令的长度并不重要,只要它仅删除给定字符之间的文本然后进入插入模式即可。

1
在功能完成之前,禁止刷新屏幕
我有一个功能,可以将大量文本移动并输出到当前的vim缓冲区中,当我运行它时,看到以盲目速度发生的所有事情让人有些不安。 在功能完成之前,如何冻结屏幕? 这是有问题的功能: function! MakeChoices() :let save_view = winsaveview() let start = line('.') "Locate previous *choice. (b=backwards, W=nowrap, n=doNot move cursor) let choiceStartLine = search('^*choice', 'bW') if !choiceStartLine echo "No *choice found. (*choice must not be indented. This is to avoid finding *choice blocks nested in another *choice block.)" return …
10 vimscript 

1
NERDTree如何打开文件并自动关闭资源管理器缓冲区
使用NERDTree插件时,默认行为是打开一个新文件并保持NERDTree缓冲区打开。我想要做的是保留此默认行为,但也可以在需要时覆盖它,以便打开文件后将关闭NERDTree缓冲区。 我知道let NERDTreeQuitOnOpen=1当我打开新文件时可以用来自动关闭NERDTree缓冲区,但是此选项完全覆盖默认行为(这不是我想要的)。 理想情况下,我想知道NERDTree中是否有内置功能来执行我想要的操作。(我一直在搜索,但没有找到类似的东西,所以我想它实际上不存在) 如果不存在,我有两个想法: 首先是创建一个将设置NERDTreeQuitOnOpen为的功能1,打开文件,然后再次NERDTreeQuitOnOpen将其设置为0。 第二个是创建以下映射:map d<CR> <CR> :NERDTree <CR> :bd<CR>打开文件(第一个<CR>),返回到NERDTree缓冲区(:NERDTree <CR>),然后关闭该缓冲区(:bd <CR>)。我应该改进它,以便映射仅存在于NERDTree缓冲区中,但是我认为这是一个非常丑陋的解决方案,我认为可以对其进行改进。 哪个主意最好,为什么?还是有更好的选择?

4
在命令行中显示当前版本的文件名
如何在命令行中显示当前文件的路径,以键入类似的文件名?我不想用当前文件名代替缩写,我想编辑文件名以及其目录路径。例如,我想要:edit一个具有相似名称或相似目录的文件,例如 vim src/submodule/frontend/frobnicate2.c 现在我要编辑../trunk/src/submodule/frontend/frobnicate.c,而我只想插入../trunk和删除2,而不是重新输入完​​整路径。 我当然可以回到shell并使用其命令历史记录,或者可以通过GUI复制粘贴路径,但是我正在寻找一种不需要离开Vim的更有效的方法。

3
如何在不离开vim的情况下计算文件部分中的单词?
我有一个充满文本的文件(例如Markdown或LaTeX)。我想计算一下该文件一部分中的单词数。 我知道我可以:! wc -w %在当前缓冲区上运行wc -w。而且我知道我可以将感兴趣的部分拖到一个命名寄存器中。我猜想有一种方法可以将命名寄存器发送到操作系统以在命令或管道中使用,但是我一直找不到。还是有更好的方法来计数寄存器中的单词? 我的用例是,我在vim中进行了许多非编程的写作(笔记,论文等),并且我想计算在编辑过程中我给文件的给定部分添加了多少个单词。会议。

2
上下文相关插入模式映射或缩写
我正计划为我的LaTeX插件实现一些实用程序映射,以简化数学的输入。例如,我想创建类似于以下的缩写 `a : \alpha `b : \beta -> : \to => : \Rightarrow 和类似。我希望(某些)映射仅在数学环境内可用,而不在外部可用。 我知道我可以通过语法组(即texMathZoneE和)识别数学环境texMathZoneX。但是,我不知道如何使用它来进行上下文敏感的映射或缩写。

1
将缓冲区内容作为vimscript执行
我有一个nofile包含vimscript 的缓冲区,我想执行它。但是,:so % 由于它需要保存的文件而不是缓冲区,因此将不起作用。默认情况下有vim命令执行此操作吗?如果不是,是否可以创建一个执行相同功能的函数?


4
如何实现选择不同行长的不同文本?
假设我有以下文本: aaa-dd-e:“ aaa”, bb-x:“ bb”, c-9:“ c” 我想做如下选择: aaa-dd-e:“ aaa”, bb-x:“ bb”, c-9:“ c” 我尝试使用cv创建可视块,但是在第一列上创建选择并按“ f:”(我的意思是在上面的每一行上将选择扩展到冒号)之后,我得到的是: aaa-dd-e:“ aaa bb-x”,:“ bb”, c-9:“ c” 选择将在第一个冒号处停止并创建一个矩形。

1
是否可以在rc文件中创建自定义的“ set”命令并从modeline调用它们?
最近我问了一个问题,我知道除了:set在vim模式行中传递参数外,什么都不可能传递。我了解安全问题,但是我想知道是否还没有其他解决方法。关于SO的最近一个有关设置大批参数以符合编码标准的问题使我开始思考-是否可以在rc文件中定义可以通过modeline打开或关闭的一组事物? 请问伪代码,但是有没有办法创建从设置参数触发的函数? set_function! codestyle() if &1 == 'psr-2' set ts=4 set sw=4 endfi if &1 == 'drupal7' set ts=2 set sw=2 iab D8 Drupal 8 endif endset_function 然后,可以由诸如 # vim: codestyle=psr-2 在某些方面,这类似于文件类型匹配,但允许手动覆盖。它还将以其他预定义的方式设置环境,避免了使文件在vim中运行其他任意命令的安全问题,但允许使用更自定义的环境。有没有办法做到这一点?

5
如何打开多个与通配符表达式匹配的文件?
我想编辑几个与全局表达式匹配的文件。例如,要编辑子目录中的所有git config文件,我可以在shell中执行以下操作: vim */.git/config 在Vim :命令行上,我希望:find */.git/config做类似的事情(即,打开所有与glob表达式匹配的文件),但是会抱怨E77: Too many file names。 是否有Vim命令或单行代码可打开多个与通配符/全局表达式匹配的文件(不涉及编写函数)?

3
像Ctrl-A和Ctrl-X一样,但仅修改第一位
有没有一种方法可以增加/减少光标之后/下方的第一个数字,而不是整数。 我知道这不是vim的工作原理,但是有没有可以做到这一点的插件?我找不到它。 在编辑CSS或其他情况下,它非常有用。 鉴于: ▐margin: 10px 当我按时,CTRL-A我想看到: ▐margin: 20px 实际: ▐margin: 11px

2
如何使ctrlp更好地匹配文件名?
我的项目有以下文件: $ find . -type f -and -name 'peop*' ./app/assets/stylesheets/admin/sections/people.css.sass ./app/controllers/admin/people_controller.rb 当我厌倦了打字时:e app/assets/stylesheets/admin/sections/people.css.sass,我认为ctrlp可能是保存某些打字的好方法。但是,我无法以一种我认为理智的方式来匹配文件。 首先,我使用<C-p>和键入peop,这给了我这些结果(“第一”匹配在底部): > app/models/attribute_group.rb > app/models/contract_template.rb > app/policies/contract_policy.rb > app/uploaders/photo_uploader.rb > app/policies/invoice_policy.rb > app/views/layouts/pdf.pdf.haml > app/uploaders/logo_uploader.rb > app/models/property_object.rb > app/policies/person_policy.rb > app/policies/photo_policy.rb >>> peop_ 这些结果是可怕的。peop它们中都没有文件。即使我将其扩展为people: > app/policies/contract_template_policy.rb > app/models/concerns/exportable.rb > app/models/contract_template.rb > app/uploaders/photo_uploader.rb > app/uploaders/logo_uploader.rb > app/views/admin/people/_show.html.haml > …

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.