tech_memo / vi


tech_memo

SSHターミナルでインサートモード抜けるときにIME無効化

vimのヤンクをクリップボードにコピー

vimの機能でコピー

  • vim 7.3以降は、以下のオプションをvimrcに記載しておけばできるらしい。(未確認)
    set clipboard=unnamed,autoselect
    名前内容
    unnamedヤンクしたテキストそのままクリップボードにコピー
    autoselectvim上でハイライトして選択したテキストがクリップボードにコピー
  • クリップボード機能が利用可能かどうかは、以下コマンドで、+clipboardが出力されれば利用可能。-clipboardと出力されると利用不可
    vim --version | clipboard

xselコマンドでコピー

  • xselコマンドとは?
    • xsel(Xセレクション)はコマンドラインから標準入出力とXセレクションとの間のデータ転送を行う。
    • XセレクションにはPRIMARY、SECONDARY、CLIPBOARDの3種類がある。
    • 詳細 : http://lldev.jp/linux_c_cpp/linux_cmd/xsel.html
  • vimとの連携参考
  • rpm (yumでインストールできない場合)
  • コマンド結果をクリップボードにコピー
    cat hoge.txt | xsel -bi
  • vimのビジュアルモードで選択した箇所をクリップボードにコピー
    :w !xsel -bi
  • putty上で利用する場合は、DISPLAY環境変数の設定が必要
    export DISPLAY=:1.0
  • RHEL6上でやってみた結果、なぜか以下のようになった。。。謎
    • putty上でコピー ⇒ VNC内のターミナルでペースト可能
    • VNC内のターミナルでコピー ⇒ Windows(putty含む)でペースト可能

文字化け対応

  • 以下を.vimrcに設定する
    set encoding=utf-8
    set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8,cp932
    set fileformats=unix,dos,mac
  • オプション
    • 文字コード
      オプション説明
      encoding, encVim内部で使われる文字エンコーディングを設定する。
      fileencoding, fencカレントバッファのファイルの文字エンコーディングを設定する。
      fileencodingとencodingが異なるとき,書き出しのときに変換が行われる。fencの値で書き出すようになる?
      fileencodings, fencsfencが空のときにはここの値から設定される。既存のファイルを編集するときに考慮する文字エンコーディングのリストを設定する。
      この値の先頭から順番に文字コードを使おうとし,エラーが出ると次の文字コードを試す。うまくいけば,その値をfencの値にする。全部失敗すれば,fencは空になり,そのときはencodingの値が使われる。
      termencoding, tencターミナルで使われるエンコーディング名。空のときはencodingの値が使われる。
      • 日本語に使われる値
        utf-8
        iso-2022-jp 
        euc-jp
        sjis
        cp932
  • 改行コード
    オプション説明
    fileformat, ffファイルを読み込んだ入,書き込んだりするときに使う<EOL>(改行コード)を設定する。
    fileformats, ffs想定する改行(<EOL>)の種類を指定する。fencsと同様に先頭から順番に確認して設定される。複数列挙するときはコンマ,で区切る。
    dos: <CR><NL>
    unix: <NL>
    mac: <CR>

vimrcとpluginを別ディレクトリに設定

  • pluginはvimrc再読み込みではロードできないようなので、
    • 1) $HOME/.vimrcから
    • 2) 独自vimrcを読み込み、その記述のなかに
    • 3) 独自plugin格納ディレクトリをruntimepathに追加する
  • という方法をとる。なお、下記例では、pathogenプラグインを利用している。
  • $HOME/.vimrc 追記内容
    if $VIM_CUSTOM != ""
       source <指定ディレクトリのvimrc>
    endif
  • 独自vimrc記述内容
    // この配下に、autoload, pluginディレクトリがある(pathogenを使っていない場合は、各pluginのホームディレクトリまで指定する必要あり
    set runtimepath+=<プラグインDIR>  
    call pathogen#infect()

色付けのファイルの拡張子を追加

  • /usr/share/vim/vim70/filetype.vim に以下を追加
    au BufNewFile,BufRead *.c                      call s:FTlpc()         # これはもともとある行
    au BufNewFile,BufRead *.pc                      call s:FTlpc()       # *.pcファイルをCの色付けするように行を追加

