当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 21 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : vim中如何在“=”、“==”两侧自动加空格及“:wq”的大小写通吃?[已解决]
帖子发表于 : 2012-12-06 20:08 
头像

注册: 2012-06-06 18:20
帖子: 582
送出感谢: 4
接收感谢: 11
最近折腾的东西比较多,一会儿给装系统改配置,一会儿写html,一会儿写C,渐渐感觉原来的配置、插件不够用了。
今天给vim来了个大换血,效果还不错。好吧,不多废话,具体内容待会儿写在那半成品的博客里。

一、
    就是觉得不少语言里都推荐在“=”及“==”两侧加上空格以增强可读性,这个该如何实现自动呢?
    其实倒不是完全实现不了,只是感觉实现的时候光标跳动有点冲,希望大大们给个更好的建议。 :em03

二、
    下一个就是完全的手误。最近老是按“:”的时候<Shift>松的有些迟顿(难倒是冬天到了,手抖?)。希望大大们给个方法,让vim能够“:wq”、“:Wq”、“:WQ”及“:q!”、“:Q!”通吃 :em06


解决方案:
一、(1)全自动方案<语法太多,难免有不合适的地方>
代码:
autocmd FileType * call g:compileByFileType()
func! g:compileByFileType()
   if &filetype=="c"
      if (filereadable("Makefile")||filereadable("makefile"))
      else
         set makeprg=gcc\ %\ -Wall\ -std=c99\ -lm\ -g\ -o\ %<
      endif
      inoremap / <c-r>=EqualSign('/')<CR>
      inoremap = <c-r>=EqualSign('=')<CR>
      inoremap < <c-r>=EqualSign('<')<CR>
      inoremap - <c-r>=EqualSign('-')<CR>
      inoremap > <c-r>=EqualSign('>')<CR>
      inoremap + <c-r>=EqualSign('+')<CR>
   elseif &filetype == "html"
      inoremap ; ;<space>
     elseif &filetype=="vim"
      inoremap < <><left>
   endif
endfunction

"设置= + -  前后自动空格

function! EqualSign(char)
   if a:char  =~ '='  && getline('.') =~ ".*("
      return a:char
   endif
   let ex1 = getline('.')[col('.') - 3]
   let ex2 = getline('.')[col('.') - 2]

   if ex1 =~ "[-=+><>\/\*]"
      if ex2 !~ "[\<TAB>\<space>]"
         return "\<ESC>i".a:char."1\<SPACE>"
      elseif ex1 =~ a:char && a:char =~ "[-+]"
         return "\<ESC>xxxa".a:char.a:char
      else
         return "\<ESC>xa".a:char."2\<SPACE>"
      endif
   else
      if ex2 !~ "[\<TAB>\<space>]"
         return "\<SPACE>".a:char."\<SPACE>\<ESC>a"
      else
         return a:char."\<SPACE>\<ESC>a"
      endif
   endif
endf


(2)半自动手控方案<原创>
符号右边按下<SPACE>则符号左右两边一起加空格
暂未解决三个及以上符号连在一起的情况,人分析都吃力让代码来做压力较大
新版本,可增加了订制性、可扩展性
代码:
 1 """空格自动化
 2 let g:space1 = ['+', '-', '*', '/', '%', '^', '<', '>', '=']
 3 let g:space2 = [":=", "==", "!=", "<<", ">>", ">=", "<=", "+=", "-=", "/*=" ,"/=", "^=", "&&", "||"]
 4 ""let g:space2 = [":=", "==", "!=", "=/~", "!/~", "<<", ">>", ">=", "<=", "+=", "-=", "/*=" ,"/=", "^=", "&&", "||"]
 5 """空格自动化
 6 inoremap <space> <c-r>=SmartSpace()<CR>
 7 function! SmartSpace()
 8     ""取上一行光标附近词a:char
 9     for key in g:space2
10         echo key
11     endfor
12     let a:char = ''
13     let a:prechar=' '
14     let a:lastchar=''
15     for key in range(-8, 6)
16         let a:char = a:char.getline(line('.')-1)[col('.') + key]
17     endfor
18     ""判断a:char是否含有单个符号
19     for key in g:space1
20         if -1 != match(a:char, '\t'.key.' ')
21             let a:prechar = '   '
22             let a:lastchar = ' '
23         elseif -1 != match(a:char, ' '.key.' ')
24             let a:prechar = ' '
25             let a:lastchar = ''
26         endif
27     endfor
28     ""判断a:char是否含有两个连续符号
29     for key in g:space2
30         if -1 != match(a:char, '    '.key.' ') && 0 != match(a:char, '  '.key.' ')
31             let a:prechar = '   '
32             let a:lastchar = ' '
33         elseif -1 != match(a:char, ' '.key)
34             let a:prechar = ' '
35             let a:lastchar = ' '
36         endif
37     endfor
38     ""当前行两个连续符号
39     let a:char = getline('.')[col('.')-3].getline('.')[col('.')-2]
40     for key in g:space2
41         if a:char == key
42             if "[ \t]" !~ getline('.')[col('.')-4]
43                 return "\<left>\<left>".a:prechar."\<right>\<right> "
44             else
45                 return " "
46             endif
47         endif
48     endfor
49     ""当前行一个符号
50     let a:char = getline('.')[col('.')-2]
51     for key in g:space1
52         if a:char == key
53             if "[ \t]" !~ getline('.')[col('.')-3]
54                 return "\<left>".a:prechar."\<right> ".a:lastchar
55             elseif '    ' =~ getline('.')[col('.')-3]
56                 return "  "
57             endif
58         endif
59     endfor
60     return " "
61 endfunction


