Macbook终端vim使用系统剪切板

  1. 系统自带的, 可执行程序是 /usr/bin/vim, 安装目录是 /usr/share/vim/, 版本7.3.
  2. 我使用 homebrew 后顺手安装了一次 vim, 安装目录:/usr/local/Cellar/vim/, 版本7.4. 可执行程序是 /usr/local/Cellar/vim/7.4.052/bin/vim , 并且有一个指向它的链接: /usr/local/bin/vim -> ../Cellar/vim/7.4.052/bin/vim
  3. 为了解决剪切板的问题, 我安装了 macvim. 这样还会有一份 vim: /Applications/MacVim.app/Contents/MacOS/Vim, 版本7.4 执行 which vim 的结果: /usr/bin/vim 可见, 尽管我用 homebrew 以及 macvim 安装了新的 vim 7.4, 但是系统默认使用的还是自带的7.3的老版本. 而执行 /usr/bin/vim --version | grep clipboard 又发现, 这个版本不支持 clipboard. 这就是问题的根本原因. 我将 /usr/bin/vim 给重命名了一下, 此时再 which vim, 就指向 /usr/local/bin/vim 了, 问题也解决了. 希望对遇到此问题的同学有帮助. 再次谢谢大家!

补充一下:

  1. which vim可以看到当前使用的vim是哪个,vim --version可以看到当前使用的vim支持哪些feature,'+'前缀表示拥有的feature,'-'前缀表示未拥有;
  2. '+clipboard'是支持使用系统剪切板的feature;
  3. 如果你当前使用的vim不支持clipboard,那需要brew install view装一个新的;
  4. 安装新的以后,要把这个新的vim设置为默认vim,通常使用alias设置一下别名,或者通过环境变量设置,或者删掉旧的,做个软连接;
  5. 确认+clipboard以后,在.vimrc文件中加入set clipboard=unamed,就可以在vim中使用系统剪切板了;

复制粘贴探秘

Vim作为最好用的文本编辑器之一,使用vim来编文档,写代码实在是很惬意的事情。每当学会了vim的一个新功能,就会很大地提高工作效率。有人使用vim几十年,还没有完全掌握vim的功能,这也说明了vim的强大。而这样何尝不是一件好事呢,只要有的学习,就有的提高。
最近使用Vim来写博客,发现在Vim中粘贴Python代码后,缩进就全乱了。仔细研究了以下,原来是自动缩进的缘故,于是做如下设置

:set noai nosi

取消了自动缩进和智能缩进,这样粘贴就不会错行了。但在有的vim中不行,还是排版错乱。
后来发现了更好用的设置:

:set paste

进入paste模式以后,可以在插入模式下粘贴内容,不会有任何变形。这个真是灰常好用,情不自禁看了一下帮助,发现它做了这么多事:

  • textwidth设置为0
  • wrapmargin设置为0
  • set noai
  • set nosi
  • softtabstop设置为0
  • revins重置
  • ruler重置
  • showmatch重置
  • formatoptions使用空值
    下面的选项值不变,但却被禁用:
  • lisp
  • indentexpr
  • cindent

怪不得之前只设置noai和nosi不行,原来与这么多因素有关!
但这样还是比较麻烦的,每次要粘贴的话,先set paste,然后粘贴,然后再set nopaste。有没有更方便的呢?你可能想到了,使用键盘映射呀,对。我们可以这样设置::

:map <F10> :set paste<CR>
:map <F11> :set nopaste<CR>

这样在粘贴前按F10键启动paste模式,粘贴后按F11取消paste模式即可。其实,paste有一个切换paste开关的选项,这就是pastetoggle。通过它可以绑定快捷键来激活/取消 paste模式。比如::

:set pastetoggle=<F11>

这样减少了一个快捷键的占用,使用起来也更方便一些。
但,这是最方便的吗?Vimer们对高效的追求永无止境。还有其他更好地方法吗?
你可能想到了,vim寄存器。对,使用vim寄存器 “+p 粘贴即可。根本不用考虑是否自动缩进,是否paste模式,直接原文传递!:

"+p

