hideharu092の日記

プログラミング言語(PythonやGo)、Vimの話、Webサービスについて語る

Vim始めて1ヶ月

この記事でわかること

  • 私(Vim初心者)が始めて1ヶ月、何をしてきたか。
  • Vimをやっていく上で気づいたこと

きっかけ

Vimとの出会いは、VimiumというGoogle Chromeの拡張機能がきっかけでした。

すげぇ!キーボードで、なるべくホームポジションを崩さずに操作できる!

革命でした。
多分Vimiumについての記事もいずれ書くと思います。
Vimiumって元素みたいだな~と思って調べていると、
これはVimというテキストエディタのキーバインドで操作できるのがウリであることがわかり、
Vimに出会いました。

やったこと

まず最初は、キーボードの設定を行いました。
CapsLockをCtrlに、無変換をIMEオフに、変換をIMEオンに割り当てました。

vimのtutorialをやりました。Vimiumである程度は慣れているから楽勝だと高を括っていたら、
Vimの無限の可能性に打ちひしがれました。

次は実践Vimを読みました。

実践Vim 思考のスピードで編集しよう!【電子書籍】[ Drew Neil ]

私は、考えるのが8割、タイプしている時間は2割嫌いの人間ですが、
コマンドでの操作、つまりVimを使うこと自体が楽しくなりました。

プラグインを入れまくりました。
Qiitaでいっぱい記事が上がっていたので、それらを読み漁り、vimrcに記述していきました。
プラグインマネージャーはdein.vimを使っています。

ソフトウェアデザインでのVim特集やmattnさんの連載を読みまくりました。
また、Vimのテクニックバイブルも読みました。
古いかなぁと思いましたが、参考になった部分はかなりありました。

先人たちに感謝します。

現時点での私のdotfiles(vimrcなど)はGiuHubで見れます。

もっと早くに知りたかったと思ったこと。

vimrcの記述で、mapのあとにはコメントが基本的には書けない
知らないでコメントを後ろに書いちゃっていました笑

vimrcは、編集中でもsouceを使えば呼び出せる
:source $MYVIMRCで呼び出せます。私は以下のようにマッピングしています。

nnoremap <F6> :<C-u>edit $MYVIMRC<CR>  
nnoremap <F5> :<C-u>source $MYVIMRC<CR>  

アプリケーションとかによくある感じです。

functionやautocmdをつかうときは、再読込みを考慮しなければならない
最初、人のvimrcを見ていて、functionの後ろに!がついていたり、
autocmdの後ろにイベントではなくグループ名が書かれていて、不思議に思っていました。
今では、function!としたり、

augroup vimrc  
  autocmd!  
augroup END  

をvimrcの最初の方に記述してから、
vimrcの途中や、dein.tomlやdein_lazy.tomlなどには、
autocmd vimrc BufWritePre *.md :call MarkdownEOLTwoSpace()として、
最初に記述したvimrcというグループに対して処理を行っています。

set オプション の設定値の確認ができる
:set オプション?
というように、コマンドラインで?をつけて実行すれば、オプションの設定値の確認ができるのをかなり時間が経ってから知りました。

正直びっくりしたことはいっぱいあるのですが、これすごい!っていう紹介のようなものは書ききれないです。
Vimって本当に奥が深い。

先程も書きましたが、
現時点での私のdotfiles(vimrcなど)はGiuHubで見れます。
このぐらい成長しました。

感想

感想の記事に感想ってなんだよと今思ってしまいました。
いつかはプラグインとか作ってみたい。

WSL+fish+Vim(C/C++、Python、Markdown)の環境構築4

この記事でわかること

最初に

この記事では、度々私のvimrcやdein.toml、dein_lazy.tomlなどが一部抜粋して載せてあります。
Githubにあげているので、全体を見たい場合はどうぞ。
私のdotfiles

deinのtomlでc/c++とPython

まず、前回の記事では、コメントアウトやaleなどをいれました。
そのときに、linterとformatterは指定しましたが、補完がほしいです。
ということで、dein.tomlに以下の記述をしました。

[[plugins]] # lspでの補完  
repo = 'prabirshrestha/async.vim'  

[[plugins]] # lspでの補完  
repo = 'prabirshrestha/vim-lsp'  
hook_add='''  
if executable('clangd-6.0')  
    au User lsp_setup call lsp#register_server({  
        \ 'name': 'clangd',  
        \ 'cmd': {server_info->['clangd-6.0']},  
        \ 'whitelist': ['c', 'cpp', 'objc', 'objcpp'],  
        \ })  
endif  
if executable('pyls')  
    au User lsp_setup call lsp#register_server({  
        \ 'name': 'pyls',  
        \ 'cmd': {server_info->['pyls']},  
        \ 'whitelist': ['python'],  
        \ })  
endif  
let g:lsp_diagnostics_enabled = 0 "w0rp/aleで対応するので無効化  
'''  

