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

Vim の autoload 以下のファイルに定義する関数名の指定方法について調べた

$
0
0

はじめに

Vim プラグインの勉強を続けています。勉強していて、autoload に指定した関数をどう呼ぶかについてすこしハマったので、整理のために書いておきます。

tl;dr

autoload 以下のファイル名と関数名のプレフィックスは一致させる必要があるようです。

autoload に書いた関数が呼ばれない

例として Hello Worldと表示する関数を helloworld.vimに作っていたとします。
最初、関数名を以下のようにしていました。

autoload/helloworld.vim
function! EchoHelloWorld()
  echo "Hello World"endfunction

その上でプラグインを Vim に設定した上で、:call EchoHelloWorld()と実行しても、E117: 未知の関数です: HelloWorldというエラーが表示されてしまいました。

どう指定するか

Vim のマニュアルに記載がありました。以下抜粋します。

Vim には autoload という仕組みがあります。同じこと
を次のように書くことができます:

        call mylib#myfunction(arg)

 (中略)

Vim は関数の名前を見て、それが未定義なら、
'runtimepath' の中から "autoload/mylib.vim" を探します。

 (中略)

ただし、関数名の '#' より前の部分はスクリプトの名前と同じにする必要があります。
そうしないと Vim はどのスクリプトを読み込めばいいのかわかりません。

つまり autoload以下のファイル名を起点に、そこに定義されている関数を読み込みに行くというような動きをしていることがわかります。

上記の例では、ファイル名と関数名のプレフィックスが一致していなかったため、呼び出された関数を定義できなかったということでした。

ファイル名#関数名というルールに則ることが必要なのですね。今回の場合は、helloworld#EchoHelloWorldと定義するべきでした。

おわりに

確かな情報はやはりマニュアルですね。ブログ記事や他のプラグインの書き方も参考にしつつ、マニュアルで正否を確かめるということが必要だなと思いました。

参考


vim チュートリアル

$
0
0

vimってなに?

最高最強のLinux標準テキストエディタさ。もしあなたがvimの虜になりたいというのなら、まず下のコマンドを何も考えず実行しよう。話はそれからだ。

sudo echo alias emacs=\'vim\'>>$HOME/.bashrc

vimにはノーマルモードと入力モードがあって、iとかAとかで入力モードに移行して、普段はesc連打でノーマルモードにして作業します。

基本操作

終了方法

vimを学ぶならまず最初に終了方法を学ばなければいけません。かんたん明快、esc連打して確実にノーマルモードに移動します。そして

:wq

これだけで、保存して終了することができます。

カーソル移動

vimは残念ながら、僕らが慣れ親しんだマウス操作に一切対応していません。もちろんカーソル移動も例外じゃなく、カーソル移動も以下のコマンドで行います。

l -> 右移動
k -> 上移動
j -> 下移動
h -> 右移動

ちなみに矢印キーでも移動できます。一応。でも矢印キーを使うならvimを使う意味は多分あんまりない。

でもいつも一文字一行ずつ移動してたら生産性なんてあったもんじゃない。さらに便利に移動できる以下のコマンドがあります。

w -> 次の単語の先頭に移動
e -> 単語の末尾に移動
b -> 一文字前に移動
0 -> 行頭に移動
$ -> 行末に移動

このweb0$はモーションといい、様々なコマンドと組み合わせて強力な操作の手助けをしてくれます。でも今はとりあえず楽に移動できるんだなぁくらいで大丈夫!またすぐ出てきます。

文字の挿入と削除

ここまで進んだのに未だに肝心のコードが書けない!安心してください今から教えますよ。

i -> カーソル位置にテキストを追加
A -> 行末に移動してテキストの追加
r -> カーソル位置の文字を置き換え
cw -> 単語の一部、もしくはすべての置き換え

とりあえずこれでコーディングはできるので続きはまた今度更新しよう

Vimでterraformをさくさく編集できる環境を整える

$
0
0

この記事はVim2 Advent Calendar 2019の8日目の記事になります。
今回はvim-lspとterraform-lspを使ってtfファイルを快適にいじる環境を整える記事を書こうと思います。

増えろ!terraformer!

terraformについて

terraformはHashiCorp.が開発・メンテナンスしているOSSの構成管理ツールです。
HCLという独自言語で記述して各リソースを定義・管理します。
AWS/GCP/AzureなどのパブリッククラウドやVMwareなどのHyperVisorなど幅広く対応しています。

一番の特徴は作成したリソースをterraform destroyで一括削除出来る点だと思っています。

本題

terraformを空きている人は実際どのエディタを使っているんでしょう。
大体の人はVSCodeでterraformの拡張機能を使っている人が多いのではないでしょうか。(偏見)

自分も最初はterraformの拡張機能をインストールしたVSCodeを使っていました。(vimキーバインドの拡張機能ももちろんセットで)
vim-lspを一度はインストールしてやってみようと思ったんですがぜんぜんやり方が分からなくて挫折していました。
vimconfに行ってvim-lspの話を聞いて熱がこもっってこれはやらねばならん!!!! と思いまして設定しました。
挫折したときはWindowsのterraformとterraform-lspをつかっていました。COREGA原因で出来なかったようです。(最後に少し書きます)

用意するもの

  • WSL ( Ubuntu 18.04 LTS )
  • vim-plug
  • terraform >= 12.0
  • terraform-lsp

自分はプラグイン管理ツールはvim-plugをつかっているのでそれ用で書きます。

また、terraformは12.0から少し言語の仕様が変わっているので、12.0で動くものを作ります。

terraform-lspの準備

ここにビルド済みのバイナリがあるので、
パスを通してあるところにビルド済みバイナリを配置します。
https://github.com/juliosueiras/terraform-lsp/releases/latest

juliosueiras氏にはいつもお世話になっています・・・

プラグイン呼び出し部分

補完に必要なプラグインとシンタックスハイライトができるプラグインを導入します。

~/.vimrc
call plug#begin('~/.vim/plugged')
  Plug 'prabirshrestha/async.vim'
  Plug 'prabirshrestha/vim-lsp'
  Plug 'prabirshrestha/asyncomplete.vim'
  Plug 'prabirshrestha/asyncomplete-lsp.vim'

  Plug 'hashivim/vim-terraform',{'for':'terraform'}call plug#end()

vim-lsp設定部分

LanguageServerを利用するための設定を導入します。
特に設定はせずに動きます。

~/.vimrc
if executable('terraform-lsp')auUser lsp_setup call lsp#register_server({    \'name':'terraform-lsp',    \'cmd':{server_info->['terraform-lsp']},    \'whitelist':['terraform','tf'],    \})endif

Windows版で試して動かないときはなにか引数が必要なのかと思って調べようとしましたが
そもそもLanguageServerの仕様をどうすれば調べられるのかすらわからず・・・

terraform-lspを使うには

これでterraform-lspを使う準備は完了です。

main.tf
provideraws{}

providerを記載してterraform initすれば準備完了、補完が聞くようになります。
その際にリソース名等をダブルクォーテーションで囲うとうまく補完効かなくなっちゃいます(何故だ・・・)

image.png

これでvimでtfファイルを使う準備が整いました。
よいterraformライフをおすごしください!

おまけ

この記事を書こうと思ったきっかけ

以前にもvimでterraform-lspの補完機能を使おうと思って挑戦してみていたのですがよくわからなくて挫折してました。
ですが、vimconfに行ってvim-lspの話を聞いて、モチベが爆あがりしたのでいろいろ遣りました。
割と作るのに苦労したので、これがアレばvimでterraformヲ使う人も増えてもっと自分の環境も快適になるかなと・・・

Windowsでterraform-lspが動作しない

2019/11/15 00:56:45 [DEBUG] checking for provider in "C:\\vim"
2019/11/15 00:56:45 [DEBUG] checking for provider in "C:\\Users\\user\\go\\bin"
2019/11/15 00:56:45 (*errors.errorString)(0xc00019c190)(Failed to find plugin: aws. Plugin binary was not found in any of the following directories: [., C:\vim, terraform.d\plugins\windows_amd64, C:\Users\user\AppData\Local\Temp\.terraform\plugins\windows_amd64, C:\Users\user\.terraform.d\plugins, C:\Users\user\.terraform.d\plugins\windows_amd64, C:\Users\user\go\bin])

2019/11/15 00:56:45 [DEBUG] plugin dirs: []string{".", "C:\\vim", "terraform.d\\plugins\\windows_amd64", "C:\\Users\\user\\AppData\\Local\\Temp\\.terraform\\plugins\\windows_amd64", "C:\\Users\\user\\.terraform.d\\plugins", "C:\\Users\\user\\.terraform.d\\plugins\\windows_amd64", "C:\\Users\\user\\go\\bin"}
2019/11/15 00:56:45 [DEBUG] checking for provider in "."
2019/11/15 00:56:45 [DEBUG] checking for provider in "C:\\vim"
2019/11/15 00:56:45 [DEBUG] checking for provider in "C:\\Users\\user\\go\\bin"
2019/11/15 00:56:45 (*errors.errorString)(0xc00019c400)(Failed to find plugin: aws. Plugin binary was not found in any of the following directories: [., C:\vim, terraform.d\plugins\windows_amd64, C:\Users\user\AppData\Local\Temp\.terraform\plugins\windows_amd64, C:\Users\user\.terraform.d\plugins, C:\Users\user\.terraform.d\plugins\windows_amd64, C:\Users\user\go\bin])

これはWindowsで試そうと思って出来なくて、terraform-lspのログを追っかけてたときのものです。
terraform initしたときにterraformは作業ディレクトリ配下にモジュールを配置するんですが、
そのディレクトリを見に行ってくれていない感があるなぁと思ってます。

もう少し余裕が出たらもう少し深堀りしてWindowsでもterraform出来る人を増やしたい・・・

Termux上でvimをコンパイルできたけどプラグインとの問題が解決できない

$
0
0

はじめに

この記事はTokyo City University Advent Calendar 2019 8日目の記事だよ.

termuxって何?って人はググったりしてね.

前回のvimコンパイル!

permission deniedされてできなかった.
前回の記事はこちら

啓示

@m_nish様からコメントをいただいたのでそれを元にうまくいくおまじないをかける
以下コメント欄に降ってきた啓示

やっぱり permission 関連でしょうか。。
Termux って使ったことないのですが、sudo make install ってできるんですか?
それか、自分の home ディレクトリにインストールするのもいいかもしれないですね。
./configure --features=huge --enable-multibyte --enable-perlinterp --prefix=${HOME}
でできるのではないかと思います。

もらったアドバイスにならって ./configureするときのインストール先を指定する.

termuxでvimをコンパイル ~perl編

教わったことをする

前回の記事では makeをした時にpermission関係のエラーがでた.詳しい原因はまったくわからん.

なのでアドバイス通り./configureの時に make installする際のインストール先をhomeディレクトリにしてやる. --prefixでインストール先ディレクトリを指定できるらしいので

$cd .vim/vim/bin
$./configure --with-features=huge --enable-multibyte --enable-perlinterp --prefix=${HOME}  

と叩いてやる.この時typoしない(一敗).やや時間がかかるので気長に待つ.

処理が終わったら makeをする.これは結構時間がかかるので気長に待つ.最後に make installで完成!!!!!!ホームディレクトリにbinディレクトリができてる!!!やったぁ!!!!!!!!!!

できたものを移す