要说vim寄存器,就要从vim文件间的复制粘贴说起。
Vim中,若要复制当前行,普通模式下按 yy 即可,在要粘贴的地方按 p 。这是vim将复制内容保存到了自己的寄存器中的缘故。如果在其他地方执行yy,新的内容将覆盖掉原寄存器中内容。如果想保存原寄存器中内容而同时增加新的内容呢?这时就要在yy前增加标签了。标签以双引号开始,跟着的是标签名称,可以是数字0-9,也可以是26个字母,然后就是复制操作,这样就把复制内容保存到该标签寄存器里。通过下面命令显示所有寄存器内容::

:reg

其中注意两个特殊的寄存器:”* 和 “+。这两个寄存器是和系统相通的,前者关联系统选择缓冲区,后者关联系统剪切板。通过它们可以和其他程序进行数据交换。
备注:
若寄存器列表里无”* 或 “+ 寄存器,则可能是由于没有安装vim的图形界面所致。Debian/Ubuntu下可以通过安装vim-gnome解决。

sudo apt-get install vim-gnome

选择缓冲区和系统剪切板啥子区别?让我们继续研究。

选择缓冲区和剪切板

不同于Windows,Linux系统里存在两个剪切板:一个叫做选择缓冲区(X11 selection buffer),另一个才是剪切板(clipboard)。
选择缓冲区是实时的,当使用鼠标或键盘选择内容时,内容已经存在于选择缓冲区了,这或许就是选择缓冲区的由来吧。
使用下面的命令查看选择缓冲区的内容::

xclip -out

如果没有xclip命令,Debian/Ubuntu下可以通过如下命令安装::

$ sudo apt-get install xclip

可以使用鼠标中键或键入Shift+Insert来粘贴选择缓冲区的内容。但对于有些GUI程序,比如gedit,只能通过鼠标中键调用选择缓冲区的内容,使用Shift+Insert的话,调用的是剪切板的内容。
剪切板和Windows的剪切板类似,在选择文字内容后,执行Ctrl + c或在菜单里选择‘复制’的话,这时内容才存放到剪切板里。
使用下面的命令查看剪切板的内容::

$ xclip -out -sel clipboard

而使用剪切板的内容,则是Ctrl+v。 但在有些情况下,比如gnome-terminal,不能直接使用Ctrl+c,Ctrl+v,这时就要用Shift+Ctrl+c,Shift+Ctrl+v代替。

原格式粘贴

好了,了解了选择缓冲区和剪切板,下面就是实现保留格式粘贴的完美解决方案:
方案一:
选择文本内容
vim普通模式下按 “*p 将选择缓冲区中内容粘贴进来
方案二:
复制文件内容
vim普通模式下按 “+ p 将剪切板内容粘贴进来
这时,如果要复制的内容也是vim编辑器中的内容,那么如何复制才更方便呢?

vim中的复制

vim有一个可视模式(Visual Mode),在此模式下可以选择区域。可以在普通模式下键入v进入可视模式,也可以个性化一点,键入V进入行可视模式,或者键入Ctrl+v进入列可视模式。这时移动光标就可以选择内容了。注意这时被选内容已经实时保存于选择缓冲区了,当然你也可以键入”+y将此内容也保存到剪切板里,或者”ay将内容保存到标签为a的寄存器中。但要知道,只有前两个中的内容可以在其他程序中使用,而a寄存器中的内容只能在该vim编辑器内使用。
也可以通过鼠标来复制。这里首先要打开鼠标模式。:

:set mouse=a

这样在普通模式下可以直接使用鼠标选择区域复制到选择缓冲区。但这种情况下不能复制到剪切板。
若要使用鼠标复制内容到剪切板,则需要做如下设置::

:set mouse=v

这种情况下,除了可以像上面一样直接使用鼠标选择区域复制到选择缓冲区以外,还可以在右键菜单中选择“复制”来保存到剪切板里。但新问题又出来了。若显示行号,也会将行号一并选择。你会想到,这好办呀,如果不需要行号的话,在复制前,先执行set nonu来取消行号显示呗。
其实没必要这样,如果不需要复制行号的话,用在可视模式下用键盘来选择不就可以吗?
并且,从上面的讨论,我们不难得出,使用选择缓冲区比使用剪切板要方便的多,可以节省很多步骤。
所以,最终我们得到了vim文件间复制粘贴的完美方案,文件传输的中转使用选择缓冲区。

