Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all 5755 articles
Browse latest View live

[vim] バッファ 入門

$
0
0

概要

vimを長らく使っていながら、バッファの仕組みをロクに使わずに、1ファイル1プロセスで編集したまま長い年月が経過してしまった。

iTerm2を始めとするターミナルで画面分割をすることで、複数ファイルの編集も容易に行えるが、やはりバッファを使った複数ファイル操作に慣れておくことで、関連するvimの機能やvimプラグインをさらに活用できる。

ということで、この記事ではvimのバッファをロクに使ったことがない私が、学びながらその過程をメモして、同じような立場の人が役立てるようにする。

※ この記事は、まだまだ未熟なvimmerの私が勉強しながらそれをまとめたモノです。誤りや誤解が生じかねない表現がある場合、ご指摘頂ければ速やかに修正します。

とりあえず複数ファイル開こうや

作業用ディレクトリに以下の3つのファイルを作る。無いようなRubyのコードだけど今回はまったく関係ないので読まなくて良い。

a.rb
defadd(a,b)a+bend
b.rb
require_relative'a'defget_totaladd2,3end
c.rb
require_relative'b'pget_total

3つのファイルがあるディレクトリで、以下のコマンドを実行しよう。3つのファイル全てが1つのvimプロセスで読み込まれる。

$ vim *.rb

vimではメモリに展開したファイルの内容をバッファと呼ぶらしい。

vimプロセス上で、どんなバッファが読み込まれているかは:lsコマンドで確認できる。

:ls1 %a"a.rb"                         line 12"b.rb"                         line 03"c.rb"                         line 0
Press ENTER or type command to continue

画面に表示するバッファを切り替えようや

vimプロセスを起動した段階では、対象の3ファイルのうち先頭のファイル(ここではa.rb)が画面上に表示されている。

a.rb
defadd(a,b)a+bend

これをb.rbや、c.rbに切り替えたい。そんなときに使うコマンドが、:bprev:bnext:bfirst:blastだ。

コマンド効果
:bprev1つ前のバッファに切り替え
:bnext1つ後のバッファに切り替え
:bfirst先頭のバッファに切り替え
:blast末尾のバッファに切り替え

a.rbを開いてる状態で、b.rbにバッファを切り替えよう。

:vnext

b.rbに切り替わった。

b.rb
require_relative'a'defget_totaladd2,3end

同様に:bnextを再度実行するとc.rbが開かれ、続けて:bprevを実行すると、またb.rbに帰ってくる。

:bfirstを実行すると常に先頭のa.rbに、:blastを実行すると常に末尾のc.rbに切り替わることは想像に難くないだろう。

え?切り替えめんどくさくない?

誰だってそう思う。少ないタイプ数で高度な処理をこなせることに定評のあるvimで、何が楽しくて:bnextだの長ったらしいコマンドを打ち込まなければならないのか。それもバッファを切り替えるたびに。