これでvimの実行ファイルが晴れてできたわけだけど,このときvim --versionをしても-perlのままになっている.なぜなら作成された新しいvimはcom.termux/files/home/binに格納されているから.これをcom.termux/files/usr/binに移す.この作業はcpでやっちゃっていいかも[本当に?].

移せば完成です.vim --version | grep perlと叩いてやると

$ vim --version |grep perl
WARNING: linker: vim: unused DT entry: type 0x6ffffef5 arg 0x82ec
+channel           +insert_expand     +perl              -toolbar
Linking: gcc   -Wl,-E   -Wl,--as-needed -o vim        -lm -lncurses    -Wl,-E -I/data/data/com.termux/files/usr/include  -L/data/data/com.termux/files/usr/lib/perl5/5.28.2/arm-android/CORE -lperl -lm -ldl

+perlってなってる~~~~うれしい.
WARNING以降に書かれている事は無視していいみたいなことを海外の記事で読んだ.+perlの下に書かれているのは何?

問題発生 -プライグインvim-clangとの関係

Cファイルを開こうとしたらエラーが出た.
hoge
ファイルを開くことはできるけど,補完とか自動インデントとかが働かなくなってた.
プラグインはtomlファイルに管理させているのでプラグインを一度消してもう一度コンパイルしてみた.

と思ったけどなんかエラーが直らないぞ?

解決されない問題の根本 ~deinが働かない

色々試しているうちにdeinが働いていないような気がしてきた.試しに.vimrccall dein#add('jiangmiao/auto-pairs)という様に書いてやると.

[dein] /data/data/com.termux/files/home/.cache/dein/repos/github.com/jiangmiao/auto-pairs                                                                                       [dein] Maybe wrong username or repository.                                                
[dein] Error installing plugins:
[dein]   auto-pairs
[dein] Please read the error message log with the :message command.
Command terminated

[dein] Vim(let):E484: Can't open file /data/data/com.termux/files/usr/tmp/vr7OHHg/1
[dein] function dein#install[1]..dein#install#_update[38]..<SNR>15_update_loop[5]..<SNR>15_install_async[9]..<SNR>15_done[7]..dein#install#_recache_runtimepath[6]..<SNR>15_clear_runtimepath[9]..dein#install#_rm, line 29
Press ENTER or type command to continue

Can't open file /data/data/com.termux/files/usr/tmp/vr7OHHg/1という文をよく見る気がする.

そのディレクトリは

$ pwd
/data/data/com.termux/files/usr/tmp
$ ls -a
.   ..

・・・・・・・?

Termux一生分からん

あとがき

都市大アドカレ二本目なのでした.途中まで書いておいていつかしっかり書こうと思ってた内容なのですが,「8日目空いてる誰か書いてくれ!」とのことで急遽アドカレ記事にした結果検証しきれてなさすぎです.

明日はらぴーと君のskkに関する記事です.ちなみに僕はtermuxでの日本語入力をskkでやってます.導入手順をqiitaにまとめたりもしたよ.
↓こちらを読んでね
Kindle fire上で動くtermuxのvimでskk日本語入力をする

怖くなかったVim script

$
0
0

advent calendarの8日目です

これは

Vim scriptに触れたのでふんわり紹介
Vim scriptとか.vimがつくやつってunite.vimとかみたいに遠い存在かと思っていたがそんなことはなかった

前提条件

  • 環境
    • VIM - Vi IMproved 8.1 (2018 May 18, compiled Sep 18 2019 03:49:48)

書かないこと

  • 基本文法の解説
  • チュートリアル
  • モチベーション
    • 「普段、言語は何を?」って聞かれて「Vim scriptを少々」とか言えるようになりたくない???

参考文献

自分が触れていなかっただけで楽しめる入門記事はたくさんあった

本編

そもそも何

Vim script は Vim に組み込まれたスクリプト言語である。
https://ja.wikipedia.org/wiki/Vim_script

Wikipediaだがなるほど

Vim script 言語は vimrc ファイルや構文ファイルなど、さまざまな目的に使われま
す。この章では Vim script の書き方を説明します。説明することがたくさんあるので
大きな章になってます。
https://vim-jp.org/vimdoc-ja/usr_41.html

(コピペの結晶となっているvimrcを読み解けるようになる日が来るのか...という顔)

Hello World

個人的には新しい言語・環境を学ぶ時はHelloWorldが大きな境目だと思っていて、実行さえできれば先駆者の記事やリファレンスを読みながら進んでいける(はずな)のでHello Worldだけはやる

sh
vim hello_vimscript.vim
hello_vimscript.vim
echo "hello vim script"

ファイルを開いたまま

exコマンド
:source hello_vimscript.vim
出力
hello vim script

できた!
コマンドラインからの実行もできるが割愛

遊んでみた

構文解析してプラグイン開発!はまだ遠いので身近なところからやる
手前味噌(厳密には意味違う)だがこれを自動化する

できるもの

開始時間と終了時間と1単位(分)を入力するとToDoを管理できるフォーマットを出力する

コード

make_today_schedule.vim
command!-nargs=* MTS call MakeTodaySchedule(<f-args>)lets:d_st=10lets:d_ft=19lets:d_uom=30function!s:help()
  echo "Usage:"
  echo "\tMTS <StarHour> <FinishHour> <UnitOfMinute>"
  echo "Default:"
  echo "\tStarHour: ".s:d_st
  echo "\tFinishHour: ".s:d_ft
  echo "\tUnitOfMinute: ".s:d_uom
  echo "Example:"
  echo "\tMTS 9 18 30"returnendfunctionfunction! MakeTodaySchedule(...) abort
  " defaultを入力letst= exists("a:1") ? a:1:s:d_stlet ft = exists("a:2") ? a:2:s:d_ftlet uom = exists("a:3") ? a:3:s:d_uomifst=="help"calls:help()returnendififst<0
    echo "Message:"
    echo "\tStartHour must be after 0:00"calls:help()returnendif" 時間以外のテンプレートlet now = localtime()
  execute "normal a"."# ToDo on ". strftime("%Y/%m/%d", now)."\n\n"
  execute "normal a"."## ToDos"."\n"
  execute "normal a"."- ToDoA"."\n"
  execute "normal a"."- ToDoB"."\n\n"
  execute "normal a"."## Schedule"."\n"" 分に換算let minute_of_range =(ft -st) * 60" uom は区切りたい分の単位let num_of_line = minute_of_range / uom
  foriin range(0, num_of_line)leth=st+i * uom / 60letm=i * uom % 60" 0-9分の表記直しifm<10
      execute "normal a"."### ".h.":0".m."\n"else
      execute "normal a"."### ".h.":".m."\n"endif" 記入例ifi==0
      execute "normal a"."- ToDoA"."\n"endifendforendfunction

echoとかexecuteを連打してるのは見かけ良くなさそうなので、他の人のコードを読んで勉強せねば

終了時間を24以下としていないのは、自分が締め切り3日前に0:00~72:00と考えるようなよくない人間だから

実行

todoを管理するファイルを開く

sh
vim todo.md

todo.mdを開いた状態で

exコマンド
"読み込み:source make_today_schedule.vim"実行(デフォルト値):MTS
"実行(8時から20時、37分単位(半端な数でもとりあえずは動く)):MTS 82037"実行(ヘルプ):MTS help

下記は:MTS 8 20 37の実行結果

todo.md
# ToDo on 2019/12/08

## ToDos
- ToDoA
- ToDoB

## Schedule
### 8:00
- ToDoA
### 8:37
### 9:14
### 9:51
### 10:28
### 11:05
### 11:42
### 12:19
### 12:56
### 13:33
### 14:10
### 14:47
### 15:24
### 16:01
### 16:38
### 17:15
### 17:52
### 18:29
### 19:06
### 19:43

下記は:MTS helpの実行結果

Usage:
        MTS <StarHour> <FinishHour> <UnitOfMinute>
Default:
        StarHour: 10
        FinishHour: 19
        UnitOfMinute: 30
Example:
        MTS 9 18 30

使い方

タスクをToDosに列挙してyypを駆使して予定を立てる

おわり

これまでは思考停止でVim scriptは強者の戯れだと恐れていたが楽しいことがたくさんできそうだと思った

プログレスバーとかめちゃくちゃ楽しそうなので次はこちらをやりたい

vim-lsp の pyls が重いのをなんとかする

$
0
0

vim-lsp と pyls

Vim の Python 入力補完を jedi-vim から vim-lsp に乗り換えてみたが、動作が重い。
しかも Python ファイルを編集し始めてしばらくすると、編集しているファイルとは全然関係のない、OneDrive に置いてある.py ファイルの自動ダウンロードが頻発する。

プロセスをみると pyls.exe のサブプロセスで pylint がCPU全開でメモリをバカ喰いして走っていた。
こいつがいろんな場所の .py ファイルを触りまくるらしい。何してくれているの・・・。

どうやら pyls のプラグインの pylint が自動起動して意図しない動作をしているようだ。
こういうのがデフォルトになっているのは何だかなぁ。(自分の設定・環境のせいかな?)

プラグインはenabled(enable じゃなくて enabled) を設定すれば無効化できるようなので、補完用の jedi だけ残して停止させることにした。
これでなんとか使えそうだ。

.vimrc
if executable('pyls')call lsp#register_server({        \'name':'pyls',        \'cmd':{ server_info ->['pyls']},        \'whitelist':['python'],        \'workspace_config':{'pyls':{'plugins':{        \'mccabe':{'enabled':v:false },        \'preload':{'enabled':v:false },        \'pycodestyle':{'enabled':v:false },        \'pydocstyle':{'enabled':v:false },        \'pyflakes':{'enabled':v:false },        \'pylint':{'enabled':v:false },        \'rope_completion':{'enabled':v:false },        \'yapf':{'enabled':v:false },        \        \'jedi':{'extra_paths':[]},        \'jedi_completion':{'enabled':v:true,'include_params':v:true },        \'jedi_definition':{'enabled':v:true,'follow_imports':v:true,'follow_builtin_imports':v:true },        \'jedi_hover':{'enabled':v:true },        \'jedi_references':{'enabled':v:true },        \'jedi_signature_help':{'enabled':v:true },        \'jedi_symbols':{'enabled':v:true },        \}}},        \})
    autocmd FileType python setlocal omnifunc=lsp#complete
endif

余談だけど、vim-lsp も補完は jedi なんだね。

そこの君。vimを使ってみないかい?

$
0
0

本記事は、なんか布教したいエンジニア Advent Calendar 2019 の8日目の記事です。

軽めの自己紹介

コツコツしない系小6のgoriraです。Twitter→https://twitter.com/GoriraTatsu
コツコツやらない30日間自作osシリーズ→https://qiita.com/gorira_tatsu/items/0b5aec93aa74a8c89107

vimの好きなところ

1.キーボードだけで解決する

キーボードだけで編集ができるので、わざわざマウス持って、手首を振る必要は無くなります。余談ですが、最近マウスが壊れたんですけど、キーボードだけで編集できるので、配送される間もそこまで不便ではなかったです。

2.無駄な物が無い

画面がとってもスッキリしていて、文だけに集中できるので、作業効率が上がります。しかも無駄にpcのエネルギーを使わないので、軽いです。

3.プラグインが豊富

vimのプラグインはとても豊富です。例えば、
- vimの見た目をかっこよくできる
- 補完機能が使える
- vim上からgitにアクセスできる
- 目的のファイルのアクセスを簡単に
- インデントの深さを視覚
などができます。詳しく調べたい方はhttps://vimawesome.com/をどうぞ。

