vim - 关闭 Limp 中的突出显示功能

标签 vim lisp common-lisp

我在我的 VIM 中使用 Limp。但是有一个问题,当光标移动到一个“(”或“)”时,它会突出显示这对代码块。我看不清代码。有什么办法可以关闭或删除这个功能吗?

最好的问候,

最佳答案

我也在使用 Limp,但我对其进行了一些修改以更好地满足我的口味。

limp主文件夹里面有一个vim子文件夹,打开文件limp.vim,最后可以看到几个runtime命令,只需注释掉加载 highlight.vim 文件的命令:

"runtime ftplugin/lisp/limp/highlight.vim

我也喜欢禁用 autoclose.vim 插件,我觉得它很烦人。

"runtime ftplugin/lisp/limp/autoclose.vim

然后,打开文件 mode.vim,在第 58 行左右可以看到初始化高亮模式的函数调用;注释掉:

"call LimpHighlight_start()

然后在第 68 行附近,在函数 LimpMode_stop() 下,您还需要注释停止突出显示的调用。

"call LimpHighlight_stop()

当然,如果您还禁用了 autoclose.vim 插件,您还必须注释启动/停止它的调用。

烦人的颜色

如果 Limp 设置的开箱即用的颜色让你感到厌烦,就像他们对我所做的那样,你可以禁用它并继续使用你的默认颜色方案;大约第 30 行:

"set t_Co=256
"if !exists("g:colors_name")
    "colorscheme desertEx
"endif

并更改高亮组以匹配您的配色方案(使用 :high 快速查看颜色组合列表)。例如,我使用 "desertEx" 颜色方案并更改了这两行以匹配它:

hi BracketsBlock ctermbg=235 guibg=grey22
hi StatusLine    ctermbg=black ctermfg=160

其他选项

我不喜欢 Limp 设置的选项集,尤其是旧的 Vi Lisp 缩进。我也不喜欢折叠,所以我也禁用了它。我当前的选项集如下所示:

syntax on
setlocal nocompatible nocursorline
setlocal lisp syntax=lisp
setlocal ls=2 bs=2 et sw=2 ts=2 "tw=0 
setlocal statusline=%<%f\ \(%{LimpBridge_connection_status()}\)\ %h%m%r%=%-14.(%l,%c%V%)\ %P
"setlocal iskeyword=&,*,+,45,/,48-57,:,<,=,>,@,A-Z,a-z,_
"setlocal cpoptions=-mp
"setlocal foldmethod=marker foldmarker=(,) foldminlines=1
setlocal foldcolumn=0

set lispwords+=defgeneric,block,catch,with-gensyms