补充:

设置vim中默认使用选择缓冲区寄存器 “*:

set clipboard = unnamed

则可以直接通过y,p和系统选择缓冲区进行数据交换。
(原文地址: http://blog.ossxp.com/2010/12/2190/)

vim文件间复制粘贴完美方案

  • 在~/.vimrc中增加如下一行::
set mouse=v
  • 复制内容到选择缓冲区。

    • 带行号时,使用鼠标选择内容区域。
    • 不要行号,使用 “*yny 复制n行或可视模式下选择。
  • 将选择缓冲区中内容粘贴到vim文件:普通模式下按 “*p 。
    ##SpaceVim和Vim共存
    ```vim
    Can I try SpaceVim without overwriting my vimrc?

The SpaceVim install script will move your ~/.vimrc to ~/.vimrc_back. If you want to have a try SpaceVim without overwriting your own Vim configuration you can:

Clone SpaceVim manually.

git clone https://github.com/SpaceVim/SpaceVim.git ~/.SpaceVim

Then, start Vim via vim -u ~/.SpaceVim/vimrc. You can also put this alias into your bashrc.


##Simple vim config for server.
```vim
" Simple vim config for server.
" Version: 0.1
" Author: Anton Chen <contact@antonchen.com>
" Create Date: 2016-08-22 15:07:51
" Last Modified: 2018-07-24 21:53:38 let Author = 'Your Name <youremail@example.com>' " Settings
" {{{ " Leader
let mapleader = ','
let g:mapleader = ','
" 高亮
syntax on
" 设置 256 色
let t_Co=256
" 历史行数
set history=2000
" 文件类型识别
filetype on
" 开启插件
filetype plugin on
" 开启 indent 缩进
filetype indent on " 基础设置
set shortmess=atI " 不显示欢迎信息
set helplang=cn " 首选帮助语言
set title " 终端标题
set magic " 开启 magic 正则
set nobackup " 关闭备份
set nocompatible " 禁止 vi 模式
set backspace=indent,eol,start " 设置 <Backspace>
" set clipboard=unnamed " 拷贝到系统剪切板
" set whichwrap+=<,>,h,l " 左右移动跨行
set autoread " 文件在Vim之外修改过,自动重新读入
set lazyredraw " 运行宏时不重绘 " 关闭错误提示
set novisualbell " 关闭闪烁提示
set noerrorbells " 关闭声音提示
set t_vb=
set tm=500 " 配色
colorscheme molokai
let g:rehash256 = 1 " 高亮
" set cursorcolumn " 高亮当前列
" set cursorline " 高亮当前行 " 剩余 7 行时翻页
set scrolloff=7
" 禁用鼠标
" set mouse=a " 显示
set ruler " 显示当前行号与列号
set number " 显示行号
set numberwidth=6 " 设置行号列宽度
" set nowrap " 关闭自动换行
set showcmd " 在状态栏显示正在输入的命令
set showmode " 显示当前Vim模式
" set showmatch " 当关闭如括号这样的代码时,光标跳转到括号开始再跳回
" set matchtime=3 " 光标跳转时间 " 搜索
set hlsearch " 高亮匹配
set incsearch " 开启即时搜索
set ignorecase " 搜索时忽略大小写
set smartcase " 字符串有大写字母时大小写敏感 " 缩进
set expandtab " 使用空格缩进
set smartindent " 智能缩进
set autoindent " 继承缩进
set shiftround " 缩进宽度对齐到 shiftwidth 的整数倍
set tabstop=4 " <Tab> 宽度
set softtabstop=4 " 编辑模式下 <Tab> 宽度
set shiftwidth=4 " 自动缩进宽度
set smarttab " 插入 <Tab> 时使用 'shiftwidth' " 补全
set wildmenu " 命令模式补全
set wildmode=full " 补全菜单样式
set wildignore=*.o,*~,*.pyc,*.class " 排除补全 " 代码折叠
set foldenable
" 折叠方法
" manual 手工折叠
" indent 使用缩进表示折叠
" expr 使用表达式定义折叠
" syntax 使用语法定义折叠
" diff 对没有更改的文本进行折叠
" marker 使用标记进行折叠, 默认标记是 {{{ 和 }}}
set foldmethod=marker
" 代码折叠自定义快捷键 <leader>zz
let g:FoldMethod = 0
map <leader>zz :call ToggleFold()<cr>
fun! ToggleFold()
if g:FoldMethod == 0
exe "normal! zM"
let g:FoldMethod = 1
else
exe "normal! zR"
let g:FoldMethod = 0
endif
endfun " 上次文件编辑位置
if has("autocmd")
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif " 字体设置
if has("gui_running")
set guifont=Monaco:h14
endif " 状态栏
set laststatus=2 " 状态栏高度
" set statusline=%<%f\ %h%m%r%=%k\ %m\ %r%y\ [%{(&fenc==\"\")?&enc:&fenc}%{(&bomb?\",BOM\":\"\")}\|%{&ff}]\ %-14.(%l,%c%V%)\ %P
" 转换文件大小
function! Buf_total_num()
return len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))
endfunction
function! File_size(f)
let l:size = getfsize(expand(a:f))
if l:size == 0 || l:size == -1 || l:size == -2
return ''
endif
if l:size < 1024
return l:size.' bytes'
elseif l:size < 1024*1024
return printf('%.1f', l:size/1024.0).'k'
elseif l:size < 1024*1024*1024
return printf('%.1f', l:size/1024.0/1024.0) . 'm'
else
return printf('%.1f', l:size/1024.0/1024.0/1024.0) . 'g'
endif
endfunction
" 定义状态栏格式
set statusline=%<%1*[B-%n]%*
set statusline+=%2*[TOT:%{Buf_total_num()}]%*
set statusline+=%3*\ %{File_size(@%)}\ %*
set statusline+=%4*%m\ %F\ %*
set statusline+=%=%5*\ %r%y\ [%{(&fenc==\"\")?&enc:&fenc}%{(&bomb?\",BOM\":\"\")}\|%{&ff}]\ %-14.(%l,%c%V%)
set statusline+=%6*\ %P\ %*
" 自定义状态栏颜色
" 终端
hi User1 cterm=bold ctermfg=237 ctermbg=39
hi User2 cterm=None ctermfg=39 ctermbg=242
hi User3 cterm=None ctermfg=251 ctermbg=240
hi User4 cterm=bold ctermfg=169 ctermbg=239
hi User5 cterm=None ctermfg=250 ctermbg=238
hi User6 cterm=None ctermfg=249 ctermbg=240
" GUI
hi User1 gui=bold guifg=#3a3a3a guibg=#00afff
hi User2 gui=None guifg=#00afff guibg=#6c6c6c
hi User3 gui=None guifg=#c6c6c6 guibg=#585858
hi User4 gui=bold guifg=#d75faf guibg=#4e4e4e
hi User5 gui=None guifg=#bcbcbc guibg=#444444
hi User6 gui=None guifg=#b2b2b2 guibg=#585858 " 文件格式
set fileformat=unix " 新文件编码
set nobomb " 禁止UTF-8 BOM
set encoding=utf-8
set termencoding=utf-8 " 自动识别文件编码
set fileformats=unix,dos,mac
set fileencodings=utf-8,ucs-bom,cp936,gb18030,big5,euc-jp,euc-kr,latin1 " 如遇Unicode值大于255的文本,不必等到空格再折行
set formatoptions+=m
" 合并两行中文时,不在中间加空格
set formatoptions+=B
" 选中颜色
hi Visual term=reverse cterm=reverse guibg=Grey " }}} " File type
" {{{ " Fix crontab
autocmd FileType crontab set nobackup nowritebackup
autocmd FileType python set tabstop=4 shiftwidth=4 expandtab ai
autocmd FileType ruby set tabstop=2 shiftwidth=2 softtabstop=2 expandtab ai
autocmd FileType yaml set tabstop=2 shiftwidth=2 softtabstop=2 expandtab noai nocin nosi inde=
autocmd BufRead,BufNewFile *.md,*.mkd,*.markdown set filetype=markdown.mkd autocmd BufRead,BufNewFile nginx.conf set filetype=nginx
autocmd BufRead,BufNewFile */etc/nginx/*.conf set filetype=nginx
autocmd BufRead,BufNewFile */usr/local/nginx/conf/*.conf set filetype=nginx autocmd BufRead,BufNewFile *.json set filetype=json autocmd BufNewFile * exec ":call AutoSetFileHead()"
function! AutoSetFileHead()
let NewFileTime = strftime('%Y-%m-%d %H:%M:%S')
" .sh
if &filetype == 'sh'
call setline(1, "\#!/bin/bash")
call append(1, "\# Author: ".g:Author)
call append(2, "\# Create Date: ".NewFileTime)
call append(3, "\# Last Modified: ".NewFileTime)
call append(4, "\# Description: ")
call append(5, "HERE=$(cd -P -- $(dirname -- \"$0\") && pwd -P)")
normal G
normal o
endif " python
if &filetype == 'python'
call setline(1, "\#!/usr/bin/env python")
call append(1, "\# encoding: utf-8")
call append(2, "\# Author: ".g:Author)
call append(3, "\# Create Date: ".NewFileTime)
call append(4, "\# Last Modified: ".NewFileTime)
call append(5, "\# Description: ")
normal G
normal o
endif
endfunc autocmd FileType c,cpp,java,go,php,javascript,puppet,python,rust,twig,xml,yml,perl autocmd BufWritePre <buffer> :call <SID>StripTrailingWhitespaces()
function! <SID>StripTrailingWhitespaces()
let l = line(".")
let c = col(".")
%s/\s\+$//e
call cursor(l, c)
endfun " }}} " Key map
" {{{ " 禁用 Ex 模式
nmap Q <Nop>
" 禁用 <F1> 帮助
nmap <F1> <Nop>
" 行号
nmap <F2> :set nu! nu?<CR>
" 换行符
nmap <F3> :set list! list?<CR>
" 自动换行
nmap <F4> :set wrap! wrap?<CR>
" 粘贴模式
set pastetoggle=<F5>
" 格式化
nmap <F6> gg=G<C-o><C-o>
" nmap <F6> :call Format()<CR>
" function! Format()
" if &filetype != 'json'
" exec "normal gg=G\<C-o>\<C-o>"
" else
" %!python -m json.tool
" endif
" endfun " 快速保存
nmap <leader>w :w<CR>
" 快速退出
nmap <leader>q :q<CR>
" 快速保存退出
nmap <leader>x :x<CR> " U 重做
nmap U <C-r> " 快速进入命令行
nmap ; : " 关闭搜索 ,/
noremap <silent><leader>/ :nohls<CR> " Bash模式:C-a 行首,C-e 行尾
map <C-a> <Home>
map <C-e> <End> " 标签跳转
map <S-Up> :bp<CR>
map <S-Down> :bn<CR> " 关闭方向键
" map <Left> <Nop>
" map <Right> <Nop>
" map <Up> <Nop>
" map <Down> <Nop> " }}} " Plugin
" {{{
" SuperTab
let g:SuperTabMappingForward = "<s-tab>"
let g:SuperTabRetainCompletionType = 0
let g:SuperTabDefaultCompletionType = "<C-N>"
" TagmaLast
let g:TagmaLastAutoUpdate = 1
let g:TagmaLastTimeFormat = '%Y-%m-%d %H:%M:%S'
" }}}

Vim 简易配置的更多相关文章

  1. [转] vim自定义配置 和 在ubnetu中安装vim

    Ubuntu 12.04安装vim和配置   问题: ubuntu默认没有安装vim,出现: jyg@ubuntu:~$ vim test.cThe program 'vim' can be foun ...

  2. 为了让vi命令也可以使用vim的配置,需要修改 vi /etc/bashrc 增加一行 alias vi='vim'此时,经过上面配置已经可以显示语法高亮了

    为了让vi命令也可以使用vim的配置,需要修改 vi /etc/bashrc 增加一行 aliasvi='vim'此时,经过上面配置已经可以显示语法高亮了

  3. linux环境下Vim的配置

    原文链接:http://blog.chinaunix.net/uid-26826958-id-3272375.html  (本文转自此链接中的部分内容,但做了适当修改) 安装vim命令:sudo ap ...

  4. LAMP的搭建与简易配置(apache,php已module方式结合)

    测试所用环境:centos7.2 apache php 所在主机IP:9.110.187.120 mariadb 所在主机IP:9.110.187.121 第一部分:环境搭建 yum安装软件包 其中a ...

  5. windows下LINUX模拟终端Cypwin以及Vim的配置使用

    Cypwin的安装 从官网下载相应版本后,直接安装. 官网地址:Cypwin 安装过程中可以选择相应的Packages,我们需要安装的Vim就需要在这一步中选择相应的包. Cypwin的使用 纯命令行 ...

  6. NGINX按天生成日志文件的简易配置

    NGINX按天生成日志文件的简易配置 0x01 最近后端童鞋遇到一个小需求,拆分nginx生成的log文件,最好是按天生成,看着她还有很多bug待改的状态,我说这个简单啊,我来吧.曾经搞node后端的 ...

  7. VIM简单配置

    配置vim配置 编辑配置文件 feng@mint ~ $ vim ~/.vimrc 配置如下 主要配置为自动换行,设置行号,设置tab键为4个空格,同时将tab键自动转换成空格 set autoind ...

  8. php简易配置函数

    nilcms中:php简易配置函数. 文件位置:nc-admin/common.php /* * --------------------------------------------------- ...

  9. macOS中Vim基本配置,颜色主题/语法/indent设置

    macOS中Vim基本配置 Vim的初始化配置 .vimrc 存放位置 macOS 环境下 vim 的初始化配置文件为 .vimrc , 通常有两个(系统版本和用户版本),一个位于 /usr/shar ...

随机推荐

  1. Beta/Gamma事后分析

    目录 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结 对照敏捷开发的原则, 你觉得你们小组做得最好的是哪几个原则? 请列出具体的事例. 照片 设想和目标 我们的 ...

  2. 【2019年06月28日】A股最便宜的股票

    查看更多A股最便宜的股票:androidinvest.com/CNValueTop/ 经典价值三因子选股: 市盈率PE.市净率PB 和 股息分红率,按照 1:1:1的权重,选择前10大最便宜的股票. ...

  3. [转帖]【Ubuntu】Ubuntu 各版本代号简介

    [Ubuntu]Ubuntu 各版本代号简介 https://www.jianshu.com/p/7b351fde8799 一.版本及代号说明 Ubuntu中,每个版本都有一个更为特色的名字,这个名字 ...

  4. 原始(Prototype)模式

    原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型对象创建新的对象. 原型模式其实就是从一个对象创建另外一个可复制的对象,而且不需要知道任何创建的细节.(最常用的就是基于流的深复制) 原始模 ...

  5. idea 添加默认注释

  6. 常用Java API之Scanner:功能与使用方法

    Scanner 常用Java API之Scanner:功能与使用方法 Scanner类的功能:可以实现键盘输入数据到程序当中. 引用类型的一般使用步骤:(Scanner是引用类型的) 1.导包 imp ...

  7. maven添加本地包命令mvn install:install-file

    mvn install:install .jar -Dfile:要注册的jar,绝对路径

  8. mysql提示The server quit without updating PID file /usr/local/mysql/data/localhost.localdomain.pid

    chown -R mysql:mysql /var/lib/mysql 解决方法 :给予权限,执行 “chown -R mysql:mysql /var/lib/mysql” “chmod -R 75 ...

  9. 史上最全HashMap红黑树解析

    HashMap红黑树解析 红黑树介绍 TreeNode结构 树化的过程 红黑树的左旋和右旋 TreeNode的左旋和右旋 红黑树的插入 TreeNode的插入 红黑树的删除 TreeNode的删除节点 ...

  10. 服务器推送之SSE简单使用

    前端 <!DOCTYPE html> <html> <head> <meta name="viewport" content=" ...