ということで、大抵のvimmerはそれらのコマンドにキーバインドを割り当てる。流行りは[bとからしいが、ここでは私が採用したキーバインドの例をあげる。もちろんキーバインドにはvimmerそれぞれに拘りがあると思うので使いやすければ何でも良い。

.vimrc
nnoremap <silent><C-j>:bprev<CR>
nnoremap <silent><C-k>:bnext<CR>

<C-j><C-k>は、標準で割と空いてるのにホームポジション的に死ぬほど使いやすいので、他に頻出の操作を割あることがない場合はこれで良さそう。

これでバッファの切替がメタクソに早くなった。:bfirst:blastは、個人的にはそんな使わない気がするので見送り。使うのであれば必要に応じて他のキーバインドを探す。

バッファたくさん開いたときはどうするのさ

なんやかんやでバッファリストが以下のようになったよしよう。

:ls1 %a"a.rb"                         line 12"b.rb"                         line 03"c.rb"                         line 04"d.rb"                         line 05"e.rb"                         line 06"f.rb"                         line 07"g.rb"                         line 08"h.rb"                         line 09"i.rb"                         line 010"j.rb"                         line 011"k.rb"                         line 0
Press ENTER or type command to continue

おいおい、俺はg.rbを開きたいんだが、まさか:bnextを6回叩かせる気かい?
(と言っても<C-k>にバインドしていれば6<C-k>で済むが)

そんなときは:lsで出てきたバッファリストに目を通そう。左側にバッファごとに数字(バッファ番号)が振られているのがわかるだろう?

:b Nコマンドでは、バッファ番号を指定してバッファを開くことができる。よって、g.rbを開きたい場合はこうだ。

:b7

一発でバッファ番号7が割り当てられたg.rbに移動できる。ステキ!

さらに、ファイル名がわかっていて短いなら以下のほうが早い。

:bg.rb

ちなみにファイル名の入力はTabでちゃんと補完されるので、そんなにバッファが多くないなら:bからのTab何度かが一番早いかも。

ファイル編集中にバッファ切り替えられないぞオイ

a.rbを適当に編集して保存せずに

a.rb
defsub(a,b)a-bend

おっと、呼び出し元のb.rbも編集しないとな、:bnextで切り替えっと

E37: No write since last change (add !to override)

は?(激怒)

どうやらvimでは、バッファを保存せずに閉じると警告が出るようだ。よくある「保存してますがよろしいですか?」的なヤツ。

役立つときは役立つ警告だけど、サクサクバッファを切り替えたいときにこれが邪魔になりかねない。そういう場合は.vimrcに以下を追記することで、バッファを保存せずに切り替えることを許可できる。

.vimrc
:set hidden

これでよりサクサクバッファを切り替えられるようになる。

ただし、保存漏れによる事故も起こりやすくなるので、保存を忘れないような工夫が大事。手前味噌だが以下の記事に役立つTipsが載ってる。

vim中級者未満が捗った設定やプラグイン[gif付き] - Qiita

不要になったバッファを消そう

c.rbを削除しよう。削除すると言ってもファイルを削除するわけじゃく、バッファを削除する(≒編集を終了する)には、以下の:bd Nを使う。Nにはバッファ番号を指定する。
(現在開いているバッファを消すだけなら単に:bdでも可)

c.rbのバッファ番号が3であるとき

:bd3

:lsで見ると、c.rbが消えているのがわかる。

:ls1h"a.rb"                         line 22 %a"b.rb"                         line 14h"d.rb"                         line 15h"e.rb"                         line 16h"f.rb"                         line 17h"g.rb"                         line 18h"h.rb"                         line 19h"i.rb"                         line 110h"j.rb"                         line 111h"k.rb"                         line 1
Press ENTER or type command to continue

が、実はc.rbのバッファは消えていないのだ。:bdはバッファリストから消すコマンドである。(正確にはバッファに関連したオプション、変数、マッピングなどが消える)

事実、バッファリストから消したバッファも含めてた真のバッファリストを表示する:ls!を実行するとc.rbがしぶとく生き残っていることがわかる。

:ls!1h"a.rb"                         line 22 %a"b.rb"                         line 13u#    "c.rb"                         line 14h"d.rb"                         line 15h"e.rb"                         line 16h"f.rb"                         line 17h"g.rb"                         line 18h"h.rb"                         line 19h"i.rb"                         line 110h"j.rb"                         line 111h"k.rb"                         line 1
Press ENTER or type command to continue

あとかたもなく消したいなら:bw [N]を使おう。

:bw3

:ls!を使っても表示されないことがわかる。

:ls!1h"a.rb"                         line 22 %a"b.rb"                         line 14h"d.rb"                         line 15h"e.rb"                         line 16h"f.rb"                         line 17h"g.rb"                         line 18h"h.rb"                         line 19h"i.rb"                         line 110h"j.rb"                         line 111h"k.rb"                         line 1
Press ENTER or type command to continue

言うてバッファ削除ってそんな使う?

バッファにファイルを追加したい

a.rbしか開いていない状態で

:ls1 %a"a.rb"                         line 1
Press ENTER or type command to continue

b.rbを開きたい場合は:e [パス]コマンドを実行しよう。

:eb.rb

b.rbがバッファに読み込まれ、かつアクティブな状態になっている。

:ls1 #h"a.rb"                         line 12 %a"b.rb"                         line 1
Press ENTER or type command to continue

この辺は無理せずディレクトリツリーなプラグインを入れたほうが幸せになるぞ!

スクリーンショット 2018-05-26 21.00.07.png

稚拙なvim記事ですがよろしければ

参考


VimでNginxの設定ファイルのシンタックスを効かせる(個人の環境でやる場合)

$
0
0

CentOS7の環境にNginxをインストールして、設定ファイルを書く機会が結構あり、ちょっとでも作業しやすくしたいと思ってやってみた。

手順

  1. あらかじめ必要なフォルダを作成する(すでにある場合は不要)

    $ mkdir -p ~/.vim/syntax/
    
  2. nginx.vimファイルを~/.vim/syntax/直下にダウンロードする

    $ cd ~/.vim/syntax/
    $ curl -Lkvf https://www.vim.org/scripts/download_script.php?src_id=19394 -o nginx.vim
    
  3. filetype.vimファイルを~/.vim/直下に作成する

    $ cd ~/.vim/
    $ vi filetype.vim
    
    filetype.vim
    auBufRead,BufNewFile/etc/nginx/*,/usr/local/nginx/conf/* 
            \if&ft ==''        \|setfiletype nginx 
            \|endif

これで出るはず

参考

KaoriYa - Vimの[:Tutorial]を再現してみる

$
0
0

Vimをメインエディタにし続けるために一念発起してキーボードをUSに買い替えました。HHKBlite2から、ノートパソコンでずっとお世話になっていた赤鼻のニクい奴に変わりました。「もういいアイソレーションも出てるから大丈夫」と信じてたんですけど、やっぱりアイソレーション向いてません…

さておき、人生初のUSキーボードなので記号打ちに慣れてないし、ことvimにおいて記号に慣れるのは必須課題でもあるわけで、」じゃあvimtutorやっておくかー」ということでラクに起動できるようにKaoriYa版vimでコマンド化されていた:Tutorialパク作ってみました。

もうバッチではso /tutor/tutor.vimあるんじゃねーの?

はい、基本それコピーして関数化すれば終わりっす。

vimtutor.vim
function!s:vimtutor(...) abort
    lets:ext=""ifa:0>0lets:ext=".".a:1elselets:lang=""::" 4. Making the copy and exiting Vim:lets:tutorbuf= bufnr('vimtutor')ifs:tutorbuf>0call execute('b '.s:tutorbuf)e! $TUTOR
    elseifv:cmdbang
            e! $TUTOR
        elsee $TUTOR
        endifendiff~/vimtutor
endfunction

command!-nargs=? -bang Tutorial calls:vimtutor(<f-args>)

変更箇所

vimtutor.batで使っていた$xx変数を再現するために関数で引数を取るようにしてあります。あとはロードするときにガチャガチャやるだけなんだけどこれで正しいのかわかっていないです。バッファがカブらないように配慮してるつもりなんですけど、果たして本当にこれでいいのやら…KoRoNさんこれであってます…?

で、はじめてのUSキーボードはどうなのかというと…

:押せないです。(半ギレ)

Vim を使ってみる。

$
0
0

Vimという、ちょと変わったエディタがあるそうなので
使ってみたいと思います。

Vimのインストール

公式サイトのDLページ
https://www.vim.org/download.php

Ubuntuの方は

sudo apt install vim

Vimの使い方

vi

もしくは

vim

で起動
ターミナルが開いたんだけど、、、

:q

で、終了

vimturtor

で丁寧に使い方を教えてくれます。

余談

ターミナルを半透明にすると、カッコイイですよ
Screenshot from 2018-05-27 19-27-56.png

追記

設定ができるみたいです。
https://qiita.com/okamos/items/d7fdbee03c4857b1ce20

普通に、atomでいいや

参考リンク

Vin公式の
https://www.vim.org/
Uubnutのターミナルを半透明にする方法
https://blogs.yahoo.co.jp/zakki_roku/64842066.html

個人設定込みNeovimのDokcerイメージを作成した

$
0
0

個人設定込みNeovimのDockerイメージを作成した。

ビルド用のスクリプトをGithubにアップロードして、Docker HubにAutomated Buildを設定した。

動作環境

以下の環境で使用している。

  • MacBook'12 2017 core-m3
  • macOS High Sierra
  • Docker for Mac

使い方

# ビルド
git clone https://github.com/succi0303/my-neovim-dockerized.git
cd my-neovim-dockerized
docker build -t nvim .# 実行
docker run -it--rm-v$(pwd):/usr/src/nvim nvim [filename]

または

docker pull succi0303/neovim
docker run -it--rm-v$(pwd):/usr/src/nvim succi0303/neovim [filename]

毎回、docker runを打ち込むのは面倒なので、シェルのrcファイルでnvimのエイリアスに上記コマンドを設定する。

内容

2018年5月時点の内容。Githubのファイルは随時アップデートしていく。

  • Dockerfile
FROM ubuntu:latestLABEL maintainer="succi0303@gmail.com"RUN apt-get update -y&&\
    apt-get install-y software-properties-common &&\
    apt-add-repository -y ppa:neovim-ppa/stable &&\
    apt-get update -y&&\
    apt-get install-y\
    curl \
    git \
    language-pack-ja-base \
    language-pack-ja \
    neovim \
    python-dev \
    python-pip \
    python3-dev \
    python3-pip

ENV LANG="ja_JP.UTF-8" LANGUAGE="ja_JP:ja" LC_ALL="ja_JP.UTF-8"RUN pip3 install--upgrade neovim

RUN curl -fLo /root/.local/share/nvim/site/autoload/plug.vim --create-dirs\
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

COPY .config /root/.configRUN nvim +PlugInstall +qa

WORKDIR /usr/src/nvimENTRYPOINT ["nvim"]
  • .config/nvim/init.vim
" vim-plugcall plug#begin('~/.local/share/nvim/plugged')

Plug 'airblade/vim-gitgutter'
Plug 'cespare/vim-toml'
Plug 'cohama/vim-smartinput-endwise'
Plug 'deton/jasegment.vim'
Plug 'easymotion/vim-easymotion'
Plug 'fuenor/qfixgrep'
Plug 'fuenor/qfixhowm'
Plug 'kana/vim-smartinput'
Plug 'kana/vim-textobj-indent'
Plug 'kana/vim-textobj-user'
Plug 'kannokanno/previm'
Plug 'mattn/emmet-vim'
Plug 'nathanaelkane/vim-indent-guides'
Plug 'scrooloose/nerdtree'
Plug 'Shougo/denite.nvim',{'do':':UpdateRemotePlugins'}
Plug 'Shougo/deoplete.nvim',{'do':':UpdateRemotePlugins'}
Plug 'sjl/badwolf'
Plug 'thinca/vim-partedit'
Plug 'thinca/vim-qfreplace'
Plug 'tpope/vim-fugitive'
Plug 'tpope/vim-markdown'
Plug 'tyru/open-browser.vim'
Plug 'tpope/vim-surround'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'vim-ruby/vim-ruby'
Plug 'vim-syntastic/syntastic'call plug#end()set encoding=UTF-8set fileencoding=UTF-8set termencoding=UTF-8set backspace=indent,eol,startset hidden
set showcmd
set cursorline
setnumberset laststatus=2set showmatch
set incsearch
set display+=lastline
set wildmenu
set ignorecase
set clipboard=unnamed

set tabstop=2set shiftwidth=2set softtabstop=2set expandtab
set smarttab
set autoindent
set smartindent

augroup fileTypeIndent
  autocmd!
  autocmd BufNewFile,BufRead *.pysetlocal tabstop=4 softtabstop=4 shiftwidth=4
augroup END

nnoremap s <Nop>
nnoremap ss :<C-u>sp<CR>
nnoremap sv:<C-u>vs<CR>
nnoremap sj <C-w>j
nnoremap sk <C-w>k
nnoremap sl<C-w>l
nnoremap sh<C-w>h
nnoremap sq :<C-u>q<CR>
nnoremap st:<C-u>tabnew<CR>
nnoremap sn gt
nnoremap sp gT
nnoremap sQ :<C-u>tabclose<CR>

nnoremap <silent>[b:bprevious<CR>
nnoremap <silent>]b:bnext<CR>
nnoremap <silent>[B :bfirst<CR>
nnoremap <silent>]B :blast<CR>

nnoremap <ESC><ESC>:nohlsearch<CR>set wildmode=list,full

set grepformat=%f:%l:%m,%f:%l%m,%f\ \ %l%m,%fset grepprg=grep\ -nh

colorscheme badwolf
set termguicolors
syntax on" denite.vim
nnoremap <silent>,b:Denite buffer<CR>
nnoremap <silent>,c:Denite changes<CR>
nnoremap <silent>,f:Denite file<CR>
nnoremap <silent>,g:Denite grep<CR>
nnoremap <silent>,h:Denite help<CR>
nnoremap <silent>,l:Denite line<CR>
nnoremap <silent>,t:Denite tag<CR>call denite#custom#map('insert','<esc>','<denite:enter_mode:normal>','noremap')call denite#custom#map('normal','<esc>','<denite:quit>','noremap')call denite#custom#map('insert','<C-n>','<denite:move_to_next_line>','noremap')call denite#custom#map('insert','<C-p>','<denite:move_to_previous_line>','noremap')call denite#custom#map('insert','<C-j>','<denite:do_action:split>','noremap')call denite#custom#map('insert','<C-k>','<denite:do_action:vsplit>','noremap')call denite#custom#option('default','prompt','>')call denite#custom#option('default','direction','top')" deoplete.nvimletg:deoplete#enable_at_startup =1" vim-easymothonletg:EasyMotion_startofline=0letg:EasyMotion_smartcase=1" <Leader>f{char} to move to {char}
map <Leader>f<Plug>(easymotion-bd-f)
nmap <Leader>f<Plug>(easymotion-overwin-f)" <Leader>s{char}{char} to move to {char}{char}
map <Leader>s <Plug>(easymotion-bd-f2)
nmap <Leader>s <Plug>(easymotion-overwin-f2)" Move to Line
map <Leader>L <Plug>(easymotion-bd-jk)
nmap <Leader>L <Plug>(easymotion-overwin-line)" Move to word
map <Leader>w<Plug>(easymotion-bd-w)
nmap <Leader>w<Plug>(easymotion-overwin-w)" n-character search
map / <Plug>(easymotion-sn)
omap / <Plug>(easymotion-tn)
map n<Plug>(easymotion-next)
map N <Plug>(easymotion-prev)"hjkl
map <Leader>l<Plug>(easymotion-lineforward)
map <Leader>j<Plug>(easymotion-j)
map <Leader>k<Plug>(easymotion-k)
map <Leader>n<Plug>(easymotion_linebackward)" JpFormatset formatexpr=jpfmt#formatexpr()" nerdtreeletg:NERDTreeShowHidden=1letg:NERDTreeMapActivateNode="<CR>"let file_name = expand("%:p")
nnoremap <C-e>:NERDTreeToggle<CR>" open-browserletg:netw_nogx=1
nmap gx <Plug>(openbrowser-smart-search)
vmap gx <Plug>(openbrowser-smart-search)" syntasticletg:syntastic_auto_loc_list=0" vim-airlineletg:airline#extentions#tabline#enabled =1letg:airline#extentions#tabline#show_buffers =0letg:airline#extentions#tabline#tab_nr_type =1letg:airline#extentions#tabline#fnamemod =":t"letg:airline_theme='badwolf'if!exists('g:airline_symbols')letg:airline_symbols={}endifletg:airline_symbols.branch =''letg:airline_symbols.readonly =''letg:airline_symbols.linenr =''" vim-indent-guidesletg:indent_guides_auto_colors=0
autocmd VimEnter,Colorscheme * :hi IndentGuidesOdd ctermbg=gray
autocmd VimEnter,Colorscheme * :hi IndentGuidesEven ctermbg=darkgray
letg:indent_guides_enable_on_vim_startup=1letg:indent_guides_guide_size=1" vim-partedit
vnoremap <C-l>:Partedit<CR>
noremap <C-h>:ParteditEnd<CR>" vim-smartinput-endwisecall smartinput_endwise#define_default_rules()

工夫したところ

日本語入力を有効にする

ubuntu:latestのイメージには日本語環境が入っておらず、日本語入力が文字化けする。

apt-getでlanguage-pack-ja-baselanguage-pack-jaをインストールし、環境変数にLANG="ja_JP.UTF-8"等を設定することで日本語入力が可能になる。

プラグインマネージャにvim-plugを使う

本当はdein.vimを使いたかったが、docker buildでエラーが発生して使用を諦め、代わりにvim-plugを使用した。RUN nvim +PlugInstall +qaでプラグインインストール用のPlugInstallコマンドを外から叩いている。

dein.vimでもRUN nvim +"call dein#install()" +qaでインストールコマンドの実行はできたが、コマンドがnon-zeroを返す云々でビルドが止まる。詳細な条件は特定できなかったが、どうやらプラグインの数が10件程度を越えると発生するようである。プラグインをinit.vimに直書きするパターンとdein.tomlに分けるパターンを試してみたがどちらも同じ結果だった。

python-providerpipでインストールする

ubuntuの場合、apt-getpython-providerのインストールまで実行できるが、denite.vimを動かすにはバージョンが足りなかった。RUN pip3 install --upgrade neovimpipからインストールすることで解決できた。

課題事項

open-browser

コンテナ内でブラウザを開こうとするため、正常に動作しない。open-browserが動かないため、自動的にprevimも使えない。解決策は今のところ思いつかない。

vim-fugitive

vim-fugitiveでGitの操作を行う場合、コンテナ内のGitが利用される。できれば、ホストの設定を引き継ぎたい。コンテナからホストの.gitconfig.sshフォルダを参照させれば解決できるかも。

howm

qfixhowmでメモの管理をしているが、コンテナ版Neovimからどうやってhowmを使うか。howmフォルダを参照するデータコンテナを作って、docker-composeを設定することを検討中。

参考

Docker in Action」を読みながら試行錯誤した。

Vim patchダイジェスト [2018/05] (仮)

$
0
0

Vim patchダイジェスト [2018/05] (仮)
(8.0.17818.0.1850, 8.1.00008.1.xxxx)

  • 8.0.1794: :four_leaf_clover:8.0.1743でリネームされたterminalウィンドウ系のオプション名('termwinsize', 'termwinscroll', 'termwinkey')の旧オプション名('termsize', 'terminalscroll', 'termkey')を削除しました。(関連patch: 8.0.1743)
  • 8.0.1792: :four_leaf_clover:コマンドライン引数に-?を追加しました。--help-hと同様にUsageを表示します。
  • 8.0.1790: :close'winfixwidth''winfixheight'の設定を尊重しない場合があるのを修正しました。
  • 8.0.1787: :four_leaf_clover:コマンドラインモードのCTRL-R_CTRL-Lでカーソル行を挿入するようにしました。
  • 8.0.1783: :four_leaf_clover:Windowsコンソール版Vimに256色対応を追加しました。
  • 8.0.1782: :four_leaf_clover:getqflist()の戻り値のリストの各辞書とsetqflist()の第1引数のリストの各辞書にmoduleエントリを追加しました。また、'errorformat'の基本項目に%oを追加しました。%oの情報はgetqflist()moduleエントリに設定されます。
  • 8.0.1781: :four_leaf_clover:quickfixウィンドウを開く時にファイル名を短縮化/単純化するようにしました。

凡例

表記意味
:four_leaf_clover:新機能、大幅な仕様変更
'hoge'オプション (:h options参照)
:hogeExコマンド (:h :index参照)
hoge()組み込み関数 (:h functions参照)
v:hogeVim定義済変数 (:h v:参照)
+hogefeature (:h +feature-list参照)

方針

こちらを参照。

Bash Script の自分的まとめ

$
0
0

Summary

bash script の自分的まとめ
bash script むずかしい・・・

Environment

$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.13.4
BuildVersion:   17E202

01. Setting of Bash

Update bash

# 新しいbashをインストール$ brew install bash

# インストールしたshellのパスを追加する$ sudo vim /etc/shells
    /usr/local/bin/bash

# ターミナルのデフォルトのshellを設定する$ chsh -s /usr/local/bin/bash

# 使われているshellの確認$ echo$SHELL
/usr/local/bin/bash

$ echo$BASH_VERSION 
    4.4.19(1)-release

Config files

File NameDescription
.bash_profileログイン時に1回だけ実行される。環境変数を書くものとして扱うのが良い
.bashrcシェルを起動するたびに実行される。callmekohei的には使ってない
.inputrcここはぜひとも変えておく!
.bash_profile
if[-f ~/.bashrc ];then. ~/.bashrc
fi# 言語の設定export LANG=en

# パスを通す# MacOSXは何もしなくてもパスが自動設定されている# see also: http://takuya-1st.hatenablog.jp/entry/2013/12/14/040814# $ man -k path_helper# $ man path_helper 8function setExtraPath (){# Homebrewのappにパスを通すlocal cellar=/usr/local/bin
    export PATH="${cellar}":"${PATH}"# opensslにパスを通すlocal openssl=/usr/local/opt/openssl/bin
    export PATH="${openssl}":"${PATH}"}

setExtraPath
.bashrc
# appから自動的に記述されるコマンドとか[-f ~/.fzf.bash ]&&source ~/.fzf.bash
.inputrc
set editing-mode vi

# requires >= Bash 4.3set show-mode-in-prompt on

set show-all-if-ambiguous on
set completion-ignore-case on

set keymap vi-command
    "\C-p": history-search-backward
    "\C-n": history-search-forward

set keymap vi-insert
    "\C-p": history-search-backward
    "\C-n": history-search-forward
    "\C-h": backward-char
    "\C-l": forward-char

02. Reference of Bash

read! read! read!

$ man bash
$ info bash

03. Setting of Bash script

Run Bash script

$ vim foo.bash
    echo$BASH_VERSION$ bash foo.bash
    4.4.19(1)-release

Run Bash script ( in Vim with vim-quickrun )

.vimrcは下記のようにする

.vimrc
" see also: :help ft-sh-syntax
autocmd FileTypeshletg:is_bash=1
autocmd FileTypeshletg:sh_no_error=1letg:quickrun_config.sh={    \'command':'bash'\}

:QuickRun

$ vim foo.bash
    echo$BASH_VERSION

:QuickRun
    4.4.19(1)-release

shebangを書く時は下記のように書くのが無難

$ vim foo.bash
    #!/usr/bin/env bashecho$BASH_VERSION

:QuickRun
    4.4.19(1)-release

shebangで実行shellを指定できる

$ vim foo.bash
    #!/bin/bashecho$BASH_VERSION

:QuickRun
    3.2.57(1)-release

Auto-completet

terminalでのauto-complete

$ brew install bash-completion@2
.bash_profile
# Add the following line to your ~/.bash_profile:if[-f /usr/local/share/bash-completion/bash_completion ];then. /usr/local/share/bash-completion/bash_completion
fi

vimでのauto-complete

" 調べ中〜 (^_^;;;

04. Bash script cheatsheet

Must see: Bash scripting cheatsheet

Basic

comment

# comment line

commnad

ls# ls is command (コマンドはstatus codeをかえす success 0, failed others )ls>/dev/null 2>&1  # >/dev/null 2>&1 show gabage (表示を出力しない)echo$?# $? shows previous status code ( success 0, failed others )

variable, array and function

# variablefoo='
    foo
    bar
    baz
'# arraybar=(
    foo
    bar
    baz
)# function ( available local variables )
baz (){local foo=hello
    echo"${foo}"}# expansion $echo"${foo}"echo"${bar[@]}"# run functionreturnValue=$( baz )echo${returnValue} world

result

    foo
    bar
    baz

foo bar baz
hello world

condition if

see also : $ help test
ifstatus codeをみている

# lsコマンドが正常に終了したかどうか?ls>/dev/null 2>&1
if["$?"= 0 ];then
    echo'success!'else
    echo'failed!'fi# コマンドがあるかどうか?if type foo >/dev/null 2>&1 ;then
    echo'foo command exists!'else
    echo'foo command not exists!'fi# ファイルがあるかどうか?if[-e ./foo.txt ];then
    echo"foo.txt found"else
    echo"foo.txt NOT found."fi# フォルダがあるかどうか?if[-d ./foo/ ];then
    echo"folder found"else
    echo"folder NOT found."fi

Loop ( while and for )

see also: $ help read

foo='
    foo     bar
    bar     bar
    baz     bar
'echo"${foo}" |
    while read-r line
    do
        echo"${line}"done

for v in"${foo}"do
    echo"${v}"done

result

foo     bar
bar     bar
baz     bar


    foo     bar
    bar     bar
    baz     bar

Quoting and IFS

$ man bash
    /quoting

Quoting  is used to remove the special meaning of certain characters or
words to the shell.  Quoting can be used to disable  special  treatment
for special characters, to prevent reserved words from being recognized
as such, and to prevent parameter expansion.

$ man bash
    /ifs

The  Internal  Field  Separator  that is used for word splitting
after expansion and to split lines  into  words  with  the  read
builtin  command.   The  default  value  is  ``<space><tab><new-
line>''.
NameExampleException
single quote'foo'None
double quote"foo"$ \ `
back slash/$None
foo='
    foo
    bar
    baz
'# IFSがキャンセルされるecho"${foo}"##    foo#    bar#    baz## IFSが効いているecho${foo}#foo bar baz

Subshell

tmp$ cd foo/ ;ls
FSharp.Core.dll foo.exe         foo.exe.mdb     foo.fsx
foo$ pwd
/Users/callmekohei/tmp/foo

tmp$ (cd foo/ ;ls)
FSharp.Core.dll foo.exe         foo.exe.mdb     foo.fsx
tmp$ pwd
/Users/callmekohei/tmp

Positional Parameters

positionmeaning
$0file name
$@all parameters
"$@"all parameters( turn off IFS )
$1first parameter
$2second parameter
for v in$@do
    echo"${v}"done

echo'-----'for v in"$@"do
    echo"${v}"done

result

$ bash foo.bash 'hello world''foo bar baz'

hello
world
foo
bar
baz
-----
hello world
foo bar baz

Command substitution

$ man bash
    /command substitution

Command substitution allows the output of a command to replace the com-
mand name.  There are two forms:

          $(command)
    or
          `command`
# ただのlsという文字列foo=ls
echo"${foo}"# ls# ls コマンドbar=$(ls)echo"${bar}"# Desktop# Documents# Downloads# Library# Movies# Music# Pictures# Public# mono64# tmp

MQL on Vim ( VimでMQLをかいてみる )

$
0
0

Summary

MQLという言語をVimで書いて実行する環境を作ってみましたっ

foo.gif

Thanks

// twitter
@haxe
@matthn
@raa0121

Environment

$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.13.3
BuildVersion:   17D47

$ wine --version
wine-3.0

$ mono --version
Mono JIT compiler version 5.4.1.6 (tarball Mon Dec 11 14:59:42 GMT 2017)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
    TLS:           normal
    SIGSEGV:       altstack
    Notification:  kqueue
    Architecture:  amd64
    Disabled:      none
    Misc:          softdebug 
    LLVM:          supported, not enabled.
    GC:            sgen (concurrent by default)$ wine cmd
Microsoft Windows 10.0.15063 (3.0)

Z:\Users\callmekohei\.config\>

MetaEditorに F5 を送る

こんな感じ(F#という言語で書いてます)

abc.fsx
openSystem.Runtime.InteropServicesopenSystem.Windows.Forms[<DllImport"user32.dll">]externnativeintFindWindow(stringclassName,stringwindowName)[<DllImport"user32.dll">]externboolSetForegroundWindow(nativeinthwnd)FindWindow("MetaQuotes::MetaEditor::5.00",null)|>SetForegroundWindow|>ignoreSendKeys.Send"{F5}"

Quickrunの設定とBash script

letg:quickrun_config.mql4 ={        \'exec':['%c %o %s:p:t']        \,'command':'bash'        \,'cmdopt':'$HOME/tmp/quickrunMQL/quickrunMQL.bash'    \}

^Mctrl V -> ctrl Mで入力する

foo.bash
# ===========================================================================#  FILE    : foo.bash#  AUTHOR  : callmekohei <callmekohei at gmail.com>#  License : MIT license# ===========================================================================file=$1MetaTraderHOME=("$WINEPREFIX/drive_c/Program Files/OANDA - MetaTrader")MetaEditor=("${MetaTraderHOME[@]}"/metaeditor.exe)SendsKeyCMD=$(cd$(dirname$0)&&pwd)/quickrunMQL

wine "${MetaEditor[@]}" /s /log:foo.log /compile:$file 2>/dev/null
iconv -f utf-16 -t utf-8 foo.log | sed-e"s/^M//g"> bar.log

echo"───── MetaEditor Compiler ─────"cat bar.log

if cat bar.log | fgrep 'Result 0 error(s), 0 warning(s)' 1>/dev/null ;then

    echo"───── MetaTrader Terminal ─────"echo$SendsKeyCMD | wine cmd 1>/dev/null
    echo$SendsKeyCMD | wine cmd 1>/dev/null
    echo$SendsKeyCMD | wine cmd 1>/dev/null
    cat"${MetaTraderHOME[@]}"/MQL4/Logs/$(date +"%Y%m%d").log | tail-4 | sed-e"s/\\^M//g"fi

rm foo.log
rm bar.log

課題

とりあえず動く、という程度なのでもっと洗練させたい

TODO: 2018/05/29
もうすこしわかりやすく書く!

vimで関数定義元のジャンプする方法

$
0
0

導入方法

mac
brew install ctags

Linux
sudo apt-get install exuberant-ctags

使い方

プロジェクトに移動して
$ ctags -R

これでプロジェクト直下にtagsファイルが作成されます。


移動したい関数の上で
control + ]
で関数定義元にジャンプできます。

元の場所に戻る場合は
control + t

vimgrep &検索と置換

$
0
0

vim上でディレクトリ内一括検索・置換。
Sublime Text 3でいう Cmd+Shift+fみたいな。

Usage

:vim[pattern][targets]

もしくは

:vimgrep[pattern][targets]

Patterns & Targets

unko という文字列を *.go のみに限定して検索したい場合

:vim/unko/ **/*.go

src ディレクトリ以下にある unko を検索したい場合

:vim/unko/src/**/*

Quickfix

.vimrcに以下を記述すると、検索後に自動で Quickfixが起動する。

autocmd QuickFixCmdPost *grep* cwindow$

検索→置換

便利なプラグインがあるのでそれを使う。

https://github.com/thinca/vim-qfreplace

以下で置換バッファが開く。

:vim/unko/ **/*.go:Qfreplace

編集したい語句を検索して ciwUNKOESCn. ... みたいな。

:%s/unko/UNKO/gc

でも可。

chktexによるダッシュに関する警告を黙らせる方法

$
0
0

TL;DR

chktexWrong length of dash may have been used. (8)という警告を出してきてうるさい時、黙らせるには以下の二通りの方法がある。

  • 実行時オプションにchktex -n 8と8番の警告を出さないように指示する
  • 該当行の最後に% chktex 8とつけることで「この行に関しては警告の8番を無視する」ことを指示する

はじめに

LaTeXのチェックツールとしてchktexというものがあります。TexLiveにデフォルトで入っており、AtomやVimなどのエディタがLinterツールとして使うので、知らないうちに使っていることも多いでしょう。多くの文法ミスや環境のとじ忘れなどを指摘してくれるのでありがたいのですが、ダッシュに関する警告がうるさい時があります。その黙らせ方を紹介します。

ハイフン、En dash、Em dash

英語にはハイフン「-」に似たものが三種類あります。短い順に「ハイフン (Hyphen)」「En dash」「Em dash」の名前がついています。「En」と「Em」はそれぞれ「n」と「m」のことで、ハイフンの長さがその文字と等しいことに由来します。

ハイフン「-」は普通、二つ以上の単語を結びつける場合に使います。科学論文では、二つ以上の単語がひとまとまりの形容詞として使われる場合に、間にハイフンを入れる用法で使われることが多いです。

例えば「この問題はwell definedだ」と言いたい時には1

This probrem is well-defined.

と「well」と「defined」の間にハイフンを入れます。同様に「一次の摂動」も「the first-order perturbation」です。

対して、En dashは、「二つの場所を結ぶ」ようなイメージ、英単語で言えば「through」に近い使われ方をします。科学論文でもっとも使われるのは、「pp. 24–32」のように文献を引用する際のページ範囲を指定する時でしょう。

Em dashは、カッコのような使われ方をします。つまり、Em dashで囲んだ語句を本文に埋め込んだり、最後に注釈的にEm dashを頭につけた文章を置いたりできます。Get it writeにはこんな説明があります。

Dashes can be used in pairs like parentheses—that is, to enclose a word, or a phrase, or a clause—or they can be used alone to detach one end of a sentence from the main body.

さて、三つのうち「Em dash」の使い方は残りの二つとわりと異なりますが、ハイフンとEn dashの使い分けは面倒です。特に面倒なのが「人名」です。

例えば原子間の経験的ポテンシャルとしてよく用いられる「レナード=ジョーンズ ポテンシャル (Lennard-Jones potential)」の「Lennard-Jones」は「Lennard」さんと「Jones」さんの二人の名前をつなげたものではなく、「John Edward Lennard-Jones」という一人の名前に由来します。日本語では「レナード=ジョーンズ」などと「=」で結んだりしますが、英語ではハイフンでつなぐのが一般的です。

一方、分子動力学法でよく用いられる「能勢=フーバー熱浴 (Nosé–Hoover thermostat)」は、能勢さん(Nosé)とフーバーさん(Hoover)の二人の名前に由来し、論文では「En dash (–)」でつなぐのが一般的です。

さて、この使い分けをchktexは認識できません。例えば以下のようなソースを書きます。

test.tex
\documentclass{article}\begin{document}
We adopt Nos\'e--Hover thermostat for controlling temperature.

The Lennard-Jones potential is named after J. Lennard-Jones.
\end{document}

これをchktexにかけると、 最初の行に文句を言います。

$ chktex -q test.tex
Warning 8 in test.tex line 4: Wrong length of dash may have been used.
We adopt Nos\'e--Hover thermostat for controlling temperature.  
               ^^

ちなみに「-q」はバージョン情報を表示しないオプションです。VimでALEを使っていると、こんな感じで指摘されます。

image.png

前置きが長くなりましたが、これをなんとかしましょう、という話です。

ソース中に指示文を入れる

先程の警告「Wrong length of dash may have been used.」の最初に「Warning 8 in test.tex」という行がありましたが、これは「この警告番号が8番である」ことを示しています。そこで、文中に「この行に含まれる8番の警告は無視せよ」という指示文を入れるとchktexはそれに従います。

test2.tex
\documentclass{article}\begin{document}
We adopt Nos\'e--Hover thermostat for controlling temperature. % chktex 8

The Lennard-Jones potential is named after J. Lennard-Jones.
\end{document}

先程の行の後ろに% chktex 8と追加しました。こうするとchktexはこの行に関しては文句を言いません。

$ chktex -q test2.tex  

コマンドラインオプションで指示する

さて、問題のある行が一行だけなら上記の解決策で良いですが、「Nos\'e--Hover」なんて論文中でたくさん出てくるでしょうし、他にも「Suzuki--Trotter decomposition」なんかも文句を言われます。そこで、コマンドラインオプションで8番の警告を殺してしまいます。

$ chktex -q test.tex
Warning 8 in test.tex line 3: Wrong length of dash may have been used.
We adopt Nos\'e--Hover thermostat for controlling temperature.  
               ^^

$ chktex -q-n 8 test.tex  

VimのALEから呼ばれるchktexを黙らせる

さて、VimでALEを使っている場合、そこから呼ばれるchktexのオプションはg:ale_tex_chktex_optionsで指定できます。したがって、もうこの警告をすべてのLaTeXファイルで殺したい場合は.vimrc

letg:ale_tex_chktex_options="-n 8"

と追加します。もし、LaTeXソースごとにこのオプションの有無を指示したい場合は、Vimでプロジェクト固有の設定を適用するVimの非同期文法チェッカALEにプロジェクト固有の情報を教えるを参考に、.vimrc.localをプロジェクトごとに置いて、そこにchktexのオプションを指示すると良いでしょう。

まとめ

chktexWrong length of dash may have been used.という警告を黙らせる方法を紹介しました。本稿ではVimからALE経由で呼ばれるchktexへのオプションの指定の仕方を解説しましたが、Atomその他のエディタでも同様なことができると思います。それではEnjoy Happy LaTeX Life!


  1. 「well defined」の和訳として「良定義」などがあるようですが使ったことがありません。普通はそのまま「これはwell definedだから・・・」と英語混じりに話してしまいます。 

Elixir の iex は `Ctrl+\` で抜けないとその後の vim がバグる

$
0
0

雑多にメモ

iex を使ったあとの vim がなんだかバグる

iex を使ったあとに vim を起動すると途中の行が表示されない謎挙動がある。
shell を再起動 (exec $SHELL) すると治る。

iex 利用前

iex 利用前

iex 利用後

iex 利用後

選択してみると、ちゃんとあるからファイルが壊れてるとかじゃない

iex 利用後 ちゃんとある

注:サンプルに pecoの changelog を出していますが、特に深い理由は無いです。ちなみに peco にはお世話になってます。

解決方法

iex を抜ける時に Ctrl+\で抜けると回復する。

iex を抜ける手段はいくつかあるけど、この\で抜けるやつだけが問題を起こさなかった。

  • Ctrl+Cを2回
  • Ctrl+Cのあとのメニューで q
  • Ctrl+\を1回

ちなみに一度 Ctrl+\以外で抜けて壊れたあとでも、もう一度 iex を起動して Ctrl+\で抜けると回復する。

謎挙動や。。。。

Dockerコンテナ版NeovimでHowmを使用する設定を追加した

$
0
0

コンテナ版のNeovimからHowmを利用する設定を行った。

コンテナ版Neovimの詳細はこちら

.config/nvim/init.vimの関連箇所は以下の通り。

" qfixhowmlet current_dir = getcwd()if filereadable(current_dir .'/Menu-00-00-000000.howm')let howm_dir = current_dir
  let howm_fileencoding ='utf-8'let howm_fileformat ='unix'let QFixWin_EnableMode =1let QFix_UseLocationList =1let howm_filename ='%Y/%m/%Y-%m%d-%H%M%S.md'let QFixHowm_FileType ='markdown'let QFixHowm_Title ='#'let QFixHowm_Template =[        \"# %TAG%",        \""        \]let QFixHowm_SaveTime =-1let QFixMRU_Entries =50let QFixMRU_Filename = current_dir .'/.qfixmru'endif

前提

  • メモの管理にQFixHowmを使用している。
  • Howmフォルダ全体をGitでバージョン管理して、BitBucketのプライベートリポジトリに保存している。

使い方

  • BitBucketからHowmディレクトリをgit cloneで取得する。
  • Howmディレクトリにcdしてコンテナ版nvimを起動する。
  • 以上で自分のHowm環境にアクセス可能になる。
  • Howmディレクトリ以外でnvimを起動した場合は、いつものHowm環境は使えない。

仕組み

  • カレントディレクトリにMenu-00-00-000000.howmファイルが存在するか確認する。存在する場合は、カレントディレクトリをHowmのメインディレクトリとして各種設定を有効にする。
  • MRUリスト(最近編集、閲覧したファイルリスト)はカレントディレクトリに.qfixmruとして保存する。同時にHowmディレクトリの.gitignore.qfixmruを除外対象に設定しておく。

WindowsとPowershellとvimとdiffと私

$
0
0

個人的にもう前時代感あふれるcmd.exeなんて使いたくないPowershellが好きなのでvimでもset shell=powershellしているんですけど、どうしても一部機能でトラブルが起きがちで、今回はdiffがどうしても動かなかったのでなんとかした話です。

結果が見たいわ!その子のソースを見せてちょうだい!

vimrc
" diff関連if has ('win32')set diffexpr=MyDiff()endiffunction! MyDiff()letopt=""if&diffopt =~"icase"letopt=opt."-i "endifif&diffopt =~"iwhite"letopt=opt."-b "endifsilent execute '!C:\path\to\diff.exe -a --binary '.opt.v:fname_in .' '.v:fname_new .'" > "'.v:fname_out
endfunction

どうしてこんなことになってしまったんだ…

問題はおそらく2つに絞られます。

  • Powershellがdiff=>Compare-Objectへのエイリアスを既に張っている
  • Vimでset shell=Powershellした際にリダイレクトとquoteの関係がおかしい

屋上に行こうぜ

まず前者に関しては、Powershellのエイリアスを消すとか、苦情のメールを入れるなどでも対応できるかと思われますが、「あるものはできるだけ残す」という個人的なポリシーと、結局vimrc書けば済むとわかったのでそちらで解決します。幸い、ヘルプにサンプル関数があるので1、そのまま持ってきてそれから考えます。

MyDiff()
set diffexpr=MyDiff()function MyDiff()letopt=""if&diffopt =~"icase"letopt=opt."-i "endifif&diffopt =~"iwhite"letopt=opt."-b "endifsilent execute "!diff -a --binary ".opt.v:fname_in ." ".v:fname_new .    \" > ".v:fname_out
endfunction

あとはこれの!diffの部分だけ使えるdiffのバイナリに変えれば解決するんですけど…

どぼぢでごんなごどずるのぉぉぉ!?

VimでPowershellを使う場合、シェル周りの設定は大体こうなるのが普通なんだそうなのでそのままこれを使っています…

vimrc
if has('win32')setshell=powershell
    set shellcmdflag=-cset shellquote=\"
    set shellxquote=endif

これでシェルを使ってリダイレクト結果を拾うコマンドではpowershell -c "foo" > barとなって、一時ファイルもしっかり拾えるように…少なくともqiitaCtlのときは問題ないので、拾えるようになってるはずです。正直わからん。おしえてVimmer!

さておき、じゃあこのスクリプトでdiff.exeだけ書き換えてやってみると、うまくいかないんだなこれが。vimrunのウィンドウがある短い時間で見てみたんですけど…

Powershell -c "C:\path\to\diff.exe diff1.tmp diff2.tmp > out.tmp"

ファイル名はともかくだいたいこうなります…え、shellquoteは…?えぇー…

わたしこれ嫌い!

冷静に考えたら関数内でリダイレクト処理書いちゃってるのでこうなるのが当然なんですよね…しょうがないので嫌いな類の解決方法で強引に乗り切ったのが最初のソースになります。要はシェルに送る文字列の中で強引にquoteを切って解決しました。エレガントじゃないなぁ…

おしえてVimmer!

実際コレどうなんです?なんかもっとエレガントな解決方法ある気がしてならないんですよ。某名無しさん曰く、まだ危ないエイリアスがあるらしいので、シェル起動時に環境変数放り込んでPowershell側のprofileで予めエイリアス切る条件分岐を仕込むとか、そもそもshellquoteの設定とdiffexprの設定で気がついてないところがあって、実は上手くやればdiffexprだけでなんとかなるとか…正直Vimの設定群を追いかけきれてないのでこの方法に自信がないです。

編集中に気がついたvim操作関係のこと

  • 毎度<C-r>+をして酷い目に遭うので<C-g>uする癖をちゃんとつけること。

  1. :h diff-diffexprを参照のこと 

vimのウインドウ分割を一時的に最大化・元に戻す関数を書いた

$
0
0

vimのウインドウ分割は便利なんだけどコード書くときはウインドウを広く使いたい派なのでで1ウインドウ・1バッファで使ってるんですが、分割を元の状態の戻すのが面倒すぎる。
ウインドウ分割は使いつつコード書くときだけ一時的に最大化できないかなーと思って関数を書いてみました。

let g:toggle_window_size = 0
function! ToggleWindowSize()
  if g:toggle_window_size == 1
    exec "normal \<C-w>="
    let g:toggle_window_size = 0
  else
    :resize
    :vertical resize
    let g:toggle_window_size = 1
  endif
endfunction
nnoremap <C-m> :call ToggleWindowSize()<CR>

.vimrc@Github

<C-m>にマップしているので分割した状態で Ctrl + mを押すとこのようにウインドウサイズが最大化されたり元に戻ったりします。

vim_toggle_window_size.gif


[vim] syntasticでESLintを実行して編集しながらクソコードを駆逐する

$
0
0

概要

こんな感じのJavaScriptのスーパークソコードをvimで編集してるとして

functionhoge(k){varn=3varmfor(i=0;i<10;i++){n=i}returnm;}

vim上で静的解析実行するvimプラグインであるsyntasticと、JavaScriptの定番静的解析エンジンのESLintを組み合わせると

スクリーンショット 2018-05-31 22.35.45.png

いい感じにボロクソに指摘してくれる。

ESLintのインストール

eslint本体はnpmで入れます。

$ npm i -g eslint

最初は初期設定します。

$ eslint --init

質問に順に答えることで、ESLintのルールである.eslintrc.jsonを生成してくれる。

? How would you like to configure ESLint? Answer questions about your style
? Are you using ECMAScript 6 features? Yes
? Are you using ES6 modules? Yes
? Where will your code run? Browser
? Do you use CommonJS? No
? Do you use JSX? No
? What style of indentation do you use? Spaces
? What quotes do you use for strings? Single
? What line endings do you use? Unix
? Do you require semicolons? No
? What format do you want your config file to be in? JSON
Successfully created .eslintrc.json file in /root/$ eslint --init
  1. ES6使うんか?
  2. ES6のmodule使うんか?
  3. ブラウザとnodeどっちで動くコードかいとるん?
  4. 改行コードはWindowsとUnixどっちにあわせる?
  5. CommonJS使うか?
  6. JSX使うか?
  7. インデントはスペースとタブどっちや?
  8. 文字列は""''どっちや?
  9. セミコロン入れる派か
  10. 設定ファイルのスタイルはJSONかYAMLどっちがええ?

これで以下のような.eslintrc.jsonが生成される。あとは個人的な好みとかプロジェクトのコーディング規約に会わせて適宜書き換える。

.eslintrc.json
{"env":{"browser":true,"es6":true},"extends":"eslint:recommended","parserOptions":{"sourceType":"module"},"rules":{"indent":["error",2],"linebreak-style":["error","unix"],"quotes":["error","single"],"semi":["error","never"]}}

もちろんvimを使わずにeslint単体でも使える。

$ eslint hoge.js

/root/app/javascript/hoge.js
  1:10  error  'hoge' is defined but never used              no-unused-vars
  1:15  error  'k' is defined but never used                 no-unused-vars
  2:7   error  'n' is assigned a value but never used        no-unused-vars
  5:8   error  'i' is not defined                            no-undef
  5:15  error  'i' is not defined                            no-undef
  5:23  error  'i' is not defined                            no-undef
  6:9   error  'i' is not defined                            no-undef
  7:1   error  Expected indentation of 2 spaces but found 4  indent
  9:11  error  Extra semicolon                               semi

✖ 9 problems (9 errors, 0 warnings)
  2 errors, 0 warnings potentially fixable with the `--fix` option.

syntasticのインストール

syntasticはvimのプラグインなので、ここではneobundle使って入れる。.vimrcに以下を追加

NeoBundle 'scrooloose/syntastic.git'set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}set statusline+=%*
letg:syntastic_always_populate_loc_list=1letg:syntastic_auto_loc_list=1letg:syntastic_javascript_checkers=['eslint']

これでvimを起動すると、syntasticがインストールされる。
この状態だと、JavaScriptファイルを保存するたびに自動で静的チェックが走るようになる。

しかし、ESLintの設定やコードの量によっては静的解析にも若干の時間がかかるので、保存のたびにチェックが走るのは億劫な場合もある。

そのような場合は、.vimrcに以下を追記する。

letg:syntastic_check_on_open=0letg:syntastic_check_on_wq=0
nnoremap <C-C>:w<CR>:SyntasticCheck<CR>

これで、ファイル読み込み時及び保存時に自動で解析が走るのよ抑止できる。さらに、ノーマルモードのときにCtrl + cを押すことで明示的に静的解析を走らせることができようになる。個人的なオススメ。

【メモ】neo-vim@Windows10への移行でやったこと

$
0
0

vim設定ファイルの配置

  1. init.vim(=vimrc)をvimrcからリネーム
  2. init.vim~/AppData/Local/nvimに配置
  3. ginit.vim(=gvimrc)もginit.vimにリネーム
  4. ginit.vim~/AppData/Local/nvimに配置

Guiフォントの設定変更

前:set guifont=Ricy\ Diminished:h10
後:Guifont! Ricty Diminished:h10
(補足:GuifontだけだとGuiFont fails with ... is not a fixed pitch fontとのエラーが出る。公式に対処記載。)

nvimに移行していく予定のため、順次追記。

WSLを使ってWindowsの操作性を向上させる

$
0
0

やりたいこと

WSLを使ってもっとWindowsを便利にしたい。次のことを実現する

  • ファイルマネージャーをキーボードで利用できるようにする(rangerの利用)
  • rangerからMS OfficeAdobe Readerを使ってファイルを開けるようにする
  • ドラッグアンドドロップのためにbashからExplorerを開けるようにしておく(パワポとかで画像をドラッグアンドドロップすることが多いため)

環境

  • Windows10
  • Windows Subsystem for Linux (WSL) (私はUbuntuを入れています)

実現方法

rangerのインストール

rangerとは、bash上で利用できるファイルマネージャーです。windowsでいうところのExplorerです。その大きな特徴はVimのようにファイルマネージャーを操作できる点です。つまりマウスがいりません。

こちらのサイトを参考にしました。
CLI で Linux ファイルマネージャ ranger を使うことのメモ

前提としてPythonがパソコンに入っていることが必要ですが、WSLなら最初から入っているので気にしなくてよいです。ただ、pipが必要なので、入れておきます。

bash
$ sudo apt-get install python-pip

次のコマンドを打てばrangerのインストールは終わりです。

bash
$ sudo pip install http://nongnu.org/ranger/ranger-stable.tar.gz

bash上でrangerと打てば下のような画面が起動します(薄いのは私のbashの設定です、スミマセン)。
無題.png

Vimのようにh,j,k,lで移動ができます(h, lはディレクトリの上下の階層への移動になっています。)。操作方法は上のリンクが詳しいです。

rangerではVimと同様に:qで抜け出すことができますが、抜け出したときにrangerでいたフォルダに移動していたら何かと便利です。これを実現するためにはこちらのGitHubのbash_automatic_cd.shの内容を~/.bashrcに記述しておきます。ただし、/usr/bin/rangerはWSLの場合には次のように変えておきます。

~/.bashrc
/usr/local/bin/ranger

これでCtrl+oでrangerが起動し、さらに:qで抜けたときにフォルダ移動がされます。

rangerからWindows上のソフトウェアを使ってファイルを開く

さて、rangerはrと打てばカーソルのある位置のファイルを開くことができます。私は普段の作業ではMS OfficeやAdobe Readerを使っているので、rangerでこれらを使ってファイルを開きたいわけです。

しかし、WSL上で、~/.profileでOfficeやAdobeにパスを通しておいてもrangerから開こうとするとファイルが見つかりませんというエラーが出ます。これを解決するためには~/.config/ranger/rifle.confに次のような行を追加します。

~/.config/ranger/rifle.conf
ext docx? =echo"$@" | sed-e's;/mnt/\(.\);\1:;'-e's/.*/"&"/'-e's:/:\\:g' | xargs cmd.exe /C start winword
ext xlsx? =echo"$@" | sed-e's;/mnt/\(.\);\1:;'-e's/.*/"&"/'-e's:/:\\:g' | xargs cmd.exe /C start excel
ext pptx? =echo"$@" | sed-e's;/mnt/\(.\);\1:;'-e's/.*/"&"/'-e's:/:\\:g' | xargs cmd.exe /C start powerpnt
ext pdf =echo"$@" | sed-e's;/mnt/\(.\);\1:;'-e's/.*/"&"/'-e's:/:\\:g' | xargs cmd.exe /C start "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"
ext exe =echo"$@" | sed-e's;/mnt/\(.\);\1:;'-e's/.*/"&"/'-e's:/:\\:g' | xargs cmd.exe /C start

これを追加しておけば、rコマンドをranger上で打ったときに、OfficeやAdobeが候補として出てきて、それを選択すればちゃんと開けるようになります。

bash上からExplorerを開けるようにする

rangerは非常に操作性が高く、使いやすいのですが、一つExplorerに負けている点があります。それがドラッグアンドドロップです。パワポなどを使っていると、画像を張るためにパワポ上にファイルをドラッグアンドドロップすることがあります。

rangerには残念ながらその機能がないため、仕方ないのでせめてbashからカレントディレクトリをExplorerで開けるようにしておきます。~/.bashrc上に次を追加します。

~/.bashrc
function winp {pwd | sed-e"s;/mnt/c;C:;"-e"s;\/;\\\\\\\\;g" | xargs explorer.exe
}

これを通しておけば、bash上でwinpと打てばカレントディレクトリがExplorerで開きます。

参考サイト

alpineで設定込みNeovim Dockerイメージのサイズを半減させた

$
0
0

個人設定込みNeovimのDockerイメージを作成した。詳細はこちら

ひとまず無難なところで、ubuntu:latestをベースイメージにしてビルドしたところ、イメージのサイズが636MBになった。サイズが大きすぎて外出先で気軽にpullできないので、もっと小さくしたい。alpineをベースにすればイメージのサイズが小さくなるということだったので試してみた。

設定内容

  • Dockerfile
FROM alpine:edgeLABEL maintainer="succi0303@gmail.com"RUN echo"http://dl-4.alpinelinux.org/alpine/edge/community">> /etc/apk/repositories

RUN apk update &&\
    apk upgrade &&\
    apk add --no-cache\
    curl \
    gcc \
    git \
    linux-headers \
    musl-dev\
    neovim \
    python-dev \
    py-pip \
    python3-dev \
    py3-pip &&\
rm-rf /var/cache/apk/*ENV LANG="ja_JP.UTF-8" LANGUAGE="ja_JP:ja" LC_ALL="ja_JP.UTF-8"RUN pip3 install--upgrade pip neovim

RUN curl -fLo /root/.local/share/nvim/site/autoload/plug.vim --create-dirs\
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

COPY .config /root/.configRUN nvim +PlugInstall +qa

WORKDIR /usr/src/nvimENTRYPOINT ["nvim"]

結果

636MBから288MBに半減

ubuntuベースで636MBあったイメージサイズが、alpineベースにしたところ288MBに半減した。まだ十分に小さいとは言い難いけれど、かなり改善できたと思う。

はまったこと

apk

alpineのパッケージ管理システムは、aptでもyumでもない、apkという独自システムである。とくに問題があるという訳ではなかったが、多少使い方を調べる必要があった。

pip3 install neovimがエラーになる

pip3 install neovimがnon-zeroでビルドが止まってしまった。

以下の3つのパッケージを追加することで解決できた。

  • gcc
  • linux-headers
  • musl-dev

参照

git commitでError detected while processing function dein#begin[1]...のエラー文が出る件

$
0
0

git commitするたびにエラー文が出るようになった

git commitすると以下のエラー文がでるようになってしまった。このままENTERを押すとcommitできるのだがいちいち出るのが中々面倒。
また、普通にvimと打ってvimを起動した時にはエラーが出ないので問題ないかと先送りにしていた。

▶git commit
hint: Waiting for your editor to close the file... Error detected while processing function dein#begin[1]..dein#util#_begin[6]..dein#util#_error[1]..<SNR>4_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[1]..dein#util#_begin[6]..dein#util#_error:
line    1:
E714: List required
Error detected while processing function dein#end[1]..dein#util#_end[2]..dein#util#_error[1]..<SNR>4_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#end[1]..dein#util#_end[2]..dein#util#_error:
line    1:
E714: List required

vimrcに書いてあるdeinのエラー?

dein#beginからdein#endをコメントアウトしたら出なくなるのでdeinのエラーかなと疑っていてハマった。

# dein以外は問題なく動作していた。以下をコメントアウトしたらエラー文は出なくなる。

call dein#begin(expand('~/.vim/dein'))

call dein#add('Shougo/dein.vim')
...略
call dein#end()

試したこと

以下を全て試したがダメだった。

  1. vimの再インストール
  2. deinの再インストール
  3. プラグインの削除
  4. Mac再起動

解決策

色々と調べて行くうちに、vimのPATHがうんちゃらかんちゃらというコメントを発見。『もしかしてcommitする時に立ち上がるエディタのPATHが別のvimをさしているのか?』という推測がたったので確認してみたところ、vimではなくviが起動していた。

# gitのエディタ確認
▶git config --global core.editor
/usr/bin/vim

# 通常時にvimと打って起動しているvimのpath
▶which vim
/usr/local/bin/vim

やはりviをさしていた。確かMacの場合、Homebrewでインストールしたvimは/usr/local/bin/vim、viは/usr/bin/vimだった気がする(またはvim7.3を差している)。

以下のコマンドでHomebrewでインストールしたvimに直したらエラー文が出なくなった。

# git commitの時のエディタをvimに戻す
▶git config --global core.editor /usr/local/bin/vim

参考

以下の掲示板のコメントを眺めていたら今回の解決策が思いついたので、こういうやりとりも記録に残るインターネッツっていいなっていう話。

vim-jp – Lingr
http://lingr.com/room/vim/archives/2016/04/16

Viewing all 5755 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>