[[plugins]] # lspでの補完  
repo='prabirshrestha/asyncomplete.vim'  

[[plugins]] # lspでの補完  
repo='prabirshrestha/asyncomplete-lsp.vim'  

clangdとpylsは、前々々回の記事で追加したLSP、
つまりsudo apt install clang-toolspip3 install --user python-language-server
によるものです。
ここではclangd-6.0となっていますが、実際にはターミナル上でのコマンド名のことなので、
バージョンによる差異があると思います。
-6.0がついていなかったり、違う数字かもしれないので、そこは各自で合わせましょう。
f:id:hideharu092:20190326140144j:plain
こんな感じになります。前回の記事で追加したaleもしっかり動いてます。
他の補完も入れているので、実際にはちょっと違うかもしれません。

deinのtomlでMarkdown

Markdownの編集をサポートするために、
dein_lazy.toml(遅延読み込みの方のファイル)に、以下のように記述しています。

# ----Markdownサポート----  
[[plugins]] # Markdownの編集をサポート  
repo = 'plasticboy/vim-markdown'  
on_ft = 'md'  
hook_add = '''  
    let g:vim_markdown_folding_disabled=1  
'''  

[[plugins]]  
repo = 'godlygeek/tabular'  
on_ft = 'md'  

[[plugins]] # テーブルの生成  
repo = 'dhruvasagar/vim-table-mode'  
on_ft = 'md'  

[[plugins]] # プレビューをブラウザで開く  
repo = 'tyru/open-browser.vim'  
on_ft = 'md'  
hook_add = '''  
    if filereadable('/proc/sys/fs/binfmt_misc/WSLInterop')  
        autocmd vimrc BufNewFile,BufRead *.md nnoremap <buffer><Leader>p :execute "OpenBrowser" substitute(expand("%:p"), '/mnt/c', 'c:/', '')<CR>  
    else  
        autocmd vimrc BufNewFile,BufRead *.md nnoremap <buffer><Leader>p :execute "OpenBrowser" expand("%:p")<CR>  
    endif  
'''  

vim-markdownはシンタックスハイライトです。
tabularとvim-table-modeで、表の生成をサポートしています。
最初に:TableModeToggleでテーブルモードに入ると、
それ以降はtmでテーブルモードの切り替えができます。
ただこのコマンドが長いので、:TMに省略しています。

普通にtmで切り替えられました。

テーブルモードでは、『|』パイプを入力することで、自動的に表を整えてくれます。
幅も自動で合わせてくれるので、かなり楽です。
f:id:hideharu092:20190326140304p:plain

mdファイルのプレビューは、open-browser.vimとGoogle Chromeで行っています。
私の環境でWSLからはうまくファイルが開けなかったので、
WSLのときのみ、ファイルパスを適切に置換してから開いています。

Markdownでは、半角スペース2つで改行を表すのですが、自分でいちいち入力するのでは手間です。
そこで、vimrcに以下のように記述しています。

" ----Markdownのための設定  
function! MarkdownEOLTwoSpace()  
    let s:tmppos = getpos(".") " cursorの位置を記録しておく  
    " 行末に改行のための空白2つのみを付与(空行には付与しない)  
    %s/\v(\S\zs(\s{,1})|(\s{3,}))$/  /e  
    call setpos(".", s:tmppos) " cursorの位置を戻す  
endfunction  
autocmd vimrc BufWritePre *.md :call MarkdownEOLTwoSpace()  

前回の記事で出てきた、autocmdを利用して、ファイルを書き込みする前に、
それぞれの行末に半角スペース2つを付与しています。

実際には、正規表現を利用して、ファイル全体に置換をかけているだけです。
『%』がファイル全体。
『s/hoge/fuga』でhogeをfugaに置換。
これの後ろに『/e』を加えると、hogeという文字列が存在しなかったときにerrorにならない。
『\v』でvery magicをオンにし、『{}』などの記号の前に『\』をつけなくてもいいようにしています。
『\S』は空白以外の文字。
『\zs』はその後ろからが置換対象ということです。
『\s』は空白を意味します。
『{,1}』『{3,}』はその前の文字が1文字以下または3文字以上ということです。
『$』は行末を表します。

したがって、%s/\v(\S\zs(\s{,1})|(\s{3,}))$/ /eは、
ファイル全体のそれぞれの行に対して、以下の処理をします。
- 空行(その行は改行のみ)だったら、そのまま(置換しない)
- 文字列のあとに半角スペース2つで行末(改行)だったら、そのまま(置換しない)
- 文字列のあとに半角スペース0つで行末(改行)だったら、半角スペース2つを行末に付与
- 文字列のあとに半角スペース1つで行末(改行)だったら、行末の半角スペース1つを2つに置換
- 文字列のあとに半角スペース3つ以上で行末(改行)だったら、行末の半角スペースを2つだけに置換