Windows7のプラグイン置き場

  • 下記vimfilesフォルダを作成して、その下にプラグインを置く
    $HOME\vimfiles\
    • $HOMEはデフォルトだと、 「C:\Users\ユーザー名」
  • pathogenを使う場合(NetBundle?が使えない(オフライン環境)場合)は、下記のようになる
    $HOME\vimfiles\autoload\pathogen.vim
    $HOME\vimfiles\bundle\

Plugin

quickhlでエラー

  • 環境によって、以下のようなエラーが出ることある
    Error detected while processing function quickhl#manual#this[1]..quickhl#manual#enable[11]..quickhl#manual#refresh[1]..quickhl#windo:
    line    4:
    E117: Unknown function: bufwinid
    E15: Invalid expression: bufwinid('') ==# -1
    Error detected while processing function quickhl#manual#this[8]..quickhl#manual#add_or_del[8]..quickhl#manual#refresh[1]..quickhl#windo:
    line    4:
    E117: Unknown function: bufwinid
    E15: Invalid expression: bufwinid('') ==# -1
  • autoload/quickhl.vimの下記をコメントアウトで直る
     28 function! quickhl#windo(func, obj) abort "{{{
     29   " [BUG] This function is invoked from WinEnter event.
     30   " Unexpectedly, this event is happen before buffer is not shown on window when invoke `pedit file`.
     31   " So here I will skip unxexisting buffer(which return `-1`) to avoid E994 error.
     32   if bufwinid('') ==# -1 # ★このif文ブロック
     33     return
     34   endif
  • deinでプラグイン管理している場合はキャッシュをクリアすること
    :call dein#recache_runtimepath()

NERDTree

ag

NeoBundle?

  • 現在、非推奨。後継のdeinを利用すべし
  • 下記でインストール可能(必要に応じてproxy設定はしておくこと)
    mkdir -p ~/.vim/bundle
    git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim

dein

  • インストール
    • githubから取得。ただし、下記vimrcにて、未インストールであればインストールするように設定してあるので、下記vimrcを使うのであれば実施不要。
      mkdir -p ~/.vim/dein/repos/github.com/Shougo/dein.vim
      git clone https://github.com/Shougo/dein.vim.git \
         ~/.vim/dein/repos/github.com/Shougo/dein.vim
  • vimrc設定
  • toml設定
    • インストールするプラグインをdein.tomlおよび、dein_lazy.tomlというファイルに外出しできる。
    • 設定は、tomlを参照

vim 7系だとエラーが発生

  • 以下のエラー
    Error detected while processing function dein#begin..dein#util#_begin..dein#util#_error..<SNR>11_msg2list:
    line    1: 
    E121: Undefined variable: v:t_list 
    E15: Invalid expression: type(a:expr) ==# v:t_list ? a:expr : split(a:expr, '\n')
    Error detected while processing function dein#begin..dein#util#_begin..dein#util#_error:
    line    1:
    E714: List required 
    Press ENTER or type command to continue
  • Undefined variable: v:t_list がエラー
  • vim7.4.2071から追加されたのがv:t_xxxらしい。CentOS6系や7系のデフォルトだとこれより古いバージョンが入っているのが原因
  • deinのバージョンを下げることで回避できる。deinをインストールしたディレクトリに移動して以下を実行。
    git checkout 1.0

キャッシュクリア

  • プラグインのソースを修正した場合は、キャッシュのクリアが必要
    :call dein#recache_runtimepath()

移動系

左右のスライド

カーソル固定したまま、画面を一行移動

  • 上へ移動
    • Ctrl + Y
  • 下へ移動
    • CTrl + E

同じ行の指定文字へジャンプ

f<ジャンプしたい1文字>
  • sample
    # コマンド入力前
    ABCDEFGHIJKLMN
    *
    
    # cfJと入力
    ABCDEFGHIJKLMN
             *

ジャンプ

  • 前の場所
    Ctrl + o
  • 次の場所
    Ctrl + i