vimの嫌なところ

1.入力モードとコマンドモード

やっぱり他のエディタから乗り換えると、このモード分けは慣れないですよね。慣れが必要です。まあどんなこともそうだけどもやっぱり慣れない。(でもこの使い分けで高度な編集もできるよん。)

2.操作が複雑

操作を覚えるのがとても大変でした。正直な話、今でもこの操作はなんだっけと思ってしまいます。

インストール

今回は実行環境がmacなのでbrew:beer:でインストールします。コマンドは

$ brew install vim

なのですが、すでにmacには8.0(旧バージョン)が入っているので、vimを起動しても旧バージョンの方が起動します。このことを避けるために、パスを変更します。まず、

$ vim .bash_profile

ホームディレクトリにあるbash_profileを書き換えます。そうすると、こんな感じになってるはずです。(自分のpcの中身なのである程度関係ない)
スクリーンショット 2019-12-06 18.18.55.png

すでに入っていますが、/usr/local/Cellar/vim/8.1.2350を先頭に書き込みます。(パスの場所や、バージョンによって変わるので、多少違います)
そして、echo $PATHを打ち込み、/usr/local/Cellar/vim/8.1.2350があるか確認してください。それがあれば最新バージョンを起動することができます!

操作方法

基本コマンド

コマンド名内容
vim [ファイル名]起動する(ファイルを指定して、起動する)

上書きとか保存とか

コマンド名内容
:q終了する
:w [ファイル名]上書きする(名前をつけて保存する)
:q!保存せずに終了する

移動

コマンド名内容
h左に移動する
j下に移動する
k上に移動する
l右に移動する
w前方に単語1つ分移動する
b後方に単語1つ分移動する
Wスペース区切りで前方に単語1つぶん移動する
Bスペース区切りで後方に単語1つぶん移動する
O行頭に移動する
$行末に移動する
gg1行目に移動する
G最後の行に移動する

編集

コマンド名内容
iインサートモードに切り替える
Escノーマルモードに切り替える
d <カーソル移動コマンド>デリート(切り取りをする)
dd行をデリート
y <カーソル移動コマンド>ヤンク(コピーをする)
dd行をヤンク
pペースト(貼り付ける)
uアンドゥ(元に戻す)
Ctrl + rリドゥ(やり直す)

最後に

ここまでおつかれさまでーす。最後に教材を紹介します
・vimgorf https://www.vimgolf.com/
・日本語ドキュメント https://vim-jp.org/vimdoc-ja/
ではまた会いまっしょい

効率の悪い移動を繰り返すと自責の言葉を表示するVimプラグイン

$
0
0

アドベントカレンダー初参加です。

はじめに

みなさんは効率の良い・素早い移動を心がけているでしょうか?

本記事で吊るし上げる「効率の悪い」移動とは、

h/j/k/lを連打もしくは長押しすること

です。

効率の悪い移動を控えるように矯正し、f/F、その他検索やジャンプなどを使う癖をつけたいものです。

動作例

自責の言葉やフロートウインドウの大きさ、効率の悪い移動の許容範囲・回数は変更可能です。

「自責」1

自分で自分のあやまちを責めること。

似た言葉
恥じる 恥じ入る 慙愧 悔いる 悔やむ

矯正方法の例

  • h/j/k/lを無効化する
    • 突然なくなるのは苦しいかもしれません。
  • h/j/k/lを押すと保存せずにVimを閉じる
    • どこかの記事でみた気がしますが、過激過ぎます。
  • h/j/k/lをある回数以上繰り返したときに自責の言葉を表示する
    • 本記事で紹介する方法(プラグイン名: vim-hjkl-warning)です。

仕組み

移動する度に移動距離の測定と回数のカウントを行い、効率の悪い移動を繰り返し行った時に自責の言葉を表示するようにしています。

設定例1

letg:hjkl_warning_win_width=10letg:hjkl_warning_win_height=3letg:hjkl_warning_min_column=5letg:hjkl_warning_min_line=2letg:hjkl_warning_max_repeat=8letg:hjkl_warning_message=["わたしには","学習能力が","ありません"]letg:hjkl_warning_enable_title=v:false

横方向に5文字未満、もしくは縦方向に2文字未満の移動を8回を超えて連続で繰り返した時、以下のように表示されます。
Screenshot 0001-12-07 at 5.58.47 PM.png

設定例2

letg:hjkl_warning_win_width=2letg:hjkl_warning_win_height=1letg:hjkl_warning_min_column=3letg:hjkl_warning_min_line=1letg:hjkl_warning_max_repeat=5letg:hjkl_warning_message=["😡"]letg:hjkl_warning_enable_title=v:false

横方向に3文字未満、もしくは縦方向に1文字未満(つまり縦方向では判定されない)の移動を5回を超えて連続で繰り返した時、以下のように表示されます。
Screenshot 0001-12-07 at 6.07.35 PM.png

リポジトリ

おわり

記事を読んでくれてありがとうございます😊

プラグインを作ったのは初めてで、かつあまり時間を割けなかったため、作りが甘い・良くない可能性が高いと思っています。

例えば、pluginディレクトリやautoloadディレクトリの違いなどをあまり理解せず、全てpluginディレクトリの1ファイルで済ませてしまっています。

ご意見やアドバイスなどあれば、コメントしてくれると嬉しいです(礼儀のない感じや喧嘩などは嫌です😥)。


初心者が送る初心者のためのneovim

$
0
0

初心者が送る初心者のためのneovim

皆さんはエディターで作業をしていますか?色々あると思います。私はと言うと最近vscodeからneovimに乗り換えました。今回はvim初心者の私がどうやってneovimに乗り換えたかをお伝えしていきたいと思います。

注意:この記事ではvimの操作説明をする気はないので操作に関しましてはこちらを参考にしてください

https://qiita.com/JpnLavender/items/fabcc79b4ab0d52e1f6d

neovimとは?

neovimとは、vimよりもメンテナンスがしやすい物を作ってみんなでより良くして行こう!と言う物です(かなりざっくり)

詳しくはこちらの記事:https://qiita.com/lighttiger2505/items/440c32e40082dc310c1e

NeoVimをインストール

今回はMacで環境を構築していきます。
まずはneivimをインストールします。
まずはターミナルを開きます。

そうしたら次のコマンドをうちます

$ brew install neovim

brewを導入されていない方はこちらが参考になります

https://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc

はい、これでneivimのインストールは終わりです!
試しにターミナルで次のコマンドを実行します

$ nvim --version

私の環境ではこのような結果になりました

NVIM v0.4.3
Build type: Release
LuaJIT 2.0.5

人によってversionは異なると思いますがこのような結果が得られれば成功です

neovimをカスタマイズする

何の設定をしていないvimも確かにいいです。ターミナルで作業できますし、軽いし、何より全ての動作がキーボードで完結します。しかし、vimには便利なプラグインがたくさん入れます。ここからはプラグインなどの設定をしていきます。

deinを導入する

deinとはプラグインマネージャーです。つまり、deinを導入することでプラグインを入れたり、消したり、アップデートしたりなどが簡単に出来る様になります。

deinの導入に関してはこちらの記事を参考にさせていただきました

https://qiita.com/Coolucky/items/0a96910f13586d635dc0

まずは、ターミナルを開きます。そうしたら次のコマンドを実行してあげます

$ mkdir -p ~/.cache/dein

$ cd ~/.cache/dein

$ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh

$ sh ./installer.sh ~/.cache/dein

まず1行目では~/.cache/deinディレクトリがなかった場合ディレクトリを作成します。
2行目以降では~/.cache/deinディレクトリに移動し、そこにgithubからdeinを落とします。こうすることで自身の環境にdeinを導入します。

neovimの設定

初見では、neovimの設定をどこにするのか全然わからないと思います。ネットではvimrcがどうたらこうたら言っていて...

ここでは、neovimの設定ファイルを作成して書き込んで行きます。
まずはターミナルを新しく開きます。そうしたら次のコマンドを打ちます。

$ cd .config/nvim

この中にneovimの設定を書き込んで行きます。
まずはneovimの設定を書くinit.vimとpluginの設定をかく、dein.tomlを作成するために次のコマンドを実行します。

$ touch init.vim dein.toml

そうしたらinit.vimを編集するために次のコマンドを実行します。

$ nvim init.vim

こうすることでneovimでinit.vimを編集することができます。
ですが、いきなりneovimで作業しだすとわけがわからないので次のようにしてください。
1. iキーを押す
2. したのコードをコピーしてinit.vimに貼り付け
3. そうしたescキーを押す
4. :wqと入力する
以下のコードは次の記事を参考に設定させていただきました。

https://qiita.com/hanaclover/items/f45250b55e2298c4ac5a

init.vim
if!&compatible
  set nocompatible
endif" dein自体の自動インストールlets:cache_home= empty($XDG_CACHE_HOME) ? expand('~/.cache'): $XDG_CACHE_HOME
lets:dein_dir=s:cache_home.'/dein'lets:dein_repo_dir=s:dein_dir.'/repos/github.com/Shougo/dein.vim'if!isdirectory(s:dein_repo_dir)call system('git clone https://github.com/Shougo/dein.vim '. shellescape(s:dein_repo_dir))endiflet&runtimepath =s:dein_repo_dir.",".&runtimepath
" プラグイン読み込み&キャッシュ作成lets:toml_file= fnamemodify(expand('<sfile>'),':h').'/dein.toml'if dein#load_state(s:dein_dir)call dein#begin(s:dein_dir)call dein#load_toml('~/.config/nvim/dein.toml')call map(dein#check_clean(),"delete(v:val, 'rf')")call dein#end()call dein#save_state()endif" 不足プラグインの自動インストールif dein#check_install()call dein#install()endif

これは何をしてるのかと言うと,まずdeinがインストールされていなかったら自動でインストールしてくれます。次に、dein.tomlを読み込んでインストールされていないpluginがあったら自動でインストールします。
この辺は私自身も曖昧ですので間違いがありましたらご指摘ください。

pluginを導入する

次にdein.tomlを編集していきます
まずはターミナルで

$ nvim dein.toml

を実行してdein.tomlを開きます。
そうしたら以下のコード上と同じ手順で貼り付けします。

dein.toml
[[plugins]]repo='Shougo/dein.vim'

[[plugins]]はプラグインを追加しますと宣言します。
2行目に関しては、例えばrepo='hoge/huga'だったらとしたらgithubにあるhogeと言う人のhugaと言うリポジトリを追加すると言う意味になります。

PythonのPathを通す

pluginによってはpythonを使用することがあるためpythonのpathを通します。今回はpyenvを使用しません!
まずはbrewを使用してpython2とpython3をインスールします
それではターミナルを開き、以下のコマンドを実行します。

$ brew install python2
$ brew install python3

無事インストールが完了したら以下のコマンドを実行します

$ pip install neovim
$ pip3 install neovim

これで完了です。
そうしたらnvimを開き:CheckHealthというコマンドを実行します
以下のような結果になれば成功です

スクリーンショット 2019-12-08 15.52.02.png

pluginを追加する

NERDTree

https://github.com/scrooloose/nerdtree

NERDTreeを使うことで簡単にファイルの移動が行えるようになります。
これを使用するには以下のように記述します。

dein.toml
[[plugins]]repo='scrooloose/nerdtree'