これで、自分でいちいち改行のために半角スペース2つを入力しなくて済みますし、
すでに半角スペース2つがすでに行末にある行はそのままになります。

ちなみに、空行の判定をしないと、半角スペース2文字に置換されてしまうので、
表を書いても前後に空行がなくなってしまうのでうまく表示できません。

なんちゃらposの部分は、置換するとカーソル位置が変わってしまうので、
一度記録してから置換後にまた戻す、という作業をしています。

Markdownファイルのプレビューについて

open-browser.vimでファイルをブラウザで見れるようにしていますが、
間違ってシェルスクリプト等のファイルでキーマップが有効になっていると、えげつないことになるからです。
なので、上記のvimrcのように、
vimrc BufNewFile,BufRead *.md nnoremap <buffer><Leader>p :execute "OpenBrowser" substitute(expand("%:p"), '/mnt/c', 'c:/', '')<CR>
で、拡張子がmdのファイルだけブラウザでのプレビューするキーマップを有効にしています。

また、Google Chromeの場合には、『Markdown Preview Plus』という拡張機能を入れ、
以下の設定をすると良いです。
- 拡張機能の管理から、ファイルの URL へのアクセスを許可するをオンにする
- 拡張機能のアイコンをクリックしてオプションを開き以下を設定
- on Enable auto-reload
- supported file extensionsでは以下のみにチェック
- md, markdown, mdown,mkd,rmd
Markdown Preview Plusは、その名の通り、Markdownファイルをブラウザでプレビューしたときに、
自分でCSSで見やすくしたり、自動更新をしてくれる拡張機能です。

さらに、『Vimium』をという拡張機能を入れ、
以下の設定をすると良いです。
- 拡張機能の管理で、、ファイルの URL へのアクセスを許可するをオンにする
- Chromeの検索エンジンの設定で以下のように追加する。
f:id:hideharu092:20190326140747p:plain

VimiumはVimのキーバインドでネットサーフィンできるスグレモノです。
自分で色々設定もできます。
この拡張機能だけで、記事一本書けちゃいます。というか書きたいです。
検索エンジンの設定をしたのは、アドレスバーに間違ってフォーカスを移したときに、
フォーカスをwebページに戻すためです。
上記の例だったら、アドレスバーにフォーカルがあるときに『j』を打ちこんで、
出てきた選択肢をそのままEnterすれば、フォーカスがwebページに戻ります。
f:id:hideharu092:20190326140341p:plain

この2つの拡張機能を入れれば、
キーマップでMarkdownファイルをChromeで開く
→jやkなどのvimキーバインドのままスクロール
→Alt+Tabなどでvimにフォーカスを戻す
→vimで修正
→Chromeにフォーカスを移さなくても自動更新

という有史以来のVimのMarkdown快適環境が出来上がります。

Markdownファイルのプレビューには、htmlに変換してから見るものもあるんですが、
勝手にhtmlを作られるのが嫌なので、私はこのようにしているのです。

最後に

以上になります。
記事の冒頭にも書きましたが、私のvimrcやdein.toml、dein_lazy.tomlはGithubで公開しているので、
良ければご覧ください。
私のdotfiles

感想

最初に想定していたよりもかなり長くなってしまった。
もし同じような環境を想定しているような人が、参考にしてくれたら嬉しいなぁ。
文章をまとめる力をもっと伸ばしたい!
ちなみに、この記事は、上記で紹介したようなMarkdown環境で書いています!
使いたいvimの機能がいっぱいあるのでまだまだdotfilesは育て中です。

WSL+fish+Vim(C/C++、Python、Markdown)の環境構築3

この記事でわかること

最初に

この記事では、度々私のvimrcやdein.toml、dein_lazy.tomlなどが一部抜粋して載せてあります。
Githubにあげているので、全体を見たい場合はどうぞ。
私のdotfiles
整理しないとですね。
ちなみに前回の記事と同様、これらもシンボリックリンクを使っているゆえに、
dotfilesというフォルダで1元管理をしています。

vimrcの冒頭

以下、私のvimecの冒頭です。
プラグインなどの設定で、leaderと出てきたら、それはリーダーキーのことです。
デフォルトでは\なのですが、打ちづらいので、支障のないスペースキーにしました。

" 文字関連の設定  
set encoding=utf-8  
scriptencoding utf-8  
set ambiwidth=double " □や○文字が崩れる問題を解決  
set nrformats= "数増減は10進数で扱う  

let mapleader = "\<Space>" " leaderキーの割当を変える  

" --reset augroup-----------------------------  
"  再読込時に2度設定しないため、最初に消す  
"  autocmdを使うときにはautocmd vimrc ゴニョゴニョと書く  
augroup vimrc  
  autocmd!  
augroup END  