ジャンプ場所のマーク

  • マーキング
    mq (qは未使用キーならなんでもよい)
  • マーキング場所へのジャンプ
    `q

折り返し設定取り消し

:set nowrap

Tab

ctags


vim update

7.2へのupdate

7.3へのupdate (未実施)

binaryデータの編集

  • ファイルを開くときに
    vim -b
  • で開き、
    :%!xxd
  • でテキスト16進表示&編集が可能。編集後は
    :%!xxd -r
  • でテキスト-->binaryに戻せる。

キーバインド変更


Leaderの変更

  • .vimrcに以下のように書く
    let mapleader = ";"

vimdiff

  • 差分箇所へジャンプ
    • next
      ]c
    • prev
      [c
  • 現在のバッファから他のバッファへコピー
    dp
  • 現在のバッファに他のバッファからコピー
    do

plugin

  • tech_memo/vim/plugin?

現在位置から同じ行の指定文字までを置換

cf<置換したい範囲の最後の1文字>

名前付きバッファへのヤンク

"<a〜zキー>yy

名前付バッファのペースト

"<a〜zキー>p

コマンドモード

ファイルフォーマット変更

:set ft=sql

コマンドのmapping

  • map
    :map K(未使用キー) "qp

検索ハイライトを消す

:noh

ALTキーをmapする

  • 参考 : https://vi.stackexchange.com/questions/2350/how-to-map-alt-key
  • ALTキーのmapはデフォルト無理っぽいが、ALTキーとESCキーが同じ文字シグナルかどうかで、利用することが可能。(Escと同じじゃなくてもよいが、何と同じかわかれば利用できる可能性あり)
  • 以下、Alt + k をマップする例。
  • まず、ターミナルがALTキーを受信した際に、どういった文字になるか確認する
    $ sed -n l
    ^[k     # <== Alt + kを押した際に表示された (Altだけでは何も表示されない。Alt + 何かで始めて受付ける模様)
    ^[      # <== Escを押した際に表示された
  • 上記にて、AltとEscは同じ文字を送信していることがわかるので、vimrcに以下を記載する。
    execute "set <M-k>=\ek"
    nnoremap <M-k> <何かのコマンド等>  " <== これは例
    • 上記にて、vimrc上、<M-k>と記述した際に、Esc+k (= Alt +k)が送信されることによりマップが可能となる。

My設定ファイル

.vimrc

syntax on

set ts=4 "tabstop
set sw=4 "shiftwidth
set expandtab "convert tab to space.
set cursorline

" Enable Alt + k as <M-k>
execute "set <M-k>=\ek"

"retab command
"if you set expandtab   --> convert tab to space.
"if you set noexpandtab --> convert space to tab.

"set autoindent
set hlsearch
"set number

"set mouse=a
"set mouse=n
let mapleader = ";"
" ctags
set tags=tags;

"===========================================
" Turn off beep sound.
"===========================================
set vb t_vb=

"===========================================
" Cursor type
"===========================================
let &t_ti.="\e[1 q"
let &t_SI.="\e[5 q"
let &t_EI.="\e[1 q"
let &t_te.="\e[0 q"

"===========================================
" key binding
"===========================================

"--- vidual mode ---
vnoremap * "zy:let @/ = @z<CR>n

"--- edit mode ---
nnoremap <C-l> $

" tab jump
nnoremap <C-n>t :<c-u>tabnext<CR>
nnoremap <C-p>t :<c-u>tabprevious<CR>
nnoremap <S-Tab> gt
nnoremap <Leader>t gt
nnoremap <Leader>T gT
"nnoremap <Leader>tn :tabnew<CR>

" search word
"nnoremap * *zz
"nnoremap # #zz
nnoremap * *N
nnoremap # #n

" window jump
nnoremap <Leader>ww <C-w>w
nnoremap <Leader>wh <C-w>wh
nnoremap <Leader>wk <C-w>wk
nnoremap <Leader>wj <C-w>wj
nnoremap <Leader>wl <C-w>wl

" window size vertical
nmap <C-w>- <C-w>-<C-w>
nmap <C-w>; <C-w>+<C-w>
nmap <Leader>w;    <C-w>;
nmap <Leader>w-    <C-w>-

" window size width
nmap <C-w>, <C-w><<C-w>
nmap <C-w>. <C-w>><C-w>
nmap <Leader>w.    <C-w>.
nmap <Leader>w,    <C-w>,

" ctags as like eclipse
" nnoremap <F3> <C-]>
nnoremap <F3> g<C-]>
" nnoremap <C-k> g<C-]>
nnoremap <expr> <C-k> 'tab sp<CR>:tjump ' . expand("<cword>") . '<CR>'
nnoremap <expr> <M-k> ':tab sp<CR>:tag ' . expand("<cfile>") . '<CR>'

"--- Insert mode ---
"move
"imap <C-j> <Down>
"imap <C-k> <Up>
"imap <C-h> <Left>
"imap <C-l> <Right>
"imap <C-w> <ESC>lwi
"imap <C-b> <ESC>bi
"imap <C-a> <ESC>0i
"escape
inoremap <C-j> <ESC>
"imap <C-S-f> <ESC>l<C-f>i
"imap <C-S-b> <ESC>l<C-b>i

"insert line
inoremap <C-o> <ESC>o


"--- tmp ---
"map K "qp
"nmap K nvf<s#Response#declare namespace ws='http://ws.mm.nhm.nec.co.jp/'; //ws:getExtractJobBinaryResponse[1]/return[1]}<<ESC>
"nnoremap K /jdbc:oracle:thin:@${IP}:${PORT}:${SID}<CR>v37lsjdbc:oracle:thin:@${IP}:${PORT}/${SID}<ESC>

" ------------------
" Quick Run
" ------------------
nnoremap <silent> <Leader>q :QuickRun
nnoremap <silent> <Leader>e <C-w><C-w>:q<CR>
let g:quickrun_config={'*': {'split': ''}}
set splitbelow
set splitright


" ------------------
" fuzzy finder
" ------------------
nnoremap <silent> <Leader>ff :<C-u>tabnew<CR>:tabmove<CR>:FufFile **/<CR>
nnoremap <expr> <Leader>j ':<C-u>tabnew<CR>:tabmove<CR>:FufFile **/' . expand("<cword>") . '<CR>'
"nnoremap <silent> <Leader>ff :FufFile **/<CR>
"nnoremap <silent> ;ff :FuzzyFinderFile<CR> " old fuzzyfinder

" ------------------
" NERDTree
" ------------------
nnoremap <Leader>n :NERDTreeToggle<CR>
let NERDTreeShowBookmarks=1


" ------------------
" back space effecte
" ------------------
set backspace=indent,eol,start
inoremap ^? ^H

" ===========================================
" vim color
" ===========================================
hi Search    ctermfg=black ctermbg=11
 
" ===========================================
" vim diff color
" ===========================================
hi DiffAdd    ctermfg=black ctermbg=2
hi DiffChange ctermfg=black ctermbg=3
hi DiffDelete ctermfg=black ctermbg=6
hi DiffText   ctermfg=black ctermbg=7

" ===========================================
" vim diff keybind
" ===========================================
nnoremap dn ]c
nnoremap dN [c

" ============================================
" completion color
" ============================================
set t_Co=256
set t_Sf=[3%dm
set t_Sb=[4%dm
 
hi Pmenu ctermbg=8
hi PmenuSel ctermbg=12
hi PmenuSbar ctermbg=0


" ============================================
" XML format
" ============================================
map <F5> <ESC>:exe ":silent 1,$!xmllint --format --recover - 2>/dev/null"<CR>


" ============================================
" pathogen plugin
" ============================================
"call pathogen#infect()

let Tlist_Ctags_Cmd = '/usr/local/bin/ctags'

" ============================================
" vim-quickhl plugin
" ============================================
nmap <Leader>m <Plug>(quickhl-manual-this)
xmap <Leader>m <Plug>(quickhl-manual-this)
nmap <Leader>M <Plug>(quickhl-manual-reset)
xmap <Leader>M <Plug>(quickhl-manual-reset)

" for vimdiff color
"highlight DiffAdd    cterm=bold ctermfg=10 ctermbg=2
"highlight DiffDelete cterm=bold ctermfg=10 ctermbg=3
"highlight DiffChange cterm=bold ctermfg=10 ctermbg=6
"highlight DiffText   cterm=bold ctermfg=10 ctermbg=7


" ============================================
" Neobundle Settings. // deprecated
" ============================================
" bundleで管理するディレクトリを指定
"set runtimepath+=~/.vim/bundle/neobundle.vim/
" Required:
call neobundle#begin(expand('~/.vim/bundle/'))

"neobundle自体をneobundleで管理
" NeoBundleFetch 'Shougo/neobundle.vim'
" NeoBundle 'mileszs/ack.vim'
" NeoBundle 'davidhalter/jedi-vim'
" NeoBundle 'vim-scripts/FuzzyFinder'
" NeoBundle 'vim-scripts/L9'
" NeoBundle 'vim-scripts/taglist.vim'
" NeoBundle 'vim-scripts/SQLUtilities'
" NeoBundle 'othree/vim-autocomplpop'
" NeoBundle 'kevinw/pyflakes-vim'
" NeoBundle 'thinca/vim-quickrun'
" NeoBundle 't9md/vim-quickhl'
" NeoBundle 'Align'
" NeoBundle 'rhysd/clever-f.vim'
" NeoBundle 'osyo-manga/vim-brightest'

" call neobundle#end()
" Required:
"filetype plugin on "

"未インストールのプラグインがある場合、インストールするかどうかを尋ねてくれるようにする設定"
"毎回聞かれると邪魔な場合もあるので、この設定は任意です
" NeoBundleCheck

" ============================================
" dein  // NeoBundleがdeprecatedになったのでdeinを使う
" ============================================
" プラグインが実際にインストールされるディレクトリ
let s:dein_dir = expand('~/.cache/dein')
" dein.vim 本体
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'

" dein.vim がなければ github から落としてくる
if &runtimepath !~# '/dein.vim'
  if !isdirectory(s:dein_repo_dir)
    execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
  endif
  execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p')
endif

" 設定開始
if dein#load_state(s:dein_dir)
  call dein#begin(s:dein_dir)

  " プラグインリストを収めた TOML ファイル
  " 予め TOML ファイル(後述)を用意しておく
  let g:rc_dir    = expand('~/.vim/rc')
  let s:toml      = g:rc_dir . '/dein.toml'
  let s:lazy_toml = g:rc_dir . '/dein_lazy.toml'

  " TOML を読み込み、キャッシュしておく
  call dein#load_toml(s:toml,      {'lazy': 0})
  call dein#load_toml(s:lazy_toml, {'lazy': 1})

  " 設定終了
  call dein#end()
  call dein#save_state()
endif

" もし、未インストールものものがあったらインストール
if dein#check_install()
  call dein#install()
endif

" ============================================
" Ag
" ============================================
let g:ackprg = "ag --nogroup --nocolor --column"
nnoremap <expr> <C-h> ':<C-u>tabnew<CR>:Ack ' . expand("<cword>") . '<CR>'

" For pyflakes color
highlight clear SpellBad
highlight SpellBad term=standout ctermfg=1 term=underline cterm=underline

" ============================================
" vim-easy-align
" ============================================
" Start interactive EasyAlign in visual mode (e.g. vipga)
xmap ga <Plug>(EasyAlign)
" Start interactive EasyAlign for a motion/text object (e.g. gaip)
nmap ga <Plug>(EasyAlign)

toml

  • /.vim/rc/dein.toml

    [[plugins]]
    repo = 'Shougo/dein.vim'
    
    [[plugins]]
    repo = 'mileszs/ack.vim'
    
    [[plugins]]
    repo = 'davidhalter/jedi-vim'
    
    [[plugins]]
    repo = 'vim-scripts/FuzzyFinder'
    
    [[plugins]]
    repo = 'vim-scripts/L9'
    
    [[plugins]]
    repo = 'vim-scripts/taglist.vim'
    
    [[plugins]]
    repo = 'vim-scripts/SQLUtilities'
    
    [[plugins]]
    repo = 'othree/vim-autocomplpop'
    
    [[plugins]]
    repo = 'kevinw/pyflakes-vim'
    
    [[plugins]]
    repo = 'thinca/vim-quickrun'
    
    [[plugins]]
    repo = 't9md/vim-quickhl'
    
    [[plugins]]
    repo = 'rhysd/clever-f.vim'
    
    [[plugins]]
    repo = 'scrooloose/nerdtree'
    
    [[plugins]]
    repo = 'rking/ag.vim'
    
    [[plugins]]
    repo = 'osyo-manga/vim-brightest'
    
    [[plugins]]
    repo = 'thinca/vim-fontzoom'
    
    [[plugins]]
    repo = 'junegunn/vim-easy-align'