"-----------
"Taken from the bundled lisp.vim file in VIM
"(/usr/share/vim/vim72/ftplugin/lisp.vim)
setl comments=:;
setl define=^\\s*(def\\k*
setl formatoptions-=t
setl iskeyword+=+,-,*,/,%,<,=,>,:,$,?,!,@-@,94
setl comments^=:;;;,:;;,sr:#\|,mb:\|,ex:\|#
setl formatoptions+=croql
"-----------

" This allows gf and :find to work. Fix path to your needs
setlocal suffixesadd=.lisp,.cl path+=/home/gajon/Lisp/**

注意我禁用了 tw=0,修改了 statusline,禁用了折叠,复制了 Vim 捆绑的选项(它们好多了),添加了一些lispwords 的符号,并向 suffixesadd 添加了一个缺失的点(cl 扩展缺失了一个点)。

禁用 sexp 的转置。

Limp 将它们的键 {} 绑定(bind)到将当前 sexp 与上一个/下一个 sexp 调换的函数。但是它们不能可靠地工作,我认为当您可以在适当的地方轻松使用 dabp 时,它们是不必要的。除了默认的 Vim {} 绑定(bind)对于移动到其他顶级表单非常有用。

在文件 keys.vim 中:

"nmap <buffer> {                    <Plug>SexpMoveBack
"nmap <buffer> }                    <Plug>SexpMoveForward

连接到正在运行的 REPL 时出现错误

有一个错误会阻止 Limp 重新连接到已经运行的 REPL。在 vim 子文件夹内的文件 bridge.vim 中,大约第 13 行:

let cmd = s:Limp_location . "/bin/lisp.sh ".core_opt." -s ".styfile." -b ".name

".core_opt."-s 之间缺少一个空格。

额外的好东西!

您应该能够弄清楚如何使用这些新映射。

在文件 bridge.vim 的第 265 行之后添加以下行:

nnoremap <silent> <buffer> <Plug>EvalUndefine   :call LimpBridge_send_to_lisp("(fmakunbound '".expand("<cword>").")")<CR>
nnoremap <silent> <buffer> <Plug>EvalAddWord    :let &lispwords.=',' . expand("<cword>")<cr>

nnoremap <silent> <buffer> <Plug>DebugTrace         :call LimpBridge_send_to_lisp("(trace ".expand("<cword>").")")<CR>
nnoremap <silent> <buffer> <Plug>DebugUnTrace       :call LimpBridge_send_to_lisp("(untrace ".expand("<cword>").")")<CR>
nnoremap <silent> <buffer> <Plug>DebugInspectObject :call LimpBridge_inspect_expression()<CR>
nnoremap <silent> <buffer> <Plug>DebugInspectLast   :call LimpBridge_send_to_lisp("(inspect *)")<CR>
nnoremap <silent> <buffer> <Plug>DebugDisassemble   :call LimpBridge_send_to_lisp("(disassemble #'".expand("<cword>").")")<CR>
nnoremap <silent> <buffer> <Plug>DebugMacroExpand   :call LimpBridge_macroexpand_current_form( "macroexpand" )<CR>
nnoremap <silent> <buffer> <Plug>DebugMacroExpand1  :call LimpBridge_macroexpand_current_form( "macroexpand-1" )<CR>

nnoremap <silent> <buffer> <Plug>ProfileSet      :call LimpBridge_send_to_lisp("(sb-profile:profile ".expand("<cword>").")")<CR>
nnoremap <silent> <buffer> <Plug>ProfileUnSet    :call LimpBridge_send_to_lisp("(sb-profile:unprofile ".expand("<cword>").")")<CR>
nnoremap <silent> <buffer> <Plug>ProfileShow     :call LimpBridge_send_to_lisp("(sb-profile:profile)")<CR>
nnoremap <silent> <buffer> <Plug>ProfileUnSetAll :call LimpBridge_send_to_lisp("(sb-profile:unprofile)")<CR>
nnoremap <silent> <buffer> <Plug>ProfileReport   :call LimpBridge_send_to_lisp("(sb-profile:report)")<CR>
nnoremap <silent> <buffer> <Plug>ProfileReset    :call LimpBridge_send_to_lisp("(sb-profile:reset)")<CR>

最后添加这两个函数:

function! LimpBridge_inspect_expression()
  let whatwhat = input("Inspect: ")
  call LimpBridge_send_to_lisp( "(inspect " . whatwhat . ")" )
endfun

function! LimpBridge_macroexpand_current_form(command)
  " save position
  let pos = LimpBridge_get_pos()

  " find & yank current s-exp
  normal! [(
  let sexp = LimpBridge_yank( "%" )
  call LimpBridge_send_to_lisp( "(" . a:command . " '" . sexp . ")" )
  call LimpBridge_goto_pos( pos )
endfunction

然后在文件 keys.vim 中添加以下映射:

" Undefine: Undefine a function or macro.
nmap <buffer> <LocalLeader>eu      <Plug>EvalUndefine

" Add Word: Append word to 'lispwords' option
nmap <buffer> <LocalLeader>ea      <Plug>EvalAddWord

" Trace: Set tracing for function.
" Untrace: Remove tracing for a function.
nmap <buffer> <LocalLeader>dt      <Plug>DebugTrace
nmap <buffer> <LocalLeader>du      <Plug>DebugUnTrace

" Inspect: Inspect object
" InspectPrev: Inspect last value evaled.
nmap <buffer> <LocalLeader>di      <Plug>DebugInspectObject
nmap <buffer> <LocalLeader>dI      <Plug>DebugInspectLast

" Disassemble:
nmap <buffer> <LocalLeader>dd      <Plug>DebugDisassemble

" Macroexpand:
" Macroexpand1:
nmap <buffer> <LocalLeader>ma      <Plug>DebugMacroExpand
nmap <buffer> <LocalLeader>m1      <Plug>DebugMacroExpand1

" Profile: Set profiling.
" Unprofile: Remove profiling.
nmap <buffer> <LocalLeader>pr      <Plug>ProfileSet
nmap <buffer> <LocalLeader>pu      <Plug>ProfileUnSet

" Show Profiling: Show profiling.
" Unprofile All: Remove all profiling.
nmap <buffer> <LocalLeader>pp      <Plug>ProfileShow
nmap <buffer> <LocalLeader>pa      <Plug>ProfileUnSetAll

" Profile Report: Show report.
" Profile Reset: Reset profile data.
nmap <buffer> <LocalLeader>ps      <Plug>ProfileReport
nmap <buffer> <LocalLeader>p-      <Plug>ProfileReset

" Sexp Close Open Parenthesis:
nmap <buffer> <LocalLeader>cp      <Plug>SexpCloseParenthesis
imap <buffer> <C-X>0               <C-O><LocalLeader>cp

然后在文件 sexp.vim 中添加这个映射:

" Sexp Close Open Parenthesis:
nnoremap <silent> <buffer> <Plug>SexpCloseParenthesis  :call SlimvCloseForm()<CR>

还有这两个函数:

"-------------------------------------------------------------------
" Close open parenthesis
" Taken from the Slimv plugin by Tamas Kovacs. Released in the
" public domain by the original author.
"-------------------------------------------------------------------

" Count the opening and closing parens or brackets to determine if they match
function! s:GetParenCount( lines )
    let paren = 0
    let inside_string = 0
    let i = 0
    while i < len( a:lines )
        let inside_comment = 0
        let j = 0
        while j < len( a:lines[i] )
            if inside_string
                " We are inside a string, skip parens, wait for closing '"'
                if a:lines[i][j] == '"'
                    let inside_string = 0
                endif
            elseif inside_comment
                " We are inside a comment, skip parens, wait for end of line
            else
                " We are outside of strings and comments, now we shall count parens
                if a:lines[i][j] == '"'
                    let inside_string = 1
                endif
                if a:lines[i][j] == ';'
                    let inside_comment = 1
                endif
                if a:lines[i][j] == '(' || a:lines[i][j] == '['
                    let paren = paren + 1
                endif
                if a:lines[i][j] == ')' || a:lines[i][j] == ']'
                    let paren = paren - 1
                    if paren < 0
                        " Oops, too many closing parens in the middle
                        return paren
                    endif
                endif
            endif
            let j = j + 1
        endwhile
        let i = i + 1
    endwhile
    return paren
endfunction

" Close current top level form by adding the missing parens
function! SlimvCloseForm()
    let l2 = line( '.' )
    normal 99[(
    let l1 = line( '.' )
    let form = []
    let l = l1
    while l <= l2
        call add( form, getline( l ) )
        let l = l + 1
    endwhile
    let paren = s:GetParenCount( form )
    if paren > 0
        " Add missing parens
        let lastline = getline( l2 )
        while paren > 0
            let lastline = lastline . ')'
            let paren = paren - 1
        endwhile
        call setline( l2, lastline )
    endif
    normal %
endfunction

希望这可以帮助您更好地使用 Limp。

关于vim - 关闭 Limp 中的突出显示功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2545893/

相关文章:

list - 在 lisp 中组合两个列表以输出某些项目

ruby - vim自动缩进Ruby中没有分号的行

vim - vim 有没有办法显示当前缓冲区行中的所有列号?

return - 如何在 common lisp 中返回最后一个值

scheme - 从函数返回函数的目的是什么?

macros - 从 Quicklisp 包内的宏调用函数

vim - 如何移动到 gVim(或任何其他文本编辑工具)中具有相同缩进的行?

vim - 有关.vimrc和vim配置的一些问题

cLISP 中的列表操作

Lisp - 函数的函数调用接收的参数太少?