neovimで使用する際には:NERDTreeと打つことでファイルを表示できます。
image.png

画像元:https://github.com/scrooloose/nerdtree

nerdtree-git-plugin

https://github.com/Xuyuanp/nerdtree-git-plugin

こちらはNERDTreeを使用した際に、変更が加わったかなどのgitのステータスが見ることができます。
使用する際には以下のように記述します

[[plugins]]
repo = 'Xuyuanp/nerdtree-git-plugin' 

vim-nerdtree-tabs

https://github.com/jistr/vim-nerdtree-tabs

これを使うことで:NERDTreeTabsToggleを使うことで簡単に開閉することが出来ます
導入するには以下のようにしてください

[[plugins]]
repo = 'jistr/vim-nerdtree-tabs' 

またinit.vimに

init.vim
map <Leader>n<plug>NERDTreeTabsToggle<CR>

などと書くことでショートカットでの開閉が行えます。
上のコードに<Leader>と書いてあると思いますがここを<Space>に置き換えることで
Space+nを押した時に:NERDTreeTabsToggleを実行できます
また<Leader>n<C-n>に置き換えることで
Ctrl+nを押した時にも同様にことができるようになります。

vim-devicons

https://github.com/ryanoasis/vim-devicons

こちらを導入することでNERDTreeを開いた時にファイルアイコンなどが出るようになります
導入するには以下のように記述してください。

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

こちらを導入するだけだとファイルアイコンが文字化けして表示されないかと思いますのでNerd Fontsを使用します。

Nerd Fonts

https://github.com/ryanoasis/nerd-fonts

こちらの導入は今までのに比べると手間がかかります。
今回は公式リポジトリのやり方ではなく、予めNerd Fontsが適用されたフォントを使用させていただく形でやっていきます。公式のやり方でやりたい方は以下をご覧いただくと参考になると思います。

https://qiita.com/park-jh/items/4358d2d33a78ec0a2b5c

今回は以下のリポジトリをクローンしてnerd-fonts-fontpatchedフォルダのなかのフォントをインストールします。

https://github.com/macchaberrycream/RictyDiminished-Nerd-Fonts

そうしましたら、お使いのターミナルのフォントをいまインストールしたフォントに設定します。
ちなみに私の環境ではpowerLineを使用しているのですが、このフォントを使っても文字化けは起きませんでした。

lightline

https://github.com/itchyny/lightline.vim

こちらのpluginを使用することで、自分が今どのモードを使っているのか視覚的にわかりやすくなります
導入するには以下のように記述してください

[[plugins]]
repo = 'itchyny/lightline.vim'

最後に

かなり人のコードを貼り付けただけになりつつあり申し訳ないですが、誰かのお役に立てると幸いです。
(気が向いたらcoc.nvimの設定も書きます)

Vim本体だけでHTTP通信してみた話

$
0
0

こんにちわ、ゴリラです。

Vimを使っているみなさんは、channel機能はご存知でしょうか?
channelを使用することで、他のプロセスと通信することができます。通信はTCP/IPプロトコルで行われます。

本記事はchannel機能を使って、HTTP通信をしてみた記事になります。(HTTPについては解説しません)
curlといった外部コマンドに頼らなくても簡易なGETなら、Vim本体だけで行うことができます。

では、早速解説していきます。

デモ

こんな感じです。
http.vim.gif

チャネルについて

channelRAWNLJSONJSといった通信フォーマットがあります。
JSONなら送信したメッセージがJSONに変換されます。例えばhello gorillaを送信した場合、[1, "hello gorilla"]に整形され送信できます。
RAWならテキストがそのまま送信することができます。HTTPの実態はプレーンテキストなので、今回はRAWを使用します。
詳細は:h channelを参照してください。

チャネルを開く

ch_open関数を使用します。
let channel = ch_open("localhost:80", {"mode": "raw"})だけで接続できます。
echo ch_status(channel)でチャネルの状態を確認できます。openは接続中、closeは接続終了を指します。

リクエストを送信

チャネルに対して送信するにはch_sendraw()関数を使用します。これはテキストをそのまま送信する関数になります。
レスポンスはコールバック関数を使用することで受け取ることができます。

HTTPのGETリクエストをチャネルで送信処理は次になります。

func! MyHandler(channel, msg) abort
    new RESPONSE |set buftype=nofile
    call setline(".",a:msg->split("\r\n"))
    nnoremap <buffer><silent>q:bw!<CR>
endfunc

lets:get_request="GET / HTTP/1.1\r\nHost: localhost\r\n\r\n"call ch_sendraw(channel,s:get_request,{'callback':"MyHandler"})

ch_sendrawの第2引数は送信したいテキスト、第3引数はコールバック関数MyHandlerを設定します。
MyHandlerでは新たなバッファを作成して、受け取ったレスポンスをバッファに書き込んでいます。

Dockerのコンテナ一覧を取得

このやり方をちょっとだけ応用して、Dockerのコンテナ一覧を取得することもできます。
ch_openでDockerのサーバーを指定してs:get_requestGET /containers/json?all=1 HTTP/1.1変えるだけです。

http-vim-container.gif

Macの場合はsocat TCP-LISTEN:80,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sockという感じでソケット通信をTCPに変換してからやってみてください。

まとめ

以上、とても簡単ですがVim本体だけでHTTP通信をしてみました。
興味あるかたはぜひ試してみてください。

サンプルコードはこちらに置いてあります。

【(集中すれば)3分で読める】Vimの魅力

$
0
0

はじめに

AdventCarender9日目を務めます、DMM Webcampメンターの@ayumuabe1434です!!

さてタイトルにもあるようにVimに関してです。
この記事は

「いろんなテキストエディタがあるけどどれがいいの?」

「Vimってよく聞くけどなにがいいの?」

と、なんのテキストエディタを使うか迷われている方対象の
Vimに魅力を感じすぎてしまう記事です。
といっても長いと読むのがめんどくさいので短くいきましょう!!

メリット

自分だけのテキストエディタになる

vimは完璧に自分好みのテキストエディタにすることができます。

デザインはもちろんのこと、プラグイン、ショートカットコマンドも
自分が動かしやすいものに変えることができます!

vimはとても育てがいのあるテキストエディタです!

例えば僕のVimなのですが、
始めはこんなVimが...

なんということでしょう!設定ファイルをいじるだけで
こんなにもきれいになったじゃありませんか!()

始めは素朴だったテキストエディタを自分で育てることができる快感は格別です!!!

すべてコマンドでかたがつく

「マウスを使わない」というのはとても大きいです。

基本的にVimはターミナルで動かすので、
GitをVimだけで完結させることが可能です!

というかターミナルでやることへの移動がとても簡単!!

どの環境でも使える

設定ファイルをGithubにあげておくと、
他のどのパソコンでも自分の設定ファイルを落とし込むだけで
簡単に(5分もかからず)今まで慣れ親しんだvimを使うことができます!
場所を選ばないとは最高ですね!!

また、実は...

他のテキストエディタのほとんどが
プラグインとしてvimのコマンドが使うことができます!!

Atom, VScode, Sublime textはもちろん大抵のテキストエディタには
プラグインとして備わっています!

そしてなんと...

Google検索もVimコマンドを使うことができます!

またGoogleCromeの拡張機能でもVimのプラグインがあり、
Vimになれた人ならこれがめっちゃ便利...。

恐るべき...Vim...。
こんなに汎用性の高いVim...やらない理由が見当たらない...。

コーディングの速度がとても早くなる

やはり自分好みの設定にすることでコーディングの速度は早くなります。
そして特に

  • ドットコマンド
  • オペレーター+テキストオブジェクト

などのVim特有のコマンドによってコーディングの速度を数倍にしてくれます!

例えばドットコマンドとは何ぞやというと
繰り返し処理を楽にしてくれるコマンドです。

下のGIFをご覧ください。

vim-dot-command.gif

これはimgタグ3つまとめて画像の場所の指定を変えたい時ですね。
3回も同じ作業をするのはめんどくさい...。
そんな時は
.を打つだけで少し前に行った作業を繰り返しおこなうことができます!

...ん?これってすごいのか..?
いやめちゃめちゃ便利です!!
つまり
ショートカットコマンドを簡単にその場で設定してその場で使える
みたいなもんです!!(伝われ)

詳しくは参考ページに別のurl貼ってあるので見てみてください!

デメリット

なんせ使いこなすのが難しい

これ、これなんですよ。

Vimを使い始める人が最も挫折する原因。
唯一にして最大のデメリット。

vimは他のテキストエディタと違いすぐには使いこなせません。
使い方やコマンドなどを覚えていき、
自分の設定ファイルを育てていき、
それに慣れてから生産性がとてつもなく上がっていきます。

なので
「今すぐにテキストエディタが欲しい!」
という人には向いていないかもしれません...。

しかし自分のプログラミングの能力とともに成長してきた感はたまらないです。
(愛犬みたいなものですね(?))

最後に

いかがだったでしょうか。
勢いで書いた感は否めませんが少しでも
「Vimいいじゃん!」っておもっていただければ幸いです!
Vimの未来に幸あれ。

参考ページ

どの環境でも同じパフォーマンスを発揮するdotfilesのsetting & setup

Vimのドットコマンドが便利っぽい
vim マクロの使い方

Vimのテキストオブジェクトについてまとめた

Chrome拡張機能のVimiumを使ってキーボードだけでブラウザを操作する

Vimの様々なカーソル移動のやり方

$
0
0

こんにちは。
ゴリラです。

Vimにはhjkl以外にも様々のカーソル移動のやり方があります。本日はVim標準機能でカーソル移動のやり方について紹介します。
狙ったところにスパッと行けると気持ちいいし編集も早くなるので、いろいろなやり方を知っておくと吉です。

単語単位の移動

単語の種類

単語は大きく分けて2種類あります。wordWORDです。
wordの定義は:h wordでヘルプを引くと次のようになっています。

word はアルファベット、数字、アンダースコア、もしくは他の非空白文字の連続で構
成され、ホワイトスペース(スペース、タブ、<EOL>)で区切られます。これらは
'iskeyword' オプションで変更することができます。空行もwordとみなされます。

ここでいうその他の非空白文字は、例えば記号などです。
1例ですが、hello-1%はデフォルトでは4wordになります。hello-1%ですね。

単語の定義をユーザが自前で追加することができます。
これはヘルプの通りiskeywordオプションで単語のパターンを定義できます。
例えば$nameを1単語として扱うにはset iskeyword+=$$を追加します。PHPを書くときはこのような設定をしておくと吉です。

もう1つのWORDの定義は:h WORDでヘルプを引くと次のようになっています。

WORD は非空白文字の連続で構成され、ホワイトスペースで区切られます。空行もまた
1つの WORD と見なされます。

WORDはシンプルです。例えばhello-1% &*gorillaは2WORDになります。
wordWORDは文章だけだと分かりづらいので、gifを一応用意しましたが、ぜひ自分で動かしてみてください。

wordの移動

コマンド説明
[count]w[count] wordの前方に移動vim-w.gif
[count]e[count] wordの前方の単語の終わりに移動vim-e.gif
[count]b[count] wordの後方に移動vim-b.gif
[count]ge[count] wordの後方の最後に移動vim-ge.gif

WORDの移動

コマンド説明
[count]W[count] WORDの前方に移動vim-big-w.gif
[count]E[count] WORDの前方の単語の終わりに移動vim-big-e.gif
[count]B[count] WORDの後方に移動vim-big-b.gif
[count]gE[count] WORDの後方の単語の最後に移動vim-big-ge.gif