旧版本暂留
代码:
:inoremap <space> <c-r>=AutoSpace()<CR>
:cnoremap <space> <c-r>=AutoSpace()<CR>
function! AutoSpace()
   if getline('.')[col('.') - 2] !~ "[-=+<~>\/\*|&]"
      return "\<space>"
   else
      if getline('.')[col('.') - 3] == "\<space>"
         return "\<space>"
      elseif getline('.')[col('.') - 3] !~ "[-=+<>\/\*!|&]"
         return "\<left>\<space>\<right>\<space>"
      else
         if getline('.')[col('.') - 4] == "\<space>"
            return "\<space>"
         else
            return "\<left>\<left>\<space>\<right>\<right>\<space>"
         endif
      endif
   endif
endfunction



二、在.vimrc中添加
代码:
"预防手误的杀招
nnoremap : :
cnoremap Q! q!
command Wq wq
command Q q
command WQ wq


特在此感谢楼下各位热情解答,特别感谢2、5、6 楼以及 IRC #ubuntu-cn频道的数位!


_________________
Vimwiki建的小博客 wweir.org

历史的车轮压过一切,任何人或事物都留在了车辙里,只有思想和智慧或附在车辄上走上那么一段时间


最后由 温习江湖 编辑于 2013-04-05 19:03,总共编辑了 9 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: vim中如何在“=”、“==”两侧自动加空格及“:wq”的大小写通吃?
帖子发表于 : 2012-12-06 22:27 
头像

注册: 2008-12-28 16:01
帖子: 728
送出感谢: 2
接收感谢: 15
第一个手动加吧,自动加容易有麻烦。

第二个
代码:
command Wq wq


_________________
爱因斯坦会弹钢琴
爱因斯坦会拉小提琴
爱因斯坦会骑自行车


页首
 用户资料  
 
3 楼 
 文章标题 : Re: vim中如何在“=”、“==”两侧自动加空格及“:wq”的大小写通吃?
帖子发表于 : 2012-12-06 22:54 

注册: 2009-05-29 22:05
帖子: 151
送出感谢: 0 次
接收感谢: 0 次
ctrl +s


页首
 用户资料  
 
4 楼 
 文章标题 : Re: vim中如何在“=”、“==”两侧自动加空格及“:wq”的大小写通吃?
帖子发表于 : 2012-12-07 9:09 

注册: 2009-07-06 14:26
帖子: 433
送出感谢: 2
接收感谢: 1
代码:
inoremap    =          <space>=<space>


剩下的==,你懂的

不过这两个要是一起用,体验就不太好了


_________________
生命只不过是上帝借你一用的资本!


页首
 用户资料  
 
5 楼 
 文章标题 : Re: vim中如何在“=”、“==”两侧自动加空格及“:wq”的大小写通吃?
帖子发表于 : 2012-12-07 10:20 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
不知道你是怎么实现的。setline+setpos吧。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
6 楼 
 文章标题 : Re: vim中如何在“=”、“==”两侧自动加空格及“:wq”的大小写通吃?
帖子发表于 : 2012-12-07 12:44 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
inoremap 不适合做格式化。

像vb那样,换行后再格式化吧。ls搞定这。lol


_________________
● 鸣学


页首
 用户资料  
 
7 楼 
 文章标题 : Re: vim中如何在“=”、“==”两侧自动加空格及“:wq”的大小写通吃?
帖子发表于 : 2012-12-07 22:19 
头像

注册: 2012-06-06 18:20
帖子: 582
送出感谢: 4
接收感谢: 11
多谢各位,问题已经大体解决了! :em02

一、我在snipMate的_.snippet中加了个规则
代码:
snippet ==
    ==
snippet =
    =

虽说还不能实现自动化,不过对于以前用supertab、现在用snipMate的我来说已经比较习惯了 :em11


上面的方法无效,snipMate无法正确分辨关键词 :em06

二、 感谢二楼的Fermat618,我在.vimrc中加入了
代码:
"预防手误的杀招
nnoremap : :
command  Wq wq
command Q q
command WQ wq

除了Q!没法子,其它全部搞定,不过Q!好像至今没犯过错误 :em09


_________________
Vimwiki建的小博客 wweir.org

历史的车轮压过一切,任何人或事物都留在了车辙里,只有思想和智慧或附在车辄上走上那么一段时间


最后由 温习江湖 编辑于 2012-12-08 10:32,总共编辑了 1 次

页首
 用户资料  
 
8 楼 
 文章标题 : Re: vim中如何在“=”、“==”两侧自动加空格及“:wq”的大小写通吃?
