在过去的几年里,我曾经使用vim来编辑远程服务器上的配置和脚本.几个星期前,我决定采取下一步,尝试使用(Mac)vim作为我的常规编辑器,除了Sublime Text 2.现在我达到了我想创建我的第一个插件的地步.
我的插件将定义~16个全局变量,可以由用户分配以调整插件的某些属性.我问自己,检查用户是否已将自己的值分配给某个变量,最优雅的方式(可能是主观的)是什么.我检查了各种其他插件,到目前为止我看到的"模式"似乎总是:
if !exists("g:pluginname_setting")
let g:pluginname_setting="default"
endif
Run Code Online (Sandbox Code Playgroud)
这似乎很简单直接.但我会一遍又一遍地重复同一段代码.由于vi(m)存在了相当长的时间,我很确定人们已经尝试了很多方法来编写插件,并且已经开发了某种"最佳实践",我认为这是我上面给出的"模式"举个例子.然而,调用一个函数来填充包含所有插件设置的字典,然后迭代字典以检查密钥以查看用户是否已经定义了他的个人偏好,这不是更优雅吗?这是一个好主意还是我应该放弃这个想法并坚持这个ìf !exists()
方法?
我有一个linux bash
带有函数的脚本:
myfunctiona ()
{
local MYVAR1="one"
local MYVAR2="two"
echo $MYVAR1
# The line beneath is the line in question!
local MYVAR1=$MYVAR1$MYVAR2
}
Run Code Online (Sandbox Code Playgroud)
当我想给函数中的LOCAL
变量MYVAR1
赋myfunctiona
一个新值时,我是否必须编写
local MYVAR1=$MYVAR1$MYVAR2
Run Code Online (Sandbox Code Playgroud)
或者我也可以写
MYVAR1=$MYVAR1$MYVAR2
Run Code Online (Sandbox Code Playgroud)
如果没有"本地"的第二行,我是否创建了一个具有相同名称的全局变量?
我知道这个话题已被多次询问.但我似乎无法在MacVim中禁用声学铃声.我的.vimrc中有什么:
set noerrorbells
set novisualbell
set t_vb=
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
我使用一个小脚本来触发插入模式,以便更改行号颜色:
function! CursorLineNrColorInsert(mode)
" Insert mode: blue
if a:mode == "i"
highlight CursorLineNr ctermfg=4
highlight CursorLineNr guifg=#268bd2
" Replace mode: red
elseif a:mode == "r"
highlight CursorLineNr ctermfg=1
highlight CursorLineNr guifg=#dc322f
else
highlight CursorLineNr ctermfg=0
highlight CursorLineNr guifg=#073642
endif
endfunction
autocmd InsertEnter * call CursorLineNrColorInsert(v:insertmode)
autocmd InsertLeave * highlight CursorLineNr ctermfg=0
autocmd InsertLeave * highlight CursorLineNr guifg=#073642
Run Code Online (Sandbox Code Playgroud)
当我进入任何插入模式并在正常模式下恢复为原始颜色时,这非常正常并且会立即更改我的行号.
我想对视觉模式做同样的事情:
function! CursorLineNrColorVisual(mode)
" Visual mode: orange
if mode()=~#"^[vV\<C-v>]"
highlight CursorLineNr ctermfg=9
highlight CursorLineNr guifg=#cb4b16
else
highlight CursorLineNr ctermfg=0
highlight …
Run Code Online (Sandbox Code Playgroud) 我知道我可以使用set list listchars=...
来显示NonText
和SpecialKey
字符,以突出显示不同类型的非文本字符.总的来说,这是直截了当的.但是它有一个视觉副作用会让我感到不安 - 当光标线设置为on时,将光标"悬停"在一条线上listchars
会以不同的颜色突出显示.这个问题已经在这个线程中提到过,似乎没有一个解决方案可以解决这个问题.
作为一个结果,我开始玩隐藏功能,这给了我不一样的结果.set concealcursor=n||v||i||c
让我控制隐藏字符可见的模式.我希望能够看到隐藏的字符,所以我设置了以下内容:
function! ConcealNonText()
set conceallevel=1
set concealcursor=nvic
syntax match NonText / / conceal cchar=·
endfunction
augroup ConcealNonText
autocmd!
autocmd VimEnter * call ConcealNonText()
augroup END
Run Code Online (Sandbox Code Playgroud)
因此,无论我目前处于何种模式,它都会突出显示所有空间.但同样会产生令人不安的副作用 - 当我在视觉模式中标记线条或用我的光标线突出显示一条线条时,突出显示区域会在隐藏的地方被中断找到字符.只需看截图:
选定区域的可视模式:
带光标的普通模式:
所以我想我们试试吧set concealcursor=ic
.这会导致突出显示区域不间断,但会隐藏字符.
那么是否有一个地方,并在某种程度上解决了我在本文开头提到的线程,或者有什么方法可以在使用时使光标和视觉选择区域不间断set concealcursor=nvic
?
当我输入/
vim 并搜索它时,$
它会突出显示所有 eol。但是当我尝试将它们与syntax match
它似乎不起作用。
function! ConcealNonText()\n set conceallevel=1\n set concealcursor=v\n syntax match NonText /$/ conceal cchar=\xc2\xb6\nendfunction\n\naugroup ConcealNonText\n autocmd!\n autocmd VimEnter * call ConcealNonText()\naugroup END\n
Run Code Online (Sandbox Code Playgroud)\n\n有什么提示我可以匹配它以便将 eol 显示为隐藏字符吗?\n我知道我可以使用,set list listchars
但这有一些视觉副作用但我认为
该文档告诉我们通过将关键字添加mixin
到实际的mixin 来调用mixin.
.bar
mixin foo(arguments)
Run Code Online (Sandbox Code Playgroud)
但是在不同的地方,我看到人们通过添加一个加号(+)来调用mixin,例如:
.bar
+foo(arguments)
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下差异,因为文档似乎没有显示出来.我尝试了两个例子,两者似乎都有用.
是否+
只是一个速记?
我想创建以下HTML结构
<div class="outerspace">
<div class="inner1"><p>Inner1 content</p></div>
<div class="inner2"><p>Inner2 content</p></div>
<div class="inner3"><p>Inner3 content</p></div>
(...)
</div>
Run Code Online (Sandbox Code Playgroud)
而内在的数量divs
可能会有所不同.
例1:
我可以创建两个mixin - an òuterspace
和ìnner
mixin,使用block
关键字嵌套它们,并为每个内部div元素放置不同的内容:
mixin outerspace()
div.outerspace
block
mixin inner($number)
div(class="inner" + $number)
block
//- call the mixins
+outerspace()
+inner(1)
p Inner1 content
+inner(2)
p Inner3 content
+inner(3)
p Inner3 content
...
Run Code Online (Sandbox Code Playgroud)
例2:
此示例尝试使用单个mixin执行相同操作:
mixin nested_structure($number)
div.outerspace
each item in $number
div(class="inner" + item)
block
//- call the mixin
+nested_structure([1, 2, 3])
p Inner content
Run Code Online (Sandbox Code Playgroud)
这导致与上述相同的结构,但为每个生成的块分配相同的内容:
<div …
Run Code Online (Sandbox Code Playgroud) 我写了一个返回字符串的函数:
\n\nfunction! StatusBricks()\n let l:stat = Brick(statusbricks#ReportLinecount(\'raw\'), {\n \\ \'brick_color\': \'LineNr\',\n \\ \'delimiter_position\': \'right\',\n \\ \'delimiter_right\': \'\xe2\x9d\xaf\'\n \\ })\n return l:stat\nendfunction\n
Run Code Online (Sandbox Code Playgroud)\n\n结果具有以下格式,由 生成Brick()
:
%#HighlightGroup#SomeData\n
Run Code Online (Sandbox Code Playgroud)\n\n当我使用该函数作为状态行内的表达式时,我希望highlight group
展开该函数以便为适当的状态行部分着色:
set statusline =%{StatusBricks()}\n
Run Code Online (Sandbox Code Playgroud)\n\n但我得到的是状态栏字面显示%#HighlightGroup#ExpandedData
而不是ExpandedData
:
我究竟做错了什么?
\n在研究有用的vim插件的过程中,我发现了vim窗口的屏幕截图,其中显示了一些虚线的指南,突出显示了缩进或折叠。我不确定他们实际上强调了什么。
有谁知道哪个插件生成这些指南以及它们的用途是什么?
您可以在此处找到屏幕截图:http : //oi54.tinypic.com/2yysefm.jpg
我在OS X 10.7.5上使用iTerm2(Build 1.0.0.20130319)和Vim(MacVim Snapshot 66的bin)作为我的CLI编辑团队.
在iTerm2中,我定义使用非闪烁垂直条作为光标形状.在Vim中我定义了
" Enter insert mode (Cursor shape: vertical bar)
let &t_SI = "\<Esc>]50;CursorShape=1\x7"
" Leave insert mode (Cursor shape: block)
let &t_EI = "\<Esc>]50;CursorShape=0\x7"
Run Code Online (Sandbox Code Playgroud)
能够区分插入和正常模式.基本上这很好用.当我离开Vim并返回CLI时出现问题.会发生什么是光标不会返回其初始形状(垂直条).相反,它决定保持块状.
我可以将光标重置为初始形状或强制它返回垂直条形图吗?我可以想象触发一个例如"VimLeave"的事件.但我不知道我可以通过什么作为逃脱序列.
我试图在插入模式下将 Shift-Tab 映射到不缩进的行。在各种映射中,这是我最喜欢的:
inoremap <silent> <S-Tab> <C-d>
Run Code Online (Sandbox Code Playgroud)
但无论我使用什么映射,Vim 都拒绝取消行缩进。相反,它像普通制表符一样缩进该行。但是,一旦我重新获取 .vimrc 的源,映射就开始按预期工作。为了避免在 .vimrc 中的某处将键绑定映射两次,我将映射添加到空白的 .vimrc 中。令人惊讶的是它有效。
与 Tab 键相关的其他映射有:
nnoremap <silent> <Tab> :bnext<Cr>
nnoremap <silent> <S-Tab> :bprevious<Cr>
Run Code Online (Sandbox Code Playgroud)
ag/grep
不显示映射到选项卡的任何其他内容。
如何找到冲突的键绑定?
我刚刚编写了一个生成 0...2 范围内的随机整数的函数。目标是根据随机整数从枚举返回随机情况。
我想更喜欢使用 case 语句,但我不喜欢返回任意枚举的默认情况。忽略默认情况是行不通的,因为交换机无法知道会发生多少情况。即使默认情况永远不会发生,我也不认为这是一个干净的解决方案。
您更喜欢哪种解决方案被认为是最干净的解决方案 - 请详细说明。是否有更好/更优雅的方法从枚举返回随机情况?
如果-否则解决方案:
func generateRandomSign() -> Sign {
let randomSelection = Int.random(in: 0...2)
if randomSelection == 0 {
return .rock
} else if randomSelection == 1 {
return .paper
}
return .scissor
}
Run Code Online (Sandbox Code Playgroud)
开关解决方案:
func generateRandomSign() -> Sign {
let randomSelection = Int.random(in: 0...2)
switch randomSelection {
case 0: return .rock
case 1: return .paper
case 2: return .scissor
default: return .rock
}
}
Run Code Online (Sandbox Code Playgroud) vim ×9
highlight ×2
macvim ×2
mixins ×2
node.js ×2
pug ×2
templating ×2
bash ×1
colors ×1
conflict ×1
cursor ×1
end-of-line ×1
enums ×1
eol ×1
expansion ×1
function ×1
ios ×1
key-bindings ×1
keymapping ×1
keyword ×1
match ×1
plugins ×1
regex ×1
scope ×1
settings ×1
shape ×1
statusline ×1
swift ×1
triggers ×1