autocmdを使うことで、指定したイベント時に、コマンドを自動で実行されます。
そのままだと、vimrcを書き直してまた読み込む、といったときに、
autocmdで設定した事が2回設定されてしまいます。
これを防ぐために、vimrcを読み込む際には、
初期化してリセットしてからautocmdを設定するようにしています。
autogroupのあとの『vimrc』は単純にグループ名なので何でもいいです。 autocmdは次の記事で出てきます。

vimrc、クリップボードについて

前々回の記事で、Vimを最新のものに切り替えました。
また、sudo apt install vim-gtkを実行したので、
クリップボードがVimでも使用できるようになっているはずです。
vim --versionのコマンドで、clipboadが『+』になっていればOKです。

以下のような記述をすると、ヤンクやペーストなどでクリップボードが使えます
set clipboard=unnamedplus " ヤンク&ペーストをクリップボード利用

vimのプラグインについて

vimではプラグインを入れることで、様々なことができます。
次の項目からはdein.vimを使ったプラグインの導入になりますので、
他のプラグインを使っている方は適宜読み替えてください。
これからdein.vimを導入する方は、以下の記事をお読みください。
初心者がdein.vimの導入で躓いたところ
tomlで管理しているので、私はvimrcに以下の記述をしています。

"dein Scripts-----------------------------  
if &compatible  
  set nocompatible               " Be iMproved  
endif  

let s:dein_path = expand('$HOME/.vim/dein')  
let s:dein_repo_path = s:dein_path . '/repos/github.com/Shougo/dein.vim'  

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

if dein#load_state(s:dein_path)  
  call dein#begin(s:dein_path)  

  let g:config_dir  = expand('$HOME/.vim/dein/userconfig')  
  let s:toml        = g:config_dir . '/dein.toml'  
  let s:lazy_toml   = g:config_dir . '/dein_lazy.toml'  

  call dein#load_toml(s:toml,      {'lazy': 0})  
  call dein#load_toml(s:lazy_toml, {'lazy': 1})  

  " Required:  
  call dein#end()  
  call dein#save_state()  
endif  

" Required:  
filetype plugin indent on  
syntax enable  

" If you want to install not installed plugins on startup.  
if dein#check_install()  
  call dein#install()  
endif  

"End dein Scripts-------------------------  

dein.tomlファイルの冒頭には以下を書きました。

# プラグインの管理  
[[plugins]] # これ使うのに必要  
repo = 'Shougo/dein.vim'  

[[plugins]] # 非同期実行
repo = 'Shougo/vimproc.vim'  
build = 'make'  

便利なプラグイン

コメントアウトのために、以下のプラグインを入れています。

[[plugins]] # コメントアウトに便利  
repo = 'scrooloose/nerdcommenter'  
hook_add ='''  
    let g:NERDSpaceDelims = 1  
    let g:NERDDefaultAlign='left'  
    let g:NERDCreateDefaultMappings = 0  
    nmap <Leader>c<Space> <Plug>NERDCommenterToggle  
    vmap <Leader>c<Space> <Plug>NERDCommenterToggle  
    nmap <Leader>cA <Plug>NERDCommenterAppend  
    " TODOコメント追加  
    nmap <Leader>ctd <Plug>NERDCommenterAppendTODO:<Space>  
    " TODOをlocation listとして開く  
    nnoremap <Leader>tl :vimgrep /TODO:/j %<CR>:cwindow<CR>  
    " TODO: 他のアノテーションも追加  
'''  

個人的に、TODO:というコメントアウトはよく使うので、
マッピングしました。
また、TODOをすぐに検索してジャンプできるように、quickfixで開くキーマップも追加しました。

ステータスタインを見やすくするために以下のプラグインを入れています。

[[plugins]]  
repo = 'ryanoasis/vim-devicons'  

[[plugins]] # ステータスラインとバッファ表示の強化  
repo = 'vim-airline/vim-airline'  
hook_add = '''  
    " ステータスラインの表示内容強化  
    set laststatus=2 " ステータスラインを常に表示  
    set noshowmode   " 現在のモードを日本語表示しない  
    set showcmd      " 打ったコマンドをステータスラインの下に表示  
    set ruler        " ステータスラインの右側にカーソルの現在位置を表示する  
    " カーソルキーでbuffer移動  
    nnoremap <C-p> :bp<CR>  
    nnoremap <C-n> :bn<CR>  
    let g:airline_theme = 'powerlineish'  
    let g:airline_powerline_fonts = 1  
    let g:airline#extensions#branch#enabled = 1  
    let g:airline#extensions#tabline#enabled = 1  
    let g:airline#extensions#wordcount#enabled = 0  
    let g:airline#extensions#tabline#formatter = 'unique_tail'  
    let g:airline#extensions#ale#error_symbol = ' '  
    let g:airline#extensions#ale#warning_symbol = ' '  
    let g:airline#extensions#default#layout = [  
      \ [ 'a', 'b', 'c' ],  
      \ [ 'x', 'y', 'z', 'warning' , 'error']]  
    let g:airline#extensions#default#section_truncate_width = {  
      \ 'b': 79,  
      \ 'x': 60,  
      \ 'y': 100,  
      \ 'z': 45,  
      \ 'warning': 80,  
      \ 'error': 80,  
      \ }  
    let g:airline_section_z = '%3v:%l/%L %3p%%'  
'''  
depends = ['vim-airline-themes']  

[[plugins]]  
repo = 'vim-airline/vim-airline-themes'  

f:id:hideharu092:20190325160903p:plain こんな感じになります。
let g:airline#extensions#default#section_truncate_widthでターミナルのウィンドウの幅によって、表示される項目を絞っています。

これと、下のaleプラグインでは、powerlineなどに対応フォントを使わないと表示が崩れます。
前々回の記事や、前回の記事のように、私はCicaフォントを導入しています。

errorやWarningを出してくれる構文チェックも導入しました。

[[plugins]] # 構文チェック  
repo = 'w0rp/ale'  
hook_add ='''  
    let g:ale_echo_msg_error_str = nr2char(0xf421)  
    let g:ale_echo_msg_warning_str = nr2char(0xf420)  
    let g:ale_echo_msg_info_str = nr2char(0xf05a)  
    let g:ale_sign_error = g:ale_echo_msg_error_str  
    let g:ale_sign_warning = g:ale_echo_msg_warning_str  
    let g:ale_statusline_format = [  
      \ g:ale_echo_msg_error_str . ' %d',  
      \ g:ale_echo_msg_warning_str . ' %d',  
      \ nr2char(0xf4a1) . '  ']  
    let g:ale_fix_on_save = 1  
    let g:ale_sign_column_always = 1  
    let g:ale_lint_on_text_changed = 0  
    let g:ale_lint_on_insert_leave = 1  
    let b:ale_linters = {  
    \   'python': ['flake8'],  
    \   'c':['clang'],  
    \   'cpp':['clang'],  
    \}  
    let g:ale_fixers = {  
    \   'c': ['clang-format'],  
    \   'cpp': ['clang-format'],  
    \   'python': ['black','isort'],  
    \}  
    let g:ale_cpp_clangformat = '-style="{  
    \   AlignConsecutiveAssignments:true,  
    \   AlignConsecutiveDeclarations:true,  
    \   IndentCaseLabels":true,  
    \   IndentWidth:4,  
    \   KeepEmptyLinesAtTheStartOfBlocks:true,  
    \   SpacesBeforeTrailingComments:1,  
    \   TabWidth":4,  
    \   UseTab:ForIndentation  
    \}"'  
'''  

これによってpythonとc/c++では、formatterが保存時に自動実行されるようになりました。 また、g:ale_cpp_clangformat = '-style="{ ~}の部分で、スタイルを決めています。

またまた長くなってしまったので、ここで一区切り。

感想

また長くなってしまった。
次の記事で終わるはず。

WSL+fish+Vim(C/C++、Python、Markdown)の環境構築2

この記事でわかること

  • WSLの導入(前回の記事)
  • WSLへのfishの導入(前回の記事&今回の記事)
  • WSL&VimでのC/C++、Python、Markdownの環境構築(次回の記事)

最初に

前回の記事で、fishをデフォルトのshellにして再起動しているので、
起動時の画面が最初の画面とは少し変わっていると思います。
f:id:hideharu092:20190324145920p:plain コマンド入力時には、薄っすらと補完候補が表示されます。
この薄い候補の内容で入力したければ、Tabキーで補完できます。

プログラミング用フォントを導入2

前回の記事では、フォントをインストールするところまででしたが、
実際にはターミナルにフォントを設定する必要があります。
だいだいはそのターミナルのウィンドウの左上のアイコンをクリックすれば、
オプションの設定などができるので、そこでフォントを設定しましょう。

クリップボードを共有

クリップボードを共有したい場合は、VcXsrvなどのXサーバー導入するのが便利です。
VcSrv Windows X Serverからダウンロードします。
基本はポチポチで支障はないので説明は省きますが、
起動してからの設定で、最後の『Save configration』により、設定を任意の場所に保存し、
スタートアップフォルダにそのファイルへのショートカットを置くと、
いちいち設定しなくても、自動で起動されます。

WSLのホームディレクトリで、.config/fish/config.fishを作成し、
export DISPLAY=localhost:0.0
を記述しておきます。

また、あとの設定のために、以下のように記述しておくことをおすすめします。

export DISPLAY=localhost:0.0  
set PATH $HOME/.local/bin $PATH  

set -g theme_newline_cursor yes  
set -g theme_display_git_master_branch yes  
set -g theme_color_scheme gruvbox
set -g theme_powerline_fonts no  
set -g theme_display_date no  
set -g theme_display_cmd_duration no  