ftで横移動

特定文字に移動

[count]f{char}で現在行の右に向かって[count]目の{char}に移動できます。
個数をぱっと見てわかるならカウントを使うと良いですが、ぱっとみてもわからないことが多いので、
そういうときはカウントを使わず、;で対象の{char}に移動するとよいと思います。

左に向かって移動したい場合はFになります。
次のgifはfを使ってoの文字に移動したあとに、;で次のoに移動する例になります。

vim-f.gif

ちなみに、fFはモーションなので、オペレーターと組み合わせる事ができます。df{char}{char}までのテキストを削除できたりします。便利ですね。

特定文字の手前に移動

[count]t{char}で現在行の右に向かって[count]目の{char}の1つ左の文字に移動します。
左に向かって移動したい場合はTになります。
こちらもモーションです。次のgifはモーションと組み合わせた例になります。

vim-t.gif

先頭、末尾に移動

^で行頭の非空白文字、$で行末に移動できます。行末の非空白文字に移動したい場合はg_を使うと吉です。

対となる文字に移動

%を使うと対象の文字に移動できます。例えば{"name": "gorilla"}の場合{にカーソルをおいた状態で%を使うと}に移動します。
デフォルトは([{}])ですが、matchpairsオプションでカスタマイズすることができます。

例えばset mps+=ウ:ホを設定すると%を使うとに移動できます。次のgifはその一例になります。

vim-match.gif

指定行に移動

[count]Gもしくは[count]gg[count]行目の最初の非空白文字に移動できます。
ggGはジャンプモーションと呼ばれていて、ジャンプリストという履歴に残ります。

これの何が便利かというと、[count]Ctrl-o[count]だけ古いカーソルの位置、[count]Ctrl-i[count]だけ新しいカーソル位置に移動できます。
ジャンプリストは:jumpsで確認できます。

ジャンプモーションは他にもいくつかあります。:h jump-motionsで参照してください。

ちなみに、指定した行に移動する方法として:10というように行数を指定することで、その行数に移動できます。
ただ、これはジャンプリストには履歴として残らないので、筆者はggもしくはGをおすすめします。

指定行分を移動

[count]j/[count]kで現在行から[count]行分移動できます。例えば2jなら2行下の行に移動できます。
こういった移動の仕方をよく使う時は:set relativenumberを設定しておくと便利です。

image.png

設定すると画像のように、現在行との差分の行数が表示されます。こうすれば計算しなくて済むので楽です。

段落の移動

{段落の後方に、}で段落の前方に移動します。
段落の定義は:h paragraphでヘルプを引くと次のようになっています。

段落はそれぞれ空行の後から始まり、そしてまた段落マクロのセットからそれぞれ始ま
ります。段落マクロは 'paragraphs' オプションで指定されている文字のペアです。デ
フォルトで "IPLPPPQPP TPHPLIPpLpItpplpipbp" で、".IP", ".LP", などのマクロに一
致します(これらは nroff のマクロです。ですのでドットは1桁目になければなりませ
ん)。セクションの境界は段落の境界でもあります。空行(ホワイトスペースのみを含む
行)は、段落の境界ではないということに注意してください。
これは '{' か '}' を1桁目には含んでいないということにも注意してください。
'cpoptions' にフラグ "{" が入っていると1桁目の "{" が段落の境界とみなされるよ
うになります。|posix|

難しいこと書いてありますが、段落は空白の行のあとから始まるというのを理解していれば良いと思います。
つまり、段落の間の空白に移動するということです。

検索による移動

これはあまり知られていないかもしれませんが、/の検索もモーションの1つです。
例えばvで選択したあとにnNで移動すると選択は選択範囲が移動したカーソルまで広がります。
次のgifはその一例です。

vim-search.gif

モーションなので、もちろんオペレーターと組み合わせることもできます。
例えばdのあとに/\//を検索してEnterを押すと現在のカーソル位置から/までのテキストを削除します。
次のgifがその一例です。

vim-d-search.gif

他に*によるカーソル下の単語検索もとても便利です。

個人的にこの検索によるカーソル移動は一番汎用性があると思っています。
これまでに紹介してきた移動方法は縦か横のみですが、検索はそういった制限はなく自由度も高いです。

vim-search-asta.gif

マークによる移動

Vimにはマークと言う機能があり、m{a-zA-z0-9}でカーソル位置をマークすることができます。これはブックマークのような機能になります。
小文字はファイル内のみ使用可能なマーク、大文字と数字はファイル間の移動ができるマークになります。
マークした場所にジャンプしたい場合は`{mark}というように`に続けてマークを入力します。

次のgifがマークの一例です。

vim-mark.gif

:marksで現在のマークを確認する事ができます。
ちなみに、マークもモーションの1つなので、オペレーターと組み合わせて使うことも可能です。

マークについてより詳しく知りたい方は:h mark-motionsを参照してください。

まとめ

筆者が普段使っている移動方法について一通り紹介しました。本記事を読んで、編集の効率が上がったら嬉しいです。
実は、まだまだ他にもたくさんの移動法があります。筆者も全てを把握していません。
興味ある方は:h motionsでヘルプを読むと吉です。

ではよいVimライフを〜

VSCode の Vim 拡張機能が動かなくなったのでダウングレードした

$
0
0

VSCode の Vim 拡張機能が動かなくなったのでダウングレードしました。VSCode の拡張機能の動作不良は初めて遭遇したので、これを機にまとめておきます。

まずは拡張機能のタブを開いて動作不良の(今回は Vim)拡張機能を探します。
Screen Shot 2019-12-09 at 16.39.32.png
右下の歯車マークをクリックするとメニューが出てきます。
Screen Shot 2019-12-09 at 16.39.44.png
「Install Another Version...」をクリックすると VSCode の中央にバージョンの選択画面が出てきます。
Screen Shot 2019-12-09 at 16.33.38.png
基本的には 1つ前のバージョンを選択すればこれまで通り使えます。今回、動作不良があった Vim は 1.12.0 だったので、1つ前の 1.11.3 を指定しました。

VSCode の拡張機能は便利な反面、動作不良があると作業効率が圧倒的に落ちてしまいます。別に開発者の方々は動作不良を起こしたくて起こしているわけではないので、そっとダウングレードして元の作業効率を保ちましょう。そして快適な VSCode ライフを送りましょう。

Vimの縦移動を強化する

$
0
0

こちらの記事は Vim2 Advent Calendar 2019 10日目の記事になります。

縦移動が弱いと言われがちのVim。
確かに縦に狙った場所にバチッと移動するのは難しいような気がします。
バッチバチに動きたかったので、何か良い方法が無いか調べてみました。

行番号を相対表示にする

簡単かつ効果が大きかったものです。
行番号は、デフォルトでは絶対表示(頭からn行目)ですが、相対表示(カーソルからn行目)にすることができます。
相対表示にする事で、目的地までの距離がわかりやすくなり、カーソル移動やオペレータ範囲指定が爆速になります。
スクリーンショット 2019-12-09 23.10.06.png
例: 画像のattr_encryptedの行まで移動したい場合
6jで該当の箇所に移動できます。
行番号部に6と表示されているため、現カーソルの6行下だということが瞬時にわかります。

設定

vimrcに以下を書くだけです。

.vimrc
set relativenumber

%による移動の強化

Vimでは、(){}など、対になる括弧は%で行き来することができ、縦移動の際によく使っていました。
この%による移動をプラグイン、vim-matchupを導入して強化します。

vim-matchup

vim-matchupを使うと、(){}など以外にも、条件分岐などからの「オープン」「クローズ」「ミッド」の単語を検出し、%で移動することができます。
スクリーンショット 2019-12-09 23.10.06.png

また、%+αの便利なコマンドが用意されています。