帖子发表于 : 2012-12-07 22:58 

注册: 2009-07-06 14:26
帖子: 433
送出感谢: 2
接收感谢: 1
snipmate是实现这种东西的好方法,没有之一


_________________
生命只不过是上帝借你一用的资本!


页首
 用户资料  
 
9 楼 
 文章标题 : Re: vim中如何在“=”、“==”两侧自动加空格及“:wq”的大小写通吃?
帖子发表于 : 2012-12-07 23:17 
头像

注册: 2007-03-24 23:45
帖子: 2357
送出感谢: 0 次
接收感谢: 9
关于第二个,我一直把 ; map 成 :,冒号实在太难打了


页首
 用户资料  
 
10 楼 
 文章标题 : Re: vim中如何在“=”、“==”两侧自动加空格及“:wq”的大小写通吃?
帖子发表于 : 2012-12-08 6:26 
头像

注册: 2012-06-06 18:20
帖子: 582
送出感谢: 4
接收感谢: 11
fanhe 写道:
关于第二个,我一直把 ; map 成 :,冒号实在太难打了



我的r_shift好像只有在这时候才用到,不过居然也习惯了


_________________
Vimwiki建的小博客 wweir.org

历史的车轮压过一切,任何人或事物都留在了车辙里,只有思想和智慧或附在车辄上走上那么一段时间


页首
 用户资料  
 
11 楼 
 文章标题 : Re: vim中如何在“=”、“==”两侧自动加空格及“:wq”的大小写通吃?
帖子发表于 : 2012-12-08 17:26 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
fanhe 写道:
关于第二个,我一直把 ; map 成 :,冒号实在太难打了

; 本身的意义很好用的。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
12 楼 
 文章标题 : Re: vim中如何在“=”、“==”两侧自动加空格及“:wq”的大小写通吃?
帖子发表于 : 2012-12-09 22:03 
头像

注册: 2008-12-28 16:01
帖子: 728
送出感谢: 2
接收感谢: 15
wangjun403 写道:
snipmate是实现这种东西的好方法,没有之一

snipmate 经常都不是最好的方法。


_________________
爱因斯坦会弹钢琴
爱因斯坦会拉小提琴
爱因斯坦会骑自行车


页首
 用户资料  
 
13 楼 
 文章标题 : Re: vim中如何在“=”、“==”两侧自动加空格及“:wq”的大小写通吃?
帖子发表于 : 2012-12-10 9:14 

注册: 2009-07-06 14:26
帖子: 433
送出感谢: 2
接收感谢: 1
我个人用snipmate实现,括号的自动补全
代码:
snippet (
(${1})${2}


个人觉得比映射,一些插件好用的多

补不补,全在自己


_________________
生命只不过是上帝借你一用的资本!


页首
 用户资料  
 
14 楼 
 文章标题 : Re: vim中如何在“=”、“==”两侧自动加空格及“:wq”的大小写通吃?
帖子发表于 : 2012-12-10 10:02 
头像

注册: 2010-01-20 0:12
帖子: 15
送出感谢: 0 次
接收感谢: 0 次
温习江湖 写道:
最近折腾的东西比较多,一会儿给装系统改配置,一会儿写html,一会儿写C,渐渐感觉原来的配置、插件不够用了。
今天给vim来了个大换血,效果还不错。好吧,不多废话,具体内容待会儿写在那半成品的博客里。



一、
    就是觉得不少语言里都推荐在“=”及“==”两侧加上空格以增强可读性,这个该如何实现自动呢?
    其实倒不是完全实现不了,只是感觉实现的时候光标跳动有点冲,希望大大们给个更好的建议。 :em03

二、
    下一个就是完全的手误。最近老是按“:”的时候<Shift>松的有些迟顿(难倒是冬天到了,手抖?)。希望大大们给个方法,让vim能够“:wq”、“:Wq”、“:WQ”及“:q!”、“:Q!”通吃 :em06


可以试试用ZZ代替:wq


页首
 用户资料  
 
15 楼 
 文章标题 : Re: vim中如何在“=”、“==”两侧自动加空格及“:wq”的大小写通吃?
帖子发表于 : 2012-12-11 0:04 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
AcceptSocket 写道:
温习江湖 写道:
最近折腾的东西比较多,一会儿给装系统改配置,一会儿写html,一会儿写C,渐渐感觉原来的配置、插件不够用了。
今天给vim来了个大换血,效果还不错。好吧,不多废话,具体内容待会儿写在那半成品的博客里。



一、
    就是觉得不少语言里都推荐在“=”及“==”两侧加上空格以增强可读性,这个该如何实现自动呢?
    其实倒不是完全实现不了,只是感觉实现的时候光标跳动有点冲,希望大大们给个更好的建议。 :em03

二、
    下一个就是完全的手误。最近老是按“:”的时候<Shift>松的有些迟顿(难倒是冬天到了,手抖?)。希望大大们给个方法,让vim能够“:wq”、“:Wq”、“:WQ”及“:q!”、“:Q!”通吃 :em06


可以试试用ZZ代替:wq


我用 C-s 然后 C-d :-)


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 21 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 0 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译