set PATH $HOME/.local/bin $PATHは見てのとおりパスの追加です。
その他はあとで追加するoh-my-fish/theme-bobthefishのおすすめ設定です。
このconfig.fishは、bashなどのbashrcなどに相当します。

ただ、設定ファイルを環境構築するたびに記述するのは面倒なので、
Windowsのホームディレクトリなどに『dotfiles』というフォルダを作り、
そのフォルダのファイルへのシンボリックリンクを作成するのがおすすめです。

以下が例です。
adminの部分は各自のユーザ名になります
Windowsで、

mkdir ~/dotfiles  
vim ~/dotfiles/config.fish  

WSLで、

mkdir ~/.config  
mkdir ~/.config/fish  
ln -s /mnt/c/Users/admin/dotfiles/config.fish  ~/.config/fish/config.fish  

Windowsのホームディレクトリにdotfilesフォルダを作成
→ファイルを作成
→記述(エディタは何でもいい)
→そのフォルダのファイルへのシンボリックリンクを作成
という順になります。

fishの設定(環境変数の非共有)

Windowsと環境変数などを共有しないほうがいいので、以下の記事を参照にします。
WSLとWindowsで環境変数を共有しないように設定する方法

上記のconfig.fishと同様に、シンボリックリンクを作成するのがおすすめです。
以下が例です。
ファイルを作成→記述→シンボリックリンクという順です。
adminの部分は各自のユーザ名になります

sudo ln -s /mnt/c/Users/admin/dotfiles/wsl.conf /etc/wsl.conf  

ここで一つ注意。
WindowsでもWSLでも、ユーザ名つまりはホームディレクトリ名に半角スペースなどが含まれていると、
色んな所でつらい思いをするので、素直に初期化または新しくアカウントを作成するのがおすすめです。

fishの設定(ブラウザで設定を開く)

前回の記事で、

sudo apt install xdg-utils  
sudo apt install x11-apps  

を実行していれば、そのまま。まだ入れていなければこの2つを入れましょう。
fish_configを実行すると、
f:id:hideharu092:20190324145449p:plain URLが表示されるので、コピーしてブラウザで開きます。

背景の色を変えたり、プロンプトを$だけに変えたりすることが出来ます。
f:id:hideharu092:20190324145503p:plain

それぞれをsetボタンで設定したら、そのままブラウザを閉じてターミナルに戻り、
qを押し、確認ダイアログにYesつまりyなどを入力すると終了です。

fishのプラグインのインストール

便利なプラグインが色々あります。
まずはプラグインの管理のために以下のコマンドでfisherを入れます。
curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher

fishでpowerlineを入れるために、以下のコマンドでテーマを入れます。
fisher add oh-my-fish/theme-bobthefish
この記事の最初の方のconfig.fishで書いたものはこれのための設定です。
このテーマによって、見栄えが良くなったり、gitの情報が見れたりします。
f:id:hideharu092:20190324150630p:plain

以下は、移動を便利にするコマンドを追加できます。
fisher add jethrokuan/z
これが追加されてから移動したディレクトリは、z dotfilesのように、省略して移動できます。

また、以下のコマンドの実行で、補完が良くなります。
fish_update_completions

前回の記事と同様に、このような初期設定はシェルスクリプトを作成するのがおすすめです。
前回の記事ではbashのときに実行しましたが、fishに切り替えたあとは、
setup_fish.fishのように、拡張子がfishになります。
また、冒頭はwhich fishで示された文字列の頭に『#!』を加えたものを記述します。
以下が例です。

#!/usr/bin/fish  
curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher  
fisher add oh-my-fish/theme-bobthefish  
fisher add jethrokuan/z  
fish_update_completions  

長くなったので、ここでまた一旦区切ります。

感想

fish_configはWSLだと実行できないと思っていましたが、試行錯誤して解決できたので良かったです。
fishはbashよりも使いやすいなって思います。

WSL+fish+Vim(C/C++、Python、Markdown)の環境構築1

この記事でわかること

  • WSLの導入
  • WSLへのfishの導入
  • WSL&VimでのC/C++、Python、Markdownの環境構築

WSLの導入

WSLを導入することで、Windows上でLinux環境の実行ができます。
Cygwinとか入れれば似たようなことは出来ますが、 それらは似たようなものに作り変えているだけなのです。
WSLならLinuxのコマンドなどがそのまま使えるので、私はこちらのほうが好きです。

私の導入時のWindowsのバージョンは1809です。

まず、Windowsキー + xキーか、スタートボタン右クリックで、『アプリと機能』を開きます。
関連設定(右側にある)の『プログラムと機能』を開きます
(見えなかったらウィンドウを最大化すれば見れます)。

あるいは、コントロールパネルからプログラム、プログラムと機能を開きます。

左側の『Windowsの機能の有効化または無効化』を開きます。
『Windows Subsystem for Linux』をクリックし、
f:id:hideharu092:20190323213338p:plain
インストールが開始されます。
インストールの終了後、再起動をします。
f:id:hideharu092:20190323213400p:plain

Ubuntuの導入

今回は、LinuxのディストリビューションWSL界ではメジャーな?笑、Ubuntuを入れます。

Microsoft Storeから『Ubuntu』を検索して、
『Ubuntu』(何も語尾についてないもの)をクリックし、
入手ボタンのクリックでダウンロード開始です。
f:id:hideharu092:20190323213102p:plain 星の数もっと多くてもいいのに。
この時点でのUbuntuの容量は214.4MBでした。意外に小さい?

Ubuntuを起動すると、インストールが始まります。
インストールはちょっと時間がかかるので、
その間に、必要な人は次の項目を参照してプログラミング用フォントを導入しましょう。

プログラミング用フォントCicaの導入

あとでVimでairlineやlightlineなどのpowerlineを使うためのフォントを入れます。
かっこよく&見やすくなります。
これらを使わない人は入れなくても構いません。
ここからZIPファイルをDLして解凍してインストールするか、
自分でパッチを当てたフォントを用いるといいでしょう。

Ubuntuの設定

インストールが完了すると、ユーザーネームの入力と、パスワードの入力(2回)をさせられます。
打ち込んだパスワードは表示されません。
f:id:hideharu092:20190323213156p:plain
以下、実行していくコマンドとその解説です。
取捨選択しましょう。

サーバを日本に変更
sudo sed -i -e 's%http://.*.ubuntu.com%http://ftp.jaist.ac.jp/pub/Linux%g' /etc/apt/sources.list

アップデートとアップグレード(定期的に行ったほうがいい)

sudo apt-get update  
sudo apt-get upgrade  

Gitのインストール
sudo apt install git

コマンドの出力を日本語に変更
sudo apt install language-pack-ja

エラーメッセージを日本語に変更
sudo update-locale LANG=ja_JP.UTF-8

マニュアルを日本語に変更
sudo apt install manpages-ja manpages-ja-dev

タイムゾーン設定
sudo dpkg-reconfigure tzdata
『Asia』『Tokyo』を選択します。

最新のVimに変更
もともと入っている方だと、 aleというプラグインの使用時に
エラー行にカーソルがあるとメッセージ表示、の設定を行っているとカーソルが消えるため。

sudo apt remove vim  
sudo add-apt-repository ppa:jonathonf/vim  
sudo apt update  
sudo apt upgrade  
sudo apt install vim  

クリップボードの使用&WSLからWindowsのブラウザを利用するために以下をインストール

sudo apt install vim-gtk  
sudo apt install xdg-utils  
sudo apt install x11-apps  

c/c++ のためにインストール。
clang-formatはformatter、clang-toolsはlspのclangd補完(vimのプラグインaleで使用)。

sudo apt install build-essential  
sudo apt install clang  
sudo apt install cmake  
sudo apt install clang-format  
sudo apt install clang-tools  

Python3 のためにインストール。
これらもvimのプラグインで使用。

sudo apt install python3-pip  
pip3 install --user python-language-server  
pip3 install --user flake8 isort black  
pip3 install --user neovim  

ちなみに、初期ではPython2と3の両方が入っているため、3の方を使うときには以下のように明示的にする。

python --version  
 Python 2.7.15rc1  

python3 --version  
 Python 3.6.7  

fish-shellをインストール。
fishは、ブラウザで設定画面を開けたり、入力中のコマンドの補完が薄く表示されたりと、
かなり便利な仕様です。
sudo apt install fish

初期設定として実行したコマンドは、
シェルスクリプトとして保存しておくことをおすすめします。
シェルスクリプトを実行すると、コマンドをまとめて実行できます。
いちいちコマンドを打たなくて済むので楽です。

シェルスクリプトで実行する場合には、
最初に #!/bin/bashと記述してあることを確認してから、 chmod +x ubuntu_setup.shのようにシェルスクリプトに権限を与えてから、
./ubuntu_setup.shで実行です。
( この時に、ファイルの改行コードが違うとエラーが出ます。)
また、いちいちyesを選択するのも面倒なので、
コマンドの冒頭にyes |を書くと、自動的にyesが選択されます。

終わったら、

chsh -s `which fish`  

でデフォルトのshellをfishに切り替えてUbuntuを再起動です。

echo $LANG  
date  
man ls  
gcc --version  
make --version  
clang --version  

のように、それぞれインストールしたものなどを確認しましょう。

長いのでここで一旦区切ります。
fishの設定、Vimでの設定は次の記事で。

感想

シェルスクリプト作ると本当に楽。
shellには興味なかったけれども、fishを知ってからちょっと調べ始めました。

WSLとWindowsで環境変数を共有しないように設定する方法


これから始める人の Linux超入門 (日経BPパソコンベストムック) [ 日経Linux ]

この記事でわかること

  • 表題の通り、WSLとWindowsで環境変数を共有しないように設定する方法

問題点

WSLでclangを導入して、コマンドを確認したところ、以下のようになった

$ sudo apt install clang
$ clang --version
-bash: /mnt/c/Cygwin/bin/clang: 許可がありません
$ which clang
/usr/bin/clang

??
これはCygwinのコマンドが優先されているのではないかと思い、ちょっとググってみた。
どうやらデフォルトでは、Windowsの環境変数がWSLにそのまま追加されるらしい。
なのでこれを無効化させます。

方法

これは、Windows 10 バージョン1809(October 2018 Update) での方法です。それ以前は違う方法になりますので、ご注意ください。

まず、以下のように管理者権限でファイルを作成&記述します(エディタは何でもいいです)。

$ sudo vim /etc/wsl.conf

記述内容は以下

[interop]
appendWindowsPath = false

次に、 exitなどでTerminalを終了させ、また起動させて完了です。

解決したかどうか

問題点が解決したかどうか、以下のコマンドで確認しました。

$ clang --version
clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

解決できました!

感想

突然Cygwinのコマンド扱いされてびっくりしましたが、解決できたので一安心です。
でも自分で開発環境構築できるのはうれしいですね。

初心者がdein.vim(vimのプラグイン管理)の導入で躓いたところ

この記事でわかること

  • dein.vim導入時の注意点(筆者の環境における個人的なところが多い)
  • 筆者の愚かさ

なぜdein.vimでプラグイン管理するか

  • tomlファイルで管理できるから
    • vimrcが肥大化しなくてすむ
  • 遅延ロードの指定ができるので読み込みが早いから
  • 読み込むファイルタイプによってプラグインを読み込まないように指定が可能(言語ごととか)だから
  • キャッシュを使うので読み込みが早いらしい(まだ実感してない)から

ちょっと一言

筆者はwindowsしか使ったことないです(´・ω・`)
windows10、Vim8、cygwinで行いました。
Macの人多くないですか(恐怖)。Neovimの人も多いですよね。

躓きポイント1

管理者権限でcygwinを実行する 何故か解決してました。もう管理者権限じゃなくても平気です。

躓きポイント2

カレントディレクトリを任意の場所(deinを入れる場所)に移動してから、

$ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh  
$ sh ./installer.sh 任意の場所  

をする。
ここで大体の例として~/.cache/deinが挙げられている。
筆者はこの任意の場所を$HOME/.vim/deinとした。
ホームディレクトリを指定する記号『~(チルダ)』を『$HOME』にしたのは、~だとcygwinの中のディレクトリが優先されてしまうから。
ただしこれは他の人にとっては余り関係はないかもしれないです。

躓きポイント3

sh ./installer.sh 任意の場所 で表示された『"dein Scripts』から『"End dein Scripts』しっかりコピーしてvimrcに貼り付けましょう。
ネット上にあるやつをコピーしないこと。
実行するとパスの記述が各々の設定場所に合わせてあるので、書き換えるのであれば一度そのままコピーしたものが動くかどうか試してからにしましょう。

表示されたものをコピーして動くか確かめてから、その後に書き換えた筆者のvimrcは以下です(一部を抜粋)

"これはコピーしないでください
"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

let s:dein_path = expand('$HOME/.vim/dein')
let s:dein_repo_path = s:dein_path . '/repos/github.com/Shougo/dein.vim'

if &runtimepath !~# '/dein.vim'
  if !isdirectory(s:dein_repo_path)
    execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_path
  endif
  execute 'set runtimepath^=' . fnamemodify(s:dein_repo_path, ':p')
endif

if dein#load_state(s:dein_path)
  call dein#begin(s:dein_path)

  let g:config_dir  = expand('$HOME/.vim/dein/userconfig')
  let s:toml        = g:config_dir . '/dein.toml'
  let s:lazy_toml   = g:config_dir . '/dein_lazy.toml'

  call dein#load_toml(s:toml,      {'lazy': 0})
  call dein#load_toml(s:lazy_toml, {'lazy': 1})

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

"End dein Scripts-------------------------
"これはコピーしないでください

私はvimrcの下の方に書きました。

実行して表示されたものをコピーして、vim起動時にエラーがないことを確かめてから書き換えましょう

dein.tomlへの記述

上記のvimrcのように、私は$HOME/.vim/dein/userconfigにdein.tomlとdein_lazy.tomlを配置しました。
tomlファイルは普通に$ vim dein.tomlで書けます。 まず最初はdein.tomlに以下のように書き、dein_lazy.tomlには何も書かなくて大丈夫です。

# プラグインの管理
[[plugins]] # これ使うのに必要
repo = 'Shougo/dein.vim'

ちなみにtomlでは『#』でコメントアウトになります。

感想

大変でした。でもvim使いこなしたいです。
一次ソースを読みましょう(戒め)


実践Vim 思考のスピードで編集しよう!【電子書籍】[ Drew Neil ]