小编Sau*_*ier的帖子

检查是否在vim插件中设置全局插件变量的优雅方法

在过去的几年里,我曾经使用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()方法?

vim settings plugins global-variables macvim

24
推荐指数
2
解决办法
1万
查看次数

从linux中的函数中分配局部变量bash一个新值

我有一个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变量MYVAR1myfunctiona一个新值时,我是否必须编写

local MYVAR1=$MYVAR1$MYVAR2
Run Code Online (Sandbox Code Playgroud)

或者我也可以写

MYVAR1=$MYVAR1$MYVAR2
Run Code Online (Sandbox Code Playgroud)

如果没有"本地"的第二行,我是否创建了一个具有相同名称的全局变量?

bash scope function global-variables

15
推荐指数
2
解决办法
8029
查看次数

在MacVim中禁用铃声

我知道这个话题已被多次询问.但我似乎无法在MacVim中禁用声学铃声.我的.vimrc中有什么:

set noerrorbells 
set novisualbell
set t_vb=
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

vim notifications macvim

13
推荐指数
1
解决办法
4235
查看次数

当vim进入可视模式时运行命令

我使用一个小脚本来触发插入模式,以便更改行号颜色:

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)

vim triggers

8
推荐指数
2
解决办法
2836
查看次数

当光标线突出显示一条线时,设置列表框的可见性和/或颜色或在vim中隐藏cchar

我知道我可以使用set list listchars=...来显示NonTextSpecialKey字符,以突出显示不同类型的非文本字符.总的来说,这是直截了当的.但是它有一个视觉副作用会让我感到不安 - 当光标线设置为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)

因此,无论我目前处于何种模式,它都会突出显示所有空间.但同样会产生令人不安的副作用 - 当我在视觉模式中标记线条或用我的光标线突出显示一条线条时,突出显示区域会在隐藏的地方被中断找到字符.只需看截图:

选定区域的可视模式:

Vim在视觉模式下隐藏了角色

带光标的普通模式:

Vim使用光标线在正常模式下隐藏字符

所以我想我们试试吧set concealcursor=ic.这会导致突出显示区域不间断,但会隐藏字符.

在此输入图像描述

那么是否有一个地方,并在某种程度上解决了我在本文开头提到的线程,或者有什么方法可以在使用时使光标和视觉选择区域不间断set concealcursor=nvic

vim vim-syntax-highlighting

8
推荐指数
1
解决办法
1878
查看次数

将行尾 (EOL) 与 vim 中的语法匹配相匹配

当我输入/vim 并搜索它时,$它会突出显示所有 eol。但是当我尝试将它们与syntax match它似乎不起作用。

\n\n
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但这有一些视觉副作用但我认为

\n

regex vim eol match end-of-line

5
推荐指数
1
解决办法
1757
查看次数

在Jade中调用mixin时,"+"和mixin关键字之间有什么区别?

文档告诉我们通过将关键字添加mixin到实际的mixin 来调用mixin.

.bar
    mixin foo(arguments)
Run Code Online (Sandbox Code Playgroud)

但是在不同的地方,我看到人们通过添加一个加号(+)来调用mixin,例如:

.bar
    +foo(arguments)
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下差异,因为文档似乎没有显示出来.我尝试了两个例子,两者似乎都有用.

是否+只是一个速记?

templating keyword mixins node.js pug

5
推荐指数
1
解决办法
1522
查看次数

将内容分配给mixin中的多个块,它在Jade中动态生成嵌套的HTML结构?

我想创建以下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ìnnermixin,使用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)

code-generation templating mixins node.js pug

5
推荐指数
1
解决办法
751
查看次数

Vim 状态行不会从表达式扩展颜色/突出显示组

我写了一个返回字符串的函数:

\n\n
function! 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()

\n\n
%#HighlightGroup#SomeData\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我使用该函数作为状态行内的表达式时,我希望highlight group展开该函数以便为适当的状态行部分着色:

\n\n
set statusline =%{StatusBricks()}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我得到的是状态栏字面显示%#HighlightGroup#ExpandedData而不是ExpandedData

\n\n

vim statusline 高亮组扩展

\n\n

我究竟做错了什么?

\n

vim colors highlight expansion statusline

5
推荐指数
1
解决办法
648
查看次数

Vim中的代码折叠/缩进指南?

在研究有用的vim插件的过程中,我发现了vim窗口的屏幕截图,其中显示了一些虚线的指南,突出显示了缩进或折叠。我不确定他们实际上强调了什么。

有谁知道哪个插件生成这些指南以及它们的用途是什么?

您可以在此处找到屏幕截图:http : //oi54.tinypic.com/2yysefm.jpg

vim highlight

3
推荐指数
1
解决办法
5355
查看次数

在"VimLeave"上重置或设置光标形状

我在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"的事件.但我不知道我可以通过什么作为逃脱序列.

vim shape cursor

2
推荐指数
1
解决办法
1429
查看次数

追踪双键绑定/冲突键

我试图在插入模式下将 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不显示映射到选项卡的任何其他内容。

如何找到冲突的键绑定?

vim conflict keymapping key-bindings

2
推荐指数
1
解决办法
2228
查看次数

从 Swift 中的枚举返回随机情况

我刚刚编写了一个生成 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)

enums ios swift

0
推荐指数
1
解决办法
772
查看次数