- ]%[%
外側の開閉単語へ移動
- z%
開単語の中に移動
- dz%
次の開単語まで削除

対応単語·記号のハイライト表示もされます。便利です。

設定

お使いのVimプラグインマネージャーを使ってプラグインをインストールしましょう
例: dein.vim + toml

toml
[[plugins]]repo='andymass/vim-matchup'

縦方向f移動の実装

縦移動に関する記事を探していたら、偶然同じカレンダーで記事を書かれている方がいらっしゃいました。
こちらは当カレンダー2日目の記事で紹介されている方法です。
.vimrcに4行書くだけでSpacefを使った縦移動を実装することができます。
バチッと移動できますね。

Vim で縦方向 f 移動を実現した (@monaqaさん)
https://qiita.com/monaqa/items/9764e957523ad0b56aec

おわりに

  • 行番号を相対表示にする
  • %による移動の強化
  • 縦方向f移動の実装

3つしか紹介できなかったのですが、どれも便利な機能なので
是非試してみてください。

VimでSlackをしよう

$
0
0

こんにちは。
Qiitaへの投稿がめちゃくちゃ久しぶりなひがしです。

この記事はVim Advent Calendar 2019の10日目の記事です。

VimでSlack

本題です
この記事ではVimでSlackをしていきたいと思います
ちなみに私はVimでSlackをするためのプラグインとして
https://github.com/higashi000/sarahck.vim
を作っています
良ければ使ってみてください

どうやってやるのか

必要なもの編

上記のsarahck.vimでは、
- Slack Legacy token
- Slack API
- vim-jp/vital.vim
を使っています。
この記事では上記の3つに加え、mattnさんが作成されている、webapi-vimを使っていきます。
tokenは他人に知られるとアカウントを乗っ取られてしまうので注意して使ってください

vital.vimの下準備

これから紹介するvital.vimを使ったサンプルではvitalizeがすでにされている前提で話が進んでいます。
というわけでvitalizeの手順を説明しておきます。
まずVimを起動して以下のコマンドを実行します。

:Vitalize --name=作成しているプラグイン名 . +Web.HTTP +Web.JSON

終わりです。
サンプルコードのhigashi000の部分を作成しているプラグイン名に置き換えてください。
こちらの記事ではvital.vimのWeb.HTTPとWeb.JSONを主に使用します。

チャンネルリストを取得しよう

チャンネルを取得する際はchannels.listを使用します
tokenをつけてHTTP Requestsを送ると全チャンネルのリストが取得できます。

sample(vital.vim)

let token ='トークン'lets:V= vital#higashi000#new()lets:H=s:V.import('Web.HTTP')lets:J=s:V.import('Web.JSON')let slackRes =s:H.get('https://slack.com/api/channels.list',{'token': token})letres=s:J.decode(slackRes.content)ifres.ok !=1returnendif

execute ":redir!>"."channel.txt"foriinres.channels
    :silent!echoni.name ."\n":silent!echoni.id ."\n":silent!echon"\n"endfor:redir END

sample(webapi-vim)

let token ='トークン'let slackRes = webapi#http#get('https://slack.com/api/channels.list',{'token': token})letres= webapi#json#decode(slackRes.content)ifres.ok !=1returnendif

execute ":redir!>"."channel.txt"foriinres.channels
    :silent!echoni.name ."\n":silent!echoni.id ."\n":silent!echon"\n"endfor:redir END

今後のチャンネルを指定するパラメータはここで入手したidを使用します
nameではないです

Slackにメッセージを送信してみよう

メッセージを送信する際にはchat.postMessageというAPIを使います。

このAPIは要素としてtoken、channel ID、textが必須で、更にas_userをtrueにしないと自分ではなく、Slack API Testerが喋ってしまいます
sample(vital.vim)

let channelID ='投稿したいchannelのID'let text ='投稿したい内容'let token ='token'lets:V= vital#higashi000#new()lets:H=s:V.import('Web.HTTP')lets:J=s:V.import('Web.JSON')let slackRes =s:H.post('https://slack.com/api/chat.postMessage',    \{'token': token,    \'channel': channelID,    \'text': text,    \'as_user':'true'})letres=s:J.decode(slackRes.content)ifres.ok ==1
  echo 'complete'else
  echo 'failure'endif

sample(webapi-vim)

let channelID ='投稿したいchannelのID'let text ='投稿したい内容'let token ='token'let slackRes = webapi#http#post('https://slack.com/api/chat.postMessage',    \{'token': token,    \'channel': channelID,    \'text': text,    \'as_user':'true'})letres= webapi#json#decode(slackRes.content)ifres.ok ==1
  echo 'complete'else
  echo 'failure'endif

ほとんど変わりませんがどちらでもメッセージの送信ができます、優勝

Slackのメッセージを確認しよう

メッセージを確認するならchannels.historyを使います
APIのオプションにtoken、channelをつけてrequestsを送るとメッセージが取れます。

sample(vital.vim)

let token ='トークン'let channelID ='対象チャンネルID'lets:V= vital#sarahck#new()lets:H=s:V.import('Web.HTTP')lets:J=s:V.import('Web.JSON')let historyAPI ='https://slack.com/api/channels.history'let slackRes =s:H.get(historyAPI,{'token': token,'channel': channelID})letres=s:J.decode(slackRes.content)

execute ":redir!>"."channelHistory.txt"foriinres.messages:silent!echoni.text ."\n"endfor:redir END

sample(webapi-vim)

let token ='トークン'let channelID ='対象チャンネルID'let historyAPI ='https://slack.com/api/channels.history'let slackRes = webapi#http#get(historyAPI,{'token': token,'channel': channelID})letres= webapi#json#decode(slackRes.content)

execute ":redir!>"."channelHistory.txt"foriinres.messages:silent!echoni.text ."\n"endfor:redir END

まとめ

vital.vimやwebapi-vimを使えば簡単にHTTP Requestsを送ることができるようになり、Slack APIが使えるようになります。
開発者の方にこの場を借りてお礼を申し上げます。
ありがとうございます

いつかはvital.vimやwebapi-vimの開発に携われるようになりたいと思います。

ここまで読んでくださりありがとうございました。


centos7 で ultisnips を使用する際に py3 import vim エラーが出る場合の対応

$
0
0

概要

vimはvimscript以外に他の言語でも機能を拡張できるようになっています。
ultisnipsはpy3コマンドを使うようになったのでvimのpython3環境が必要です。

以前のultisnips

autoload/UltiSnips.vim
exec g:_uspy"import vim"
exec g:_uspy"from UltiSnips import UltiSnips_Manager"

今のultisnips

py3 import vim
py3 from UltiSnips import UltiSnips_Manager

今のvimの状態を確認してみる

python3のところが -になっているのを +にします

$ vim --version
+acl               +eval              +modify_fname      +tag_old_static
+arabic            +ex_extra          +mouse             -tag_any_white
+autocmd           +extra_search      -mouseshape        -tcl
+autochdir         -farsi             +multi_byte        +termguicolors
+autoservername    +file_in_path      +multi_lang        +terminal
-balloon_eval      +find_in_path      -mzscheme          -termresponse
+balloon_eval_term +float             -netbeans_intg     +textobjects
-browse            +folding           +num64             +textprop
++builtin_terms    -footer            +packages          -tgetent
+byte_offset       +gettext/dyn       +path_extra        +timers
+channel           +guess_encode      +perl/dyn          +title
+cindent           -hangul_input      +persistent_undo   -toolbar
+clientserver      +iconv/dyn         -postscript        +user_commands
+clipboard         +insert_expand     +printer           +vartabs
+cmdline_compl     +job               +profile           +vertsplit
+cmdline_hist      +jumplist          +python/dyn        +virtualedit
+cmdline_info      +kaoriya           +python3/dyn       +visual
+comments          +keymap            +quickfix          +visualextra
+conceal           +lambda            +reltime           +viminfo
+cryptv            +langmap           +rightleft         +vreplace
+cscope            +libcall           +ruby/dyn          +vtp
+cursorbind        +linebreak         +scrollbind        +wildignore
+cursorshape       +lispindent        +signs             +wildmenu
+dialog_con        +listcmds          +smartindent       +windows
+diff              +localmap          +startuptime       +writebackup
+digraphs          +lua/dyn           +statusline        -xfontset
-dnd               +menu              -sun_workshop      -xim
-ebcdic            +migemo/dyn        +syntax            -xpm_w32
+emacs_tags        +mksession         +tag_binary        -xterm_save

解決策

python3環境を作る

対応するバージョンを入れる

sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
sudo yum install -y python35u python35u-libs python35u-devel python35u-pip

vimのpython3を有効にしてビルド

vimを持ってくる

git clone https://github.com/vim/vim.git
cd vim

makefileをつくる

ディレクトリとか他に必要なものがある場合はそれぞれ付け足してください
その場合開発パッケージも忘れずに

./configure \
--enable-fail-if-missing \
--enable-python3interp \
--with-python3-config-dir=/usr/lib64/python3.5/config-3.5m \
vi_cv_path_python3=/usr/bin/python3.5

sudo make install

※以下のような問題があるためおとなしくpython3のみ対応する方がいい気がします。
https://vim-jp.org/vimdoc-ja/if_pyth.html
Python 2 と Python 3 をサポートするにはそれらを動的ロードする必要があります。
Linux/Unix システムで動的ロード時にグローバルシンボルをインポートすると、2 番
目にロードした Python が使われたときにクラッシュが発生します。そのため、グロー
バルシンボルをロードして一つの Python バージョンだけを使うか、グローバルシンボ
ルをロードしないかのどちらかしかありません。後者は特定のライブラリ (シンボルが
Vim から提供されていることを期待しているライブラリ) において Python の
"import" が失敗するようになります。

おわり

先ほどのvim --version確認で + になっていれば問題なく使用できていると思います。

Neovim の Terminal で画像表示や動画再生

$
0
0

はじめに

libsixel の登場以来、ターミナルに画像を表示する Sixel Graphics はかなり簡単に扱えるようになりました。

直接表示するだけではなく、DRCS と呼ばれる機能の Sixel 拡張を備えた端末を用いる事により、その上で動作する Neovim が備えるターミナル上でも sixel での画像表示が可能です。
DRCS のSixel 拡張については @arakikenさんがこちらの記事で詳細に解説してくださっていますが、この記事上で少し触れられている、Neovim の DRCS-Sixel 対応を試してみようと思います。

Neovim の "floating windows" 機能を使えばバッファ上の任意の場所にサイズ指定したウィンドウが開けて、なおかつその上でターミナルが動作するので、DRCS-Sixel 化により好きな場所で画像を表示したり動画を再生したりする事が可能になります。

環境について

  • OS : Ubuntu 18.10
  • ターミナルエミュレータ : mlterm version 3.8.6

RLogin や mlterm 等、DRCS-Sixel を使えるターミナルエミュレータを使用してください。

libsixel のインストール

今は大抵ディストリビューションのパッケージに含まれているのでサクッとインストールしましょう。

~% sudo apt-get install libsixel-bin libsixel-dev

libvterm のインストール

neovim や vim の :terminal機能で使われるライブラリです。
「DRCSのSixel拡張について」で紹介されている libvterm はこちらのリポジトリから落としてきてビルド及びインストールが可能ですが、現状の Neovim では libvterm のバージョン0.1以上を要求する為、下記の手順でソースコードを入手・展開しましょう。

~% wget http://www.leonerd.org.uk/code/libvterm/libvterm-0.1.2.tar.gz
~% tar xvzf libvterm-0.1.2.tar.gz

DRCS-Sixel 対応の為の diff は下記です。
https://bitbucket.org/arakiken/libvterm/branch/sixel#diff
私は今回は手動で差分を適用してみました。ソース修正後ビルドしてインストールします。

~% make
~% sudo make install

Neovim のインストール

今の Neovim はビルドの過程で libvterm をダウンロードして来て自らに組み込む様な形でターミナルを実装する仕組みになっている様ですが、make の際に下記オプションを指定することでこのバンドル版ではなく、OS にインストール済みの libvterm を使用させる様にします。

~% sudo apt-get install ninja-build gettext libtool libtool-bin autoconf automake cmake g++ pkg-config unzip
~% git clone https://github.com/neovim/neovim.git
~% cd neovim
~% make DEPS_CMAKE_FLAGS='-DUSE_BUNDLED_LIBVTERM=OFF'
~% sudo make install

以上で DRCS-Sixel 対応された Neovim のインストールは完了です。

画像表示してみる

画像表示には libsixel に含まれる img2sixelというコマンドが使えます。gif アニメの再生もイケますが、中々綺麗に再生されなかったので、Sixel Graphicsを活用したアプリケーションの御紹介の記事中にある FFmpeg-sixelを使い、mpeg4の動画を使う事にしました。

floating windows を使用するにあたっては、下記の記事を参考にさせて頂きました。
【Neovim】半透明色のウィンドウが開けるようになりました

miku.mp4という動画を用意した上で、Neovim の設定ファイルに下記を追記します。

$HOME/.config/nvim/init.vim
command! Miku calls:miku()function!s:miku()" 空のバッファを作る:let buf = nvim_create_buf(v:false,v:true)" そのバッファを使って floating windows を開く:call nvim_open_win(buf,v:true,{'relative':'win','height':30,'width':40,'col':44,'row':14})" 透明にする:set winblend=100   " ターミナルを開いてコマンドを実行
    :terminal /usr/local/bin/ffmpeg2 -i~/Desktop/images/miku.mp4 -f sixel -loglevel quiet -pix_fmt rgb24 -s 240x400 -endfunction

この状態で Neovimを起動し、:mikuとコマンドを打つと

mikumiku.gif

この様に動画が再生されます(すいません、gif動画が非常にモッサリしてますが実際はこんな感じでもっとスムーズに再生されます)。
この仕組みを使えば、以前 Twitter で流行った「一定時間サボるとメンターが出て来て激励するエディタ」に近いものも実現出来ちゃいますよね笑

他にも色々面白い使い方があると思うので、是非試してみてください!

CUI環境とdotfilesを紹介する

$
0
0

dena新卒アドベントカレンダー11日目です。

開発環境

エンジニアが開発を行うにあたってOSやエディタ、IDEなど様々な環境が考えられます。今では多種多様なツールで触らずに済むような場合も多いですが、やはり効率を考えるとある程度弄る必要はあると思います。

CUI

所謂黒い画面ですね。CLIとも呼ばれてたりしますが、GUIとの対称性から自分はCUIと呼ぶことが多いです。黒い画面に緑色の文字、所謂macのターミナルにあるhomebrewプロファイルでハッカー気分に浸るのも悪くはないですが、見易いカラースキームやフォント、zshの導入などを行うとより洗練されたターミナルにカスタムできます。実際のところ色は重要でDXが上がること間違いなしです。良い開発は良い環境から。

ちなみに自分がCUI環境を整えようとしたきっかけは以下の記事達です。
お前らのターミナルはダサい
さいつよのターミナル環境を構築しよう
優れた dotfiles を設計して、最速で環境構築する話
そして彼らの記事やいろんな人のdotfilesを参考に色々弄って数年、だいぶ洗練されてきたはず...と言ってもdotfilesのコミット数はほぼvimの調整だったりする。

mac版

自分は標準でインストールされているターミナルを使用しています。有名なところでiTerm2がありますが、個人的には特に標準のものと比べてiTerm2にする理由はないと感じました。
現在自分のターミナルは↓のようになっています。
スクリーンショット 2019-12-05 17.44.54.png
色々と情報が出てますが、上部にtmuxのステータスバーを表示しています。
左側がウィンドウやセッションの番号
中央やや左寄りがセッションの一覧
右側には主にパソコンの状態を表示しています。
詳しくは後述します。

更に、自分は普段のコーディングをneovimで行なっているのですが、neovimを使って実際にコーディングしている画面は↓のような感じです。
ライバルはvs codeです。
スクリーンショット 2019-12-05 16.19.42.png
中央の領域がメインのエディタ部分
左の領域がファイラー(vimプラグインのnerdtree)
右の領域がctagsの一覧(vimプラグインのtagbar)で、ファイル内のクラスや関数、変数などの一覧が表示されています。ctagsにはuniversal-ctagsを使っていて、vimのプラグインで保存時にプロジェクトのルートディレクトリから再帰的に自動生成及び更新されるようにしています。
下の領域がtmuxの機能で開いた別のターミナルです。ここで編集したコードの実行結果を見たりします。
ちなみにvim(neovim)にもターミナルをエミュレートする機能があり、これをvimの分割機能で開くことで似たような構成にすることも可能ですが
結局のところtmuxの方が利便性が高いと感じました。好みにもよると思いますが...
加えて下の領域でコードを実行するのみであれば、quickrunと言うプラグインもあるのですが、これも個人的にはtmuxで良いかなと言う結果でした。
横の領域の移動がctrl-w+h or lで、縦の移動がctrl-q+j or kなのが少し気持ち悪いですが慣れました。

プロファイル

ターミナルのプロファイル(カラースキームとかの設定をまとめたもの)はcocopon氏のicebergを使用しています。
少し前まではsolarizedでしたが、気分転換にicebergにしてみたところ
そのまま気に入って継続利用しています。
寒色系の色が黒めの背景とマッチしていて見易く非常におすすめ。

フォント

フォントはコーディングの見易さを考慮してCicaを使用しています。こちらは元々rictyと言うフォントを使っていましたが
vimのファイラーでファイルの先頭にアイコンを表示したいと思い、そのためにアイコンが入った良い感じのフォントを探したところcicaを見つけました。rictyをベース?にしているようで|とlとIや0とOの見分けがつくようになっていたりとプログラマに優しい仕様になっています。
スクリーンショット 2019-12-05 19.29.40.png
また、各種ファイルのアイコンも入っているため、ファイラーやdeniteでのアイコン表示もバッチリです。
deniteの画面↓
スクリーンショット 2019-12-05 19.31.27.png
ほんの少し前までファイラーにアイコンは必要ないと思っていましたが、ファイルの量が多いとアイコンの方が可読性が高く便利でした。
denitehttps://github.com/Shougo/denite.nvimはvim上で使えるファイラーのようなもの?です。特定のファイル群(vimのバッファに含まれるファイルや最近開いたファイルなど)から曖昧検索してファイルを開くことができます。nerdtreeやvs codeのファイラーのようにファイル一覧が表示されているのも便利ですが、deniteはファイル名を入れれば目的のファイルを検索してすぐに開くことができ素早いです。特にファイルが多くなるようなプロジェクトでは重宝されると思います。

deniteを使っているところ

画面収録 2019-12-06 21.11.14.mov.gif
ちなみにneovimで最近追加された機能であるfloating windowを使用しています。従来のdeniteや類似機能ではインターフェースとしてコマンドラインが使用されていました。コマンドラインモードに移行するとどうしても視線が下になるのですが、floating windowのおかげで視線移動が少なくなりしかもかっこいいインターフェースが実現されました。

Linux版

出先や研究室、インターン先ではメインでmacbook proを使用していますが、自宅ではデスクトップでArch Linuxをメインで使用しています。
そのため使用感をあまり変えないように出来る限りmacとLinuxの環境を揃えるようにしています。とは言え大体のものがMac、Linux両方で使えるのでせいぜい設定ファイルを二つ分用意する程度で済みます。ただ、必要なソフトウェアなどを自動でインストールするようにするとmacとLinuxはもちろんのこと、Linuxでもディストリビューションごとに色々書く必要があって面倒です。一時期はhomebrew、linuxbrew(今はlinuxbrewもhomebrewに名前が変わった)で共通化していましたが、linuxbrewの利用を止めてからは手動でインストールしています。自動化したいけどめんどくさい...
Linux版でのターミナルは↓のような感じです。
Screenshot from 2019-12-05 15-37-27.png
大体Macと同じです。
ターミナルはgnome terminalを使用しています。ただ、Macで使っていたicebergはLinux版が存在しないので、色々試した結果Azuにしています。
ただ、Azuはインストール方法が独特で、Goghhttps://mayccoll.github.io/Gogh/を使う必要があります。これは様々なカラースキームをまとめてインストールできるもので、前述のAzuはこちらに含まれています。

dotfiles

ホームディレクトリとかの.からはじまるフォルダとかファイル(主に設定用)をgithubで管理していろんな環境で共通化しようという試み

レポジトリはこちら
いかにも自動でセットアップしてくれそうなコマンドがReadmeにあるけどメンテしてません、というかやっぱりめんどくさい

このdotfilesには先人の知恵、いわばパクリがたくさん入っています。
githubには他にもたくさんのdotfilesがあるので、他人のdotfilesを見て良さげな設定などあれば自分の環境に持ってくるのも良いでしょう。
その際、その設定は何のためにあるのか、そのコマンドで何が起こるかなどを調べながらやると理解が深まると思います。
ファイル構成
githubの画面を拝借(ちなみにgithubをダークモード化するchrome拡張機能github darkを入れてます。おすすめ)
スクリーンショット 2019-12-05 17.08.36.png
(ちょっとでも不満があったり、ここをこうしたいなとかがあればすぐに弄ってコミット、それが気に入らなければまた弄ってコミットとしていると無駄にコミット数が膨れ上がります。ある意味達成感はある。とはいえ数あるレポジトリの中でdotfilesのコミット数が浮いている間は否めない🤔)

ファイルの置き方には各々様々なやり方があると思いますが、自分は大体以下のようなルールで運用しています。

名前がドットから始まるファイルとフォルダ→dotfiles直下
ただしtmuxだけはmac用とlinux用でファイル分割していて、プラグイン用のフォルダもあるので一つのフォルダにまとめています。

インストールやセットアップ用のスクリプト→etc
現在ノーメンテでほぼ使ってない。めんどい...

tmuxでの情報表示に使用するスクリプト→bin
コマンドとして使用するために/usr/local/binに手動で設置している。
自動化するかdotfiles/bin以下のスクリプトのパス指定しても良いかもしれない。

設定ファイルのうちmacとlinuxで分ける必要がある、かつ名前がドットで始まらないもの→options
としています。

次に各種ソフトウェア、ツールと設定を紹介します。

zsh

macOS catalinaで標準になったzshですが、自分は別途homebrewでインストールしています。バージョンアップできなくても気にしないのであればデフォルトのままでも良いかもしれません。
zshの設定ファイルは.zshrcを使用していますが、ファイルの肥大化に伴いalias関連のは別途.zsh_aliasに記述しています。他にも環境変数やmac向けlinux向けの設定ファイルを分割するのもありかも知れませんが、今のところそこまで記述量がないので2ファイルのみです。
.zshrcは長いので抜粋して紹介すると

# 色を使用
autoload -Uz colors
colors
zstyle ':completion:*' list-colors "${LS_COLORS}"

補完の際、ファイルかフォルダかで色が変わります。

# tab補完
autoload -Uz compinit && compinit -i
compinit
タブ補完用の設定です。ファイル名とかフォルダ名を良い感じに補完してくれます。
特にフォルダ構造がよく分からなかったり、深いフォルダの探索の際には重宝します。
CURRENT_DIR="%{${fg[blue]}%}[%~]%{${reset_color}%}"

autoload -Uz vcs_info
setopt PROMPT_SUBST
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "%F{yellow}!"
zstyle ':vcs_info:git:*' unstagedstr "%F{red}+"
zstyle ':vcs_info:*' formats "%F{green}%c%u[%b]%f"
zstyle ':vcs_info:*' actionformats '[%b|%a]'function _update_vcs_info_msg(){LANG=en_US.UTF-8 vcs_info
    VCS_INFO=" ${vcs_info_msg_0_}"RPROMPT=$CURRENT_DIR$VCS_INFO}

add-zsh-hook precmd _update_vcs_info_msg

gitのブランチを表示してくれます。作業ブランチを間違うと後々面倒になるため、常に確認できるのが良い点です。

tmux

ターミナルマルチプレクサと呼ばれるソフトウェアです。こちらを使用すると同じターミナル画面でタブや、画面分割で複数のシェルを立ち上げることができます。プレフィックスと何かしらのキーで、画面の移動や分割した画面の大きさ変更などができます。また、ステータスバーにechoで任意の情報が表示できます。

macのステータスバー↓
スクリーンショット 2019-12-05 22.13.18.png
ステータスバー右側には順番にメモリ使用量、CPUの平均使用率、CPU温度、使用しているWi-Fiの接続先と強度、バッテリー残量、音声出力先、ボリューム、現在の時刻を表示しています。

linuxのステータスバー↓
Screenshot from 2019-12-05 15-37-27.png
こちらも基本的には一緒ですが、順番にメモリ使用量、CPUの平均使用率、CPU温度、GPU1の温度、GPU2の温度、現在の時刻になっています。

これらは単にbinに入っているシェルスクリプトで別のプログラムを実行した結果をechoしているだけです。
使用しているプログラムは以下の通りです。

共通

tmux-mem-cpu-load
メモリとCPUをどれくらい使用しているかを表示してくれます。
自分でビルドしても良いですが、tmux用のプラグインマネージャーであるtpmでインストールするのが楽です。

mac

osx-cpu-temp
macのcpu温度を表示する。
homebrewでインストール

switchaudio-osx
サウンドの出力先とボリュームを取得
homebrewでインストール

linux

nvidia-settings
gpu温度を表示するために使用、gpuのドライバを入れれば自動でついてきます。
Wi-Fi状況は変な接続先に接続していないかが分かりますし、サウンドもAirpodsの接続が切れてて本体のスピーカーから音が出ると言う事故が防げる...かも知れません。
いずれにせよターミナル上で様々なパソコンの状態が分かるのは便利です。そして何となくかっこいい。

zplug

zsh用のプラグインマネージャーです。新しくzpluginと言うのもあり、zplugより起動が早いらしく気にはなっていますがまだ移行できていません。
プラグインのせいか起動に多少もたつきはありますが、まだ許容範囲内です。こちらはまとめて.zplugrcと言うファイルでプラグインを管理し、.zshrcから呼び出しています。

zplug 'mollifier/anyframe', lazy:yes
zplug 'mollifier/cd-gitroot', lazy:yes
zplug 'stedolan/jq', from:gh-r, as:command, rename-to:jq, lazy:yes
zplug 'b4b4r07/emoji-cli', on:'stedolan/jq', lazy:yes
zplug 'b4b4r07/enhancd', use:init.sh
zplug 'zsh-users/zsh-completions'
zplug 'mrowa44/emojify', as:command, lazy:yes
zplug 'junegunn/fzf-bin', as:command, from:gh-r, rename-to:fzf
zplug 'junegunn/fzf', as:command, use:bin/fzf-tmux
zplug 'zsh-users/zsh-history-substring-search'
zplug 'zsh-users/zsh-syntax-highlighting', defer:2
zplug 'zsh-users/zsh-autosuggestions'
zplug 'b4b4r07/git-conflict', lazy:yes
zplug 'b4b4r07/zsh-gomi', if:'which fzf'
zplug 'b4b4r07/zplug-doctor', lazy:yes
zplug 'b4b4r07/zplug-cd', lazy:yes
zplug 'b4b4r07/zplug-rm', lazy:yes
zplug 'mafredri/zsh-async'
zplug 'zplug/zplug', hook-build: 'zplug --self-manage'# Install plugins if there are plugins that have not been installedif! zplug check --verbose;then
    printf'Install? [y/N]: 'if read-q;then
        echo; zplug install
    fi
fi# Then, source plugins and add commands to $PATH# zplug load --verbose
zplug load

色々とオプションがサポートされてはいますが、とりあえず他人のを参考に雰囲気で使っています。
曖昧検索を行うfzf、それを元に良い感じにディレクトリ移動をしてくれるenhancd
zshの補完を強化してくれるzsh-completions
コマンドに色をつけてくれるzsh-syntax-highlighting
入力した文字列に一致する過去の入力履歴を表示してくれるzsh-autosuggestionsあたりは特におすすめです。

こんな感じ
画面収録 2019-12-06 21.26.10.mov.gif
早くて見辛いけど、ホームディレクトリから曖昧検索で目的のフォルダに入って(enhancd)、適当にディレクトリ移動後npm run startしてます。
途中実行するコマンドの色が変わっていたり、前に実行したコマンドの履歴が見えます。

vim

何年か前のneovimの非同期サポートを境にそちらに完全に移行しました。neovimの設定ファイルは.config/nvim/nvim.initにあり、vimと共通化するため.vimrcではinit.vimを読み込むだけ...にするつもりでしたがneovimの設定をそのまま書いてあるせいでエラーが毎回出るのでそのまま放置しています。
エイリアスでvimと打つとneovimが起動するので最早vimの存在は忘れました。
vimの設定ファイル群はまとめて同じディレクトリに置いています。
ファイル構成は↓のような感じです。
スクリーンショット 2019-12-05 23.10.43.png
こちらは設定が膨大なため役割ごとにできるだけファイルを分けています。
init.vimではsetから始まる各種設定と、他のvimファイルの読み込みを行っています。
また、vimのプラグインマネージャーにはdeinを使用しており、各種tomlファイルはプラグイン用のファイル、autoload以下にはそれらプラグインの設定ファイルが入っています。プラグインについては別途vim2アドベントカレンダーで記事にする予定です。

autocmds.vim
各種autocmd(特定のファイルを開いた時に実行されるコマンド群)の設定

color.vim
ハイライトの設定

dein.vim
プラグインの読み込み

keymappings.vim
キーマッピングの設定

linux.vim, mac.vim
それぞれlinux, mac用の設定

types.vim
ファイルタイプごとの設定
前述した通り、vimの設定は多岐に渡ります。ジャンルごとに設定ファイルをまとめておくのをおすすめします。後から切り分けるのは面倒なので...(体験談)

.config

基本的にconfigファイル直下はgitignoreしていますが、前述のneovim用のフォルダと特定のlanguage serverのための設定ファイルのみはgit管理しています。比較的重いファイル(deinでインストールしたvimプラグインなど)も入る可能性があるので、.configに関してはホワイトリスト形式で管理するのをおすすめします。

その他

.imwheelrcと.Xmodmapはそれぞれlinuxでimwheel, xmodmapを使うための設定ファイルです。
それぞれマウスのスクロール速度とキーボードのキーマッピングを変更するソフトウェアです。
他にも各環境で共通化したい設定ファイルなどあればdotfilesで管理すると捗ります。

まとめ

ターミナル環境での作業も設定を色々としておくことで効率が段違いに上がります。と言うか作業が楽しくてあらゆる作業をターミナルで済ませるようになります。皆さんもこれを機にターミナル環境を弄ってみてはいかがでしょうか。沼にハマりましょう。

tmux上のVimで、Vimのバッファをスクロールする

$
0
0

すごく簡単ですが情報が少なかったので記載

vimrcに以下を記載でOK

.vimrc
set mouse=a

dotfilesの育て方

$
0
0

dotfilesを育てよう!

dotfilesはエンジニア人生と切っても切れない関係です。
そんなdotfilesを理想の形に育てていく方法について紹介したいと思います。


dotfilesとは
.(ドット)から始まるファイルの総称です。
Unix系OSでは.から始まるファイルは隠しファイルとして扱われ、lsコマンド等にはオプションを指定しないと表示されない仕組みになっています1
古来より、この特徴を利用して、ホームディレクトリ直下に.から始まる設定ファイルを配置するという文化があります。
例えば、筆者のホームディレクトリでlsを実行した場合、下記のような出力となります。dotfiles01.png
隠しファイルも表示する-aオプションを加えて実行した結果は下記のようになります。
dotfiles02.png
.で始まるファイルが大量に表示されています。
要はこれらがdotfilesです。

Lv.1 Gitで管理しよう

まずは最初の一歩として、dotfilesをGit管理するところから始めましょう。
履歴管理やポータビリティの向上等様々な恩恵があります。(草を生やせたりも)

dotfilesというリポジトリを作成し、.bashrc等の各種dotfilesをリポジトリ配下にコミットします。
ホームディレクトリにはlnコマンドを用いてシンボリックリンクで配置します。
シンボリックリンクを作成することで、リポジトリ内のファイルで一元管理できるため、更新や最新化が簡単にできるようになります。

.bashrcのシンボリックリンク作成の例
#リンクの作成
$cd path/to/dotfiles
$ln-s .bashrc ~/.bashrc
#リンクを確認
$ls-l ~/.bashrc
lrwxrwxrwx 1 reireias reireias 59  6月  8 22:30 /home/reireias/.bashrc -> /home/reireias/dev/src/github.com/reireias/dotfiles/.bashrc

なお、GitHubでは実に多くのdotfilesリポジトリが公開されています。
https://github.com/topics/dotfiles

ちなみに、AWS_ACCESS_KEY_ID等の認証情報が公開されてしまわないように注意しましょう

Lv.2 deployを簡単にしよう

シンボリックリンクの作成は、その環境に対して1度しか実施しませんが、対象となるdotfileが増えれば、その作業も効率化したくなるのがエンジニアの性というものです。

簡単なshell scriptで実装することができます。
shell script以外で実装してもよいのですが、クリーンな環境にインストールする際に依存するパッケージが少ないほど楽なので、大抵の環境で利用できるshell scriptがよく採用されています。

以下のスクリプトでは、dotfilesリポジトリ直下の.ではじまるファイル全てのシンボリックリンクをホームディレクトリに作成します。

install.sh
#!/bin/bash -eIGNORE_PATTERN="^\.(git|travis)"echo"Create dotfile links."for dotfile in .??*;do[[$dotfile=~ $IGNORE_PATTERN]]&&continue
    ln-snfv"$(pwd)/$dotfile""$HOME/$dotfile"done
echo"Success"

Lv.3 インストールスクリプトを書こう

dotfileによっては、パッケージやライブラリのインストールが必要となるものもあるでしょう。

例えば、

  • .tmux.confがあるので、tmuxをインストールしたい
  • pecoコマンドを利用する自作関数が.bashrcに定義してある
  • vimの特定のプラグインがpythonのライブラリに依存している

等があげられます。

はじめのうちはREADMEに依存パッケージの一覧を記載したりしているでしょう。
やっぱり自動化するのがエンジニアですね。

例えばshell scriptであれば下記のようにシンプルにコマンドを列挙していくだけでも、立派なインストールスクリプトになります。

インストールスクリプトの一例
#!/bin/bash

brew install tmux peco neovim
pip install neovim

Lv.4 インストールスクリプトの冪等性を意識しよう

冪等性を意識したインストールスクリプトにしてみましょう。
何度実行しても同じ結果になるようにすることで、新たにインストールスクリプトで行う処理を追加した場合でも既存の環境に対してインストールスクリプトを実行することが可能です。

簡単な例を下記に示します。

# 冪等性なしmv config /etc/hoge/config
echo"some setting">> ~/.hogerc

# 冪等性ありcp config /etc/hoge/config
if!grep-q"^some setting$" ~/.hogerc;then
  echo"some setting">> ~/.hogerc
fi

インストールスクリプトが大きくなるほど、冪等性をshell scriptで担保するのは難しくなってくるので、AnsibleChef等の構成管理ツールを使ってインストールスクリプトを記述するのも良い選択と言えるでしょう。

Lv.5 CIをまわそう

猫も杓子もCIな世の中です。
dotfilesにおいてもCIを回しましょう。

インストールするパッケージやライブラリのバージョンを指定せず、最新版をインストールするようなスクリプトの場合、非互換な更新によりインストールスクリプトが失敗するようになることもあるでしょう。
インストールスクリプトの実行や適切にファイルが配置されたか等を確認するのがよいでしょう。

GitHub Actionsでのごくごくシンプルなサンプルコードを記載しておきます。

.github/workflows/main.yml
---name:mainon:[push]jobs:main:runs-on:ubuntu-latest# or macOS-lateststeps:-uses:actions/checkout@v1-name:install dotfilesrun:bash install.sh-name:testrun:# some tests

Lv.6 ファイルを分割しよう

dotfilesが順調に成長していくと、.bashrc(.zshrc)や.vimrcなんかはかなり巨大になっていきます。
巨大な1ファイルは条件反射で悪とみなすのがエンジニアの常なので、なんとか分割したいものです。

幸い、.bashrc.vimrc等は別ファイルを読み込む機能を搭載しているので、分割が容易です。

例えば以下のように.bashrcから別ファイルを読み込むことができます。

.bashrc
source${HOME}/.bash/keybind.sh
source${HOME}/.bash/alias.sh

Lv.7 READMEを整備しよう

dotfilesは人に見られることでも成長します(?)
READMEを整備し、イケてるdotfilesリポジトリに仕立てましょう。

個人的には以下が記載されていると、パクリたく参考にしたくなります。

  • 対象のエディタ、shell、ツール
  • ターミナルのスクリーンショット
  • コンセプト
  • 依存するパッケージやライブラリ

番外編 様々な環境に対応しよう

LinuxとMac OSの両方を利用することのある変態珍しい人は、両方の環境に対応した設定やインストールスクリプトを用意すると幸せになれるのではないでしょうか?
CIもマトリックスビルド等を活用し、LinuxとMac OSの両方の環境で実行するとよいでしょう。

ちなみに、筆者は最近、AnsibleでLinuxのaptとMac OSのbrewをwhenによる分岐を利用せずに書く方法がなくて困っています。

さいごに

じゃあ、お前のdotfilesはどうなんだよ?と言われそうなので、いちおう掲載しておきます。
そんなに期待しないでくださいね。

Viewing all 5720 articles
Browse latest View live


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