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

Windowsのgvimでクリップボードにコピー&ペースト

$
0
0

Windowsのgvimでクリップボードにコピー&ペースト

1.Vim風ショートカットキー入力によるクリップボードの操作

・ショートカットキー

機能キー説明
コピーCtrl-Insertビジュアルモードで選択したテキストをクリップボードにコピー。
カットCtrl-Delete
または
Shift-Delete
ビジュアルモードで選択したテキストをカットし、クリップボードにコピー。
ペーストShift-Insertクリップボードのテキストをペースト。

※ VIMのデフォルトの設定を利用して、Windows-VIM間のコピペが可能
※ VIMのコピーコマンド(yy)やペースト(p)などでは、Windows-VIM間のコピペ不可

2.ウィンドウズ風ショートカットキー入力によるクリップボードの操作

「_vimrc」ファイルに下記記述を追加することで、Windowsのショートカットキー入力による
コピー&ペーストが利用可能になります。

・追加内容

source $VIMRUNTIME/mswin.vim

・ショートカットキー

機能キー説明
コピーCtrl-cビジュアルモードで選択したテキストをクリップボードにコピー。
カットCtrl-xビジュアルモードで選択したテキストをカットし、クリップボードにコピー。
ペーストCtrl-vクリップボードのテキストをペースト。

※ 短形で選択 (ctrl+v)や直前の処理の取消を取消(ctrl+r)などのctrlを利用するVIMコマンドが利用不可

3.ヤンク,カット操作によるクリップボードの操作

「_vimrc」ファイルに下記記述を追加することで、VIMのヤンク&ペーストコマンドが
クリップボードを利用するようになるため、別アプリケーションと連携可能になります。

・追加内容

set clipboard=unnamed,autoselect

・ショートカットキー

機能キー説明
コピーyyカーソルのある行をクリップボードにコピー。
カットddカーソルのある行をカットし、クリップボードにコピー。
ペーストpクリップボードのテキストをペースト。

Vimで自動保存したい!!!

$
0
0

Vimでいちいち:wするのがめんどくさく、Webではよく、あれ、保存したっけ??となってしまうので自動保存したいなぁと思いました。

https://github.com/vim-scripts/vim-auto-saveを導入すると、自動保存できます。

 インストール

NeoBundleの場合

.vimrc
NeoBundle 'vim-scripts/vim-auto-save'

:NeoBundleInstall

設定

.vimrc
letg:auto_save=1letg:auto_save_in_insert_mode=0

let g:auto_save = 1はデフォルトで有効にする。
let g:auto_save_in_insert_mode = 0は、インサートモードの自動保存を無効にする。有効にすると、スペースするたびにカーソルが一番左になってうまくできませんでした。

PHPで開発が捗るリアルタイムエラーチェック

$
0
0

Pythonでも型チェックが捗ると噂をきいたのでPHPの環境構築について書きます。ちょっと眠いので簡潔に… もしわからないことがあったら回答するのでコメントで聞いて1

得られる利益

関数名を間違ってることに気付いたり
スクリーンショット 2018-07-31 01.53.12.png

変な型どうしで計算してることに気付いたり
スクリーンショット 2018-07-31 01.54.54.png

うっかり変な値をreturnしようとしたり
スクリーンショット 2018-07-31 02.01.59.png

そんな問題に編集中に気付けるよ。

画面はVimだけど、ほかのエディタでもいいよ。

事前準備

  1. PHP 7.1+
    • macOSなら brew install phpとかでもいいです (システムに最初から入ってる/usr/bin/pythonは不可)
  2. Composer
  3. COMPOSER_HOMEPATHを通す
    • PATH=$HOME/.composer/vendor/bin:$PATHみたいな行をシェルの設定ファイル(~/.bashrcとか)に書く

PHPStanのインストール

composer global require phpstan/phpstan-shim
  • 既にPsySHなどのPHP-Parserを使ったパッケージがインストール済でnikic/php-parser:3.1.5などが残存してる場合はインストールに失敗しやすいので注意
  • composer global remove psy/psysh nikic/php-parserなどで一旦外すとスムーズ
    • そのあとで composer global require psy/psyshのように入れ直す

プロジェクトの設定

Composerがベースのプロジェクトの場合は、こういうファイルを用意します。

phpstan.neon.dist
parameters:level:3bootstrap:%rootDir%/vendor/autoload.php

詳しくは@HirakuさんのPHPStanで始めるPHPのための静的解析とかを読んでください。

エディタの設定

Vim

ALEで一発です。

Emacs

flycheck-phpstanパッケージを入れてinit.elとかに設定を書いてください。

init.el
(defunmy-php-mode-hook()"My PHP-mode hook."(require'flycheck-phpstan)(flycheck-modet)(flycheck-select-checker'phpstan))(add-hook'php-mode-hook'my-php-mode-hook)

Visual Studio Code

私は使ったことはないですがvscode-phpstanってやつがあるらしいです。 (未検証)

まとめ

PHPStanの力があれば、ハイエンドなエディタなら割と簡単にIDE(なんとかストーム)に近い領域までいけるぞ。

この記事は手抜きですが、この記事を書いた人間の睡眠不足に報いるつもりのある型は https://www.pixiv.net/fanbox/creator/105589を購読するEmacsやPHPの記事を書くモチベーションになります。

脚注


  1. こう書いて実際に質問を受けた経験はあまりないのですが、わからないことやトラブルがあったら記事のコメントでもTwitterのDMでもSlackでもいいので質問してね 

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

$
0
0

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

  • 8.1.0229: プロファイリングデータ(:h profile)をダンプするときにクラッシュすることがあった件を修正しました。
  • 8.1.0228: Vimがビジー状態の時にファイルをドロップすると無視される件を修正しました。
  • 8.1.0226: +vreplace機能(gRおよびgr{char})をTinyフィーチャーでも使用できるようにしました。(#ifdef FEAT_VREPLACE の削除)
  • 8.1.0225: :four_leaf_clover:mode()がインサートモードからCTRL-Oを使用した場合の状態を取得できるようにしました。("niI", "niR" と "niV" を追加)
  • runtimeファイル更新:
  • 8.1.0224: bracketed paste modeでt_PEが検出されなかった場合にハングする件を修正しました。
  • 8.1.0223: shellコマンドの補完(:!<TAB>, getcompletion('', 'shellcmd'))をおこなうと、$PATH内のサブディレクトリが候補に現れる件を修正しました。
  • 8.1.0220: :four_leaf_clover: if_ruby: v:true, v:falseを数値ではなく、true, falseに変換するようにしました。
  • 8.1.0218: :four_leaf_clover:matchadd()matchaddpos()の第5引数dictのアイテムにwindowを追加しました。指定したwindow IDに作用するようになります。
  • 8.1.0215: configureで--with-xを指定してもX(ウィンドウシステム)が使用できない場合にエラーにならなかったのを修正しました。
  • 8.1.0214: +autochdir機能がhas():versionで報告されない件を修正しました。
  • 8.1.0213: :four_leaf_clover: quickfixウィンドウでCTRL-W CRした場合、必要であればウィンドウを分割してジャンプするようにしました。
  • 8.1.0212: 各種言語インターフェイス内でw_set_curswantフラグがセットされていなかったのを修正しました。
  • 8.1.0211: ファイル名~expand()$HOMEの値になってしまう件を修正しました。
  • 8.1.0209: if_ruby: 標準エラー出力が表示を乱す件を修正しました。
  • 8.1.0203: if_perl: WindowsでPerl 5.28とビルドするとエラーになる件を修正しました。
  • 8.1.0202: :versionが常に+packagesを表示している件を修正しました。
  • 8.1.0201: :four_leaf_clover: if_python: Python 3.7からimpモジュールを使用すると、DeprecationWarningが (__main__で) デフォルト有効になったため、if_python3 の初期化処理内で imp モジュールをインポートする際に警告が出るので、importlibに置き換えました。
  • runtimeファイル更新: 各種helpファイルの更新。todoの更新。
  • 8.1.0198: :four_leaf_clover:シンタックスハイライトの処理時間が'redrawtime'を超過してキャンセルされた場合にメッセージを出力するようにしました。
  • 8.1.0196: terminal-debugger: .gdbinit にフォーカス系のコマンドが書かれているとエラーが発生する件を修正しました。
  • 8.1.0193: terminal-debugger: ボタンが機能しない場合がある件を修正しました。(関連patch: 8.1.0195)
  • 8.1.0192: regexpを再帰的に実行するとクラッシュする件を修正しました。
  • 8.1.0190: if_perl: 参照カウントの実装が良くなかったのでリファクタリングしてtestを追加しました。(関連patch: 8.1.0191)
  • runtimeファイル更新: 各種helpファイルの更新。todoの更新。
  • 8.1.0184: :four_leaf_clover:getwininfo()が返す辞書のアイテムにwincolwinrowを追加しました。ウィンドウレイアウトの把握が容易になります。(関連patch: 8.1.0187)
  • 8.1.0183: if_lua: Lua 5.3でAPI lua_rawgeti()のI/F変更により環境によっては正しく動作しなくなっていたのを修正しました。
  • 8.1.0182: Unicode標準の更新を反映しました。
  • 8.1.0177: sandbox内では:functionが使用できないが、lambdaでは定義できてしまう件を修正しました。(sandbox内で:functionで定義した関数を使用できるようにしました) (関連patch: 8.1.0189)
  • 8.1.0174: 最終行がfoldされている場合のページスクロール(CTRL-F, CTRL-B等)で最終行の表示がおかしくなる件を修正しました。
  • 8.1.0172: 'viminfofile'オプションの値をファイル名として扱っていなかったのを修正しました。(Windowsのパス区切り \\\と指定しなくてよくなりました)
  • 8.1.0171: terminalウィンドウでCTRL-W nを入力すると、ml_getエラーが発生することがある件を修正しました。(terminal_loop()の外側でリサイズした時に発生していました)
  • 8.1.0168: :marksの出力がマルチバイト文字の場合に短過ぎる件を修正しました。(関連patch: 8.1.0175)
  • 8.1.0167: 辞書アイテムのロックフラグのリセット処理が多くの場所でおこなわれていたのを整理しました。
  • 8.1.0166: C関数dict_add_nr_str()が不細工な件を修正しました。dict_add_number()とdict_add_string()に分離しました。
  • 8.1.0165: :four_leaf_clover::clistおよび:llist:filterでフィルタリング出来るようにしました。例: :filter /pat/ clist。モジュール名、ファイル名、パターン名、テキスト名を対象に絞り込めます。
  • runtimeファイル更新: doc/evim.manの追加、各種デンマーク語翻訳ファイルの追加、その他。
  • 8.1.0164: if_lua: 無名バッファでluaeval('vim.buffer().name')がエラーを返す件を修正しました。空文字列を返すようにしました。
  • 8.1.0161: 'autoread'が設定されているバッファのファイルが削除された場合にバッファが更新されない件を修正しました。
  • 8.1.0160: デンマーク語のマニュアル翻訳を追加しました。(関連patch: 8.1.0162)
  • 8.1.0159: 入力文字列がユーザ名と完全一致する場合、ユーザ名補完がおこなわれない件を修正しました。
  • 8.1.0158: GUI: gs:sleep中にCTRL-C押下した後のinput()が失敗する件を修正しました。
  • 8.1.0157: 古いiTerm2で起動時に1行目にゴミが表示される件を修正しました。
  • 8.1.0155: runtime/docディレクトリに evim.manが収録されていなかったのを修正しました。
  • 8.1.0154: set smarttab shiftwidth=0 softtabstop=-1でクラッシュする件を修正しました。
  • 8.1.0152: Windows: 個別のテストを簡単に実行することができない件を改善しました。
  • 8.1.0149: 複数のタブのどれかで :lcdが使用されている場合に生成されたセッションファイルが、タブを正しく復元できない件を修正しました。
  • 8.1.0147: if_python3: Python 3.7 でビルドした場合にコンパイルwarningが出る件を修正しました。
  • 8.1.0143: matchitプラグインとmatchparenプラグインでエラーE363をハンドルしていない件を修正しました。
  • 8.1.0142: :four_leaf_clover:xtermとvt320のbuiltin termcapにkeypadの数字キーのキーコードを追加しました。
  • 8.1.0141: :cexprが最初のエラーにジャンプしない件を修正しました。
  • runtimeファイル更新: helpファイルおよび言語ファイルの修正等。
  • 8.1.0140: GUI: レジスタへの記録時および起動時の -w-W指定時に不要なフォーカスイベントが記録される件を修正しました。
  • 8.1.0138: 'softtabstop'の負の値が正しく使用されていない件を修正しました。(関連patch: 8.1.0105)
  • 8.1.0135: インサートモード中のCTRL-O uがメッセージ出力により画面更新が遅れる件を修正しました。
  • 8.1.0134: if_lua: funcrefに対応していなかった件を修正しました。

凡例

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

方針

こちらを参照。

dein.vimでtomlファイルを使ってプラグイン管理

$
0
0

この記事を読むにあたって

この記事はVim初心者の私がneovimでプラグイン管理をするにあたって、行き詰まったところを書いていきます。
思わず「違う、そうじゃない」と言いたくなるような箇所があると思いますがご容赦ください。

dein.vimとは?

Shougo/dein.vim
とあるすごい方が作ったvim/neovimで使えるプラグイン管理プラグイン(?)です。

導入方法

以下のコマンドを打ち込めばオッケーです。

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

installer.shを実行するとこのような文章が出力されると思います。

"dein Scripts-----------------------------if&compatible
  set nocompatible               " Be iMproved
endif" Required:set runtimepath+=/Users/XXXX/.cache/dein/repos/github.com/Shougo/dein.vim" Required:if dein#load_state('/Users/XXXX/.cache/dein')call dein#begin('/Users/XXXX/.cache/dein')" Let dein manage dein" Required:call dein#add('/Users/XXXX/.cache/dein/repos/github.com/Shougo/dein.vim')" Add or remove your plugins here:call dein#add('Shougo/neosnippet.vim')call dein#add('Shougo/neosnippet-snippets')" You can specify revision/branch/tag.call dein#add('Shougo/deol.nvim',{'rev':'01203d4c9'})" 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-------------------------

XXXXになっているところは自分のユーザー名になっていると思います。
そうしたら、この文章を~/.config/nvim/init.vimに貼りつけます。(ない場合は作ってください)
あとはneovimを再起動すればdein.vimの導入は成功です。(init.vimに書き込んだ文は消しておいてください)

tomlファイルで管理する

tomlファイルとは?

dein.vimは他のプラグイン管理とは違い、init.vimに書き込まなくても、tomlファイルというものをサポートしているので、init.vimが肥大化するのを抑えることができます。

準備

普段使っているシェルの設定ファイル(bashだったら.bash_profile、zshだったら.zshrc)に以下の文を追加してください。

export XDG_CONFIG_HOME="/Users/nishizawa/.config"export XDG_CACHE_HOME="/Users/nishizawa/.cache"

init.vimに書き込み

init.vimに以下の文を打ち込みます。

lets:dein_cache_dir=$XDG_CACHE_HOME .'/dein'lets:dein_config_dir= $XDG_CONFIG_HOME .'/nvim'if dein#load_state(s:dein_cache_dir)call dein#begin(s:dein_cache_dir)call dein#load_toml(s:dein_config_dir.'/dein.toml',{'lazy':0})call dein#load_toml(s:dein_config_dir.'/dein_lazy.toml',{'lazy':1})call dein#end()call dein#save_state()endif

~/.config/nvim/に新しくファイルを追加します。

touch .config/nvim/dein.toml
touch .config/nvim/dein_lazy.toml

.config/nvim/dein.tomlに以下の文を追加します。

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

これで完成です。

最後に

いかがでしたでしょうか?
できなかったー!っていう方はコメントをお寄せください。
tomlファイルの書き方については後日記事を書く予定なので、ぜひ見てください。

Macへのspacemacsインストールメモ

$
0
0

普段エディタとして Emacsを使用していますが、vimとのいいとこ取りをした(?) 「spacemacs」 なるものがあることを(今さら)知ったので、インストールして使うことにしました。

公式のインストール手順も丁寧に書かれているし、特につまずくところもないのですが、メモとして残しておきます。

spacemacs2.png

インストール

事前に

インストール済みEmacsのアンインストール

ベースとするEmacsとして、公式のインストール手順にも記載されている emacs-plusを使うので、
すでにEmacsがインストールされている場合はアンインストールしておきます。

.emacsの退避

既存のEmacs設定 ~/.emacs.dおよび ~/.emacsをリネームするなどして退避しておきます。

$ cd ~
$ mv .emacs.d .emacs.d.bak
$ mv .emacs .emacs.bak

emacs-plusのインストール

改めて emacs-plusをインストールします。

$ brew tap d12frosted/emacs-plus
$ brew install emacs-plus --with-spacemacs-icon$ ln-s /usr/local/opt/emacs-plus/Emacs.app /Applications

spacemacsのインストール

spacemacsをインストールします。
インストールというより、 spacemacs用に構成された設定ファイル群 .emacs.dをGutHubからクローンして配置するだけですね。

推奨フォントのインストール

公式のインストール手順では任意になっていますが、見やすいフォントなのでインストールしておきます。

$ brew tap caskroom/fonts && brew cask install font-source-code-pro

spacemacsのクローン

GitHub から、spacemacsをクローンして ~/.emacs.dとして配置します。

$ cd ~
$ git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d

Emacsの起動

Emacsを起動します。

$ emacs

spacemacsのインターフェースで起動すれば、インストールは成功です。

first_run.png

基本設定

初回起動時に、いくつかの基本設定をどうするか聞いてきます。

キーバインド

What is your preferred editing style?
  Among the stars aboard the Evil flagship (vim)
  On the planet Emacs in the Holy control tower (emacs)

キーバインドをvim風にするか、emacsのままにするかを選択します。
spacemacsの名の通り、vim風にすることで(escではなく) spaceによるモード切り替えができるようになるのが最大のメリットです。

自分はあくまでEmacsキーバインドを使いたかったので、emacsを選択しました。

ちなみに、ここでは選択肢として出てこないですが、hybridと言うキーバインドもあります。(spacemacsの設定ファイル ~/.spacemacsで変更できます)
ただ、vimのキーバインドが優先のようで、Emacsキーバインド派には使いにくいなーと思います。

spacemacsの構成

What distribution of spacemacs would you like to start with?
  The standard distribution, recommended (spacemacs)
  A minimalist distribution that you can build on (spacemacs-base)

spacemacsを標準構成にするか、最小構成にするかを選択します。

推奨の spacemacsを選択しました。

補完フレームワークの選択

What type of completion framework do you want?
  A heavy one but full-featured (helm)
  A lighter one but still very powerful (ivy)
  None (not remomended)

編集時の補完に何を使うかを選択します。
この辺、詳しくないですが 君は誰とEmacsる? (補完インターフェイス紹介篇)を参考に、軽量そうな ivyにしました。

カスタマイズ

あとはお好みでカスタマイズしていきます。
spacemacsでは、設定は通常の ~/.emacs.d/init.elではなく ~/.spacemacsに記述していきます。

ターミナル内で起動する

ターミナル上で emacsコマンドで起動すると、ターミナル上ではなく別ウィンドウでアプリとして起動してしまいます。
-nwオプションを指定することでターミナル上で起動できますが、毎回指定するのが面倒なので ~/.bashprofile~/.zshrcでエイリアスを切っておきます。

alias emacs='emacs -nw'

レイヤーの導入

レイヤーのインストール

通常のEmacsで追加機能をインストールするには、package-installなどを使ってインストールしますが、
spacemacsでは「レイヤー」と呼ばれる独自の機能拡張の仕組みを使います。

設定ファイル ~/.spacemacsに、インストールするレイヤーを指定する項目があり、
そこにインストールしたいレイヤーを追記することで起動時に自動的にインストールされます。

~/.spacemacs
;; List of configuration layers to load.dotspacemacs-configuration-layers'(;; ----------------------------------------------------------------;; Example of useful layers you may want to use right away.;; Uncomment some layer names and press <SPC f e R> (Vim style) or;; <M-m f e R> (Emacs style) to install them.;; ----------------------------------------------------------------ivy;; auto-completion;; better-defaultsemacs-lisp;; git;; markdown;; org;; (shell :variables;;        shell-default-height 30;;        shell-default-position 'bottom);; spell-checking;; syntax-checking;; version-control)

この状態では、(起動時に選択した補完フレームワークの)ivyが有効化されています。
レイヤー一覧からインストールしたいレイヤーを探して、ここに追記していけばOKです。

あと、特定のファイル(JSONとかYAMLとか)を開こうとすると、対応するレイヤーをインストールするか聞いてくるので、そこで都度インストールしても良いです。

僕は以下のレイヤーをインストールしました。

レイヤー説明
ivyキーワード補完(初回起動時に選択)
better-defaultsEmacsキーバインドの機能強化
osxmacOS向けの機能強化
gitGitクライアント(magit)を使えるようにする
version-controlバージョン管理のサポート。変更行にマークが付いたりする。
emacs-lispEmacs Lisp の言語サポート(デフォルトで有効になってる)
markdownマークダウンの言語サポート
htmlHTMLの言語サポート
javascriptJavaScriptの言語サポート
yamlYAMLの言語サポート
javaJavaの言語サポート
scalaScalaの言語サポート
pythonPythonの言語サポート
sqlSQLの言語サポート

パッケージの導入

前述の通り、spacemacsの機能追加はレイヤーを追加するのが基本ですが、
レイヤーとして提供されていないパッケージについては、パッケージ単体で導入することも可能です。

パッケージのインストール

~/.spacemacsdotspacemacs-additional-packagesにインストールしたいパッケージを追記します。

~/.spacemacs
;; List of additional packages that will be installed without being;; wrapped in a layer. If you need some configuration for these;; packages, then consider creating a layer. You can also put the;; configuration in `dotspacemacs/user-config'.dotspacemacs-additional-packages'(minimap)

パッケージの設定

dotspacemacs-additional-packagesで追加したパッケージの設定は user-config()関数に記述します。

~/.spacemacs
(defundotspacemacs/user-config()"Configuration function for user code.
This function is called at the very end of Spacemacs initialization after
layers configuration.
This is the place where most of your configurations should be done. Unless it is
explicitly specified that a variable should be set before a package is loaded,
you should place your code here.";; MiniMapを右に表示する;; https://github.com/dengste/minimap/blob/master/minimap.el(setq-defaultminimap-window-location'right))

ユーザーの独自設定

ユーザー独自の設定は、~/.spacemacsuser-init()関数に記述するようです。

僕の場合は以下の設定を追加しました。

~/.spacemacs
(defundotspacemacs/user-init()"Initialization function for user code.
It is called immediately after `dotspacemacs/init', before layer configuration
executes.
 This function is mostly useful for variables that need to be set
before packages are loaded. If you are unsure, you should try in setting them in
`dotspacemacs/user-config' first.";; 初期Frameサイズを指定(setqinhibit-startup-screent)(setqinitial-frame-alist'((top.30)(left.70)(width.180)(height.55)));; 初期モードをtextモードにする(setqinitial-major-mode'text-mode);; ウィンドウを半透明にする(ifwindow-system(progn(set-frame-parameternil'alpha95)));; Magit(Gitクライアント)をフルスクリーンで表示する;; https://github.com/syl20bnr/spacemacs/tree/master/layers/%2Bsource-control/git#magit-status-fullscreen(setq-defaultgit-magit-status-fullscreent);; Ctrl+x g でMagitを起動する(global-set-key(kbd"C-x g")'magit-status))

キーバインド

  • 公式ドキュメントに コマンド一覧があります。

    • vimキーバインドの SPCと Emacsキーバインドの Alt-mは同義なので、読み替えれば同じ操作ができます。
      例えば、終了は vimキーバインドでは SPC q qですが、Emacsキーバインドでは Alt-m q qです。
      もちろん、Emacs標準の Ctrl-x Ctrl-cでも終了できます。
  • チートシート spacemacs-cheatsheet

こんなのあるんだ〜と思ったキーバインド

キーバインドコマンド説明
Alt-F10 or Alt-m T Mtoggle-frame-maximizedウィンドウを最大化/最小化します。
Alt-m T ncycle-spacemacs-themeダークテーマとライトテーマを切り替えます。
Alt-m f tneo-tree左にディレクトリツリー(NeoTree)を表示します。
Alt-m g smagit-statusGitクライアント magitを起動します。
Alt-m f rRecent files最近開いたファイルの一覧を表示します。
Alt-m z .FoldingJSONやYAMLなどの要素を開いたり閉じたりします。
Alt-ENTER g gspacemacs/jump-to-definitionカーソル位置(型は関数など)の定義にジャンプします。
Ctrl-SSwiperSwiperでインクリメンタルサーチします。
Ctrl-c p lprojectfile-find-finle-in-directoryディレクトリ(サブディレクトリ含む)下のファイルをファイル名で探します。

最後に

vimキーバインドを使わないにしても、素のEmacsをいちからカスタムしていくよりもお手軽だと思います。
(逆に言えば、細かいカスタマイズはやりにくいかもしれませんね)

色々な機能が追加されていて、起動がやや遅い(3秒くらい待たされる感じ)のがネックですが、便利だとは思いますね。

spacemacs.png

参考文献

vimにてpowerlineのエラーの対処(備忘録)

$
0
0
error内容
Traceback (most recent call last):
  File "<string>", line 9, in <module>
ImportError: No module named powerline.vim
An error occurred while importing powerline module.
This could be caused by invalid sys.path setting,
or by an incompatible Python version (powerline requires
Python 2.6, 2.7 or 3.2 and later to work). Please consult
the troubleshooting section in the documentation for
possible solutions.
Unable to import powerline, is it installed?
Press ENTER or type command to continue
解決策(~/.vimrc内に書き足す)
let g:powerline_pycmd="python3"

EC2(CentOS)でvimを軽率にアンインストールするな絶対にだ

$
0
0

Vimを最新版に更新しようと一旦アンインストールして、罠にドボンした話です。

経緯

よくVimを最新版に更新する際に、まず入ってるVimを削除しようということで

% sudo yum remove "vim*"

がよく載ってるんですけど、これをすると、一気にsudoもアンインストールされます。

$ sudo
-bash: /usr/bin/sudo: No such file or directory

OMG.

理由

vimは4つのパッケージなんですけど、

% yum list installed | grep vim
vim-common.x86_64                    2:7.4.160-2.el7            @base
vim-enhanced.x86_64                  2:7.4.160-2.el7            @base
vim-filesystem.x86_64                2:7.4.160-2.el7            @base
vim-minimal.x86_64                   2:7.4.160-2.el7            @base

このうちvim-minimalがvimの最小構成なんですけど、これがsudoとセットなので注意。

% rpm -q --requires sudo | grep vim
vim-minimal

結論

もしsudoが必要な環境でvimをアップデートしたい場合は、yum removeせずに実施すること。sudoをアンインストールしてしまった場合、どうにもならないのでインスタンスを再作成しましょう。


ctrlp.vim で Vim のバッファ検索が楽になった

$
0
0

僕は Vim を使っていますが、バッファをあまり使っていませんでした。
しかし、ctrlp.vim というプラグインを使い始めてから、バッファの移動が簡単になったので、そのメモを書こうと思います。

課題

バッファを一覧・表示するには:lsしてから :b1や :b <tab>といったコマンドで探すと思います。
しかしたくさんバッファを開いていると、その中から開きたいバッファを目で探すのが大変だなと思っていました。

ctrlp.vim

そんな中見つけたのがctrlp.vimです。

ctrlp.vim はあいまい検索で目的のファイルやバッファを探すことができる Vim プラグインです。
ctrlp.vim 全般の使い方については下記記事がよくまとまっています。

ctrlp.vimの使い方まとめ

今回はバッファ検索の部分に絞って書きます。

使い方

ctrlp.vim インストール

ctrlp.vim をお気に入りのパッケージマネージャーでインストールします。
僕は dein.vim を使っているので、下記の書き方でインストールしました。

call dein#add('ctrlpvim/ctrlp.vim')

起動手順

下記の手順で ctrlp.vim のバッファ検索を起動します。
画面下部に ctrlp.vim ウインドウが開きます。

  • Vim 起動
  • いくつか Vim 上でファイルを開く
  • <c-p>で ctrlp.vim を起動
  • <c-f>で検索対象をファイルからバッファに切り替える

操作イメージ

実際使うとこのような感じになります。

例えば<c-j><c-k>を使い、ハイライトありで上下にバッファを移動できたり、

Aug-04-2018 10-38-04.gif

文字入力していくことであいまい検索でバッファを絞り込むことができます。

Aug-04-2018 10-41-25-fuzzy.gif

より直感的にバッファを扱えるようになって便利ですね。

参考

新人エンジニアの時に知っておきたかったこと[Vim編]

$
0
0

Vimとの出会い

エンジニアとして駆け出しの頃、Vimに出会いました。
先輩エンジニアがVimを使用しており、Vimは紹介されたエディタの1つでした。
当初はAtomを使用していましたが、彼がVimを常用しており、その操作スピードと謎な操作方法に惹かれていきました。
そして、Vimを常用する様になり、今ではVimなしでの開発は考えられません。
Vimの魅力を教えてくれた先輩エンジニアにはとても感謝しています。

Vimとは?

viから派生し、発展した高機能なテキストエディタです。
詳しくはwikiを参照ください。

Vimを使って良かったこと

ファイル操作が快適

ターミナルアプリ開いて以下のコマンドを実装するだけでファイル編集が可能なので、あのファイル修正したいと思った時にすぐに作業できます。

vim .

手を動かす時間の削減

Vimを使っているとわかりますが、基本的にキーボードのホームポジションから手を動かさずに操作できます。
慣れてくるとこの快適さをブラウザや他のツールを使用する際にも求める様になり、ショートカットを多用する習慣が生まれてくるはずです。
結果として、キーボードのホームポジションからマウスやトラックパッドに手を動かす手間を省けます。
塵も積もれば山となるので、毎日の手を動かす手間を省くだけで、少なからずの効率化につながります。

作業効率の向上

Vimには便利なプラグインが用意されており、作業が捗ります。
特定のファイルを探したり、特定の文字列を含むファイルを探したり、正規表現で文字列置換したり、Gitコミットしたり、関数の定義元にジャンプしたり、プログラムを実行したり、シンタックスをチェックしたり、変更箇所を明示したり。

Vim基本操作

基本的な操作に関しては以下が参考になります。

設定ファイル

Vimには設定ファイルがあります。

.vimrc

このファイルに設定を加えることで操作やデザインをカスタマイズできます。

こちらにマニュアルがありますので参照ください。

インターネット上で検索してみるといろんな人が.vimrcを公開していたりするので参照してみてください。

初心者向け vimrcの設定方法

プラグイン

Vimには機能を拡張するプラグインが用意されています。
いろんな人がプラグインを開発して、Vimをより快適に使える様にしています。

プラグインのインストールにはプラグインマネージャを使用します。

おい、NeoBundle もいいけど vim-plug 使えよ

ご自身の課題を解決する様なプラグインをインストールして、自分の好きなキーボードショートカットを割り当ててみましょう。

たとえば、「HTMLを触るので、効率的にHTMLを記述したい」。
そんなプラグインを探してみると、以下の様なプラグインがあるのでプラグインマネージャを使用してインストールする。
といった感じです。

mattn/emmet-vim

プラグインマネージャの使用方法がよくわからない方は、以下のサンプルソースを参考にしてみてください。

サンプルソース

Dotfilesとして管理する

.vimrcを自分用にカスタマイズすると、あなたはカスタマイズした.vimrcに依存することになります。
そのため、環境を初期化した際や新しいデバイスを購入した際に再設定する手間が発生します。

その際の手間を省くために、dotfilesとして.vimrcを管理しておきます。
結果として、新しい環境に移行した際にもdotfilesをインストールするだけで、いつもの自分のvim環境を用意することが可能になります。

最強の dotfiles 駆動開発と GitHub で管理する運用方法

まとめ

この記事ではVimについてご共有しました。
私自身、まだまだVimについて細かいなことは理解していませんが、ツールとしては便利であることは分かっています。
界隈でプラグインを開発している方々やVim関連の紹介記事を書いている方にはとても感謝しています。

新人エンジニアの方々にとって、Vimというエディタは他のAtom等のエディタに比べると敷居が若干高い気もします。
しかし、習慣的に触っていると、その良さと快適さが分かってくるのかなと思います。
ぜひ、一度お試しください。

Macの初期セットアップメモ(3) - vim周り

$
0
0

前回の記事ですっかりvimの設定を完全に忘れてました。なので、いけてる.vimrcを入れて、colorschemeにターミナルに引き続きIcebergを適用します。10年前からvimユーザですがパッケージ管理とかやったことがなかったので、今回初めて勉強してdeinを入れて見ました。

環境情報

MacBook Air (13-inch, Mid 2011)
macOS High Sierra (v10.13.6)

vimの設定

dein.vimインストール

ここにある通りの手順でインストールしました。インストールディレクトリは~/.cache/deinにしました。上記のgithubの手順だとハマるポイントがあるので、その辺りも書いておきます。

  1. 以下のコマンドでinstall.shをダウンロードしてきて実行

    curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
    # For example, we just use `~/.cache/dein` as installation directory
    sh ./installer.sh ~/.cache/dein
    
  2. 1.の実行結果の最後に.vimrcに記述すべき内容が出てくるので、それを.vimrcにコピペ。最後の「If you want to install ...」のコメントアウトを外しておくとvim起動時にインストールされていないプラグインがあれば自動でインストールしてくれる。便利そうなのでコメントアウトしておいた。(*ここでGithubの手順に書いてある.vimrcをコピペしてきてもうまくいかない模様。readme.mdのupdateがされてないんですかね。)

    ~/.vimrc
    "dein Scripts-----------------------------if&compatible
      set nocompatible               " Be iMproved
    endif〜中略〜
    
    " If you want to install not installed plugins on startup.if dein#check_install()call dein#install()endif"End dein Scripts-------------------------
  3. vimを起動するとdeinがインストールされる(はず1)。

何故かvim起動するたびにメッセージが出てくる

起動するたびに以下のメッセージが出てきた。毎回出てきてかなり鬱陶しい。

deol.nvim requires Neovim or terminal feature enabled Vim.
Press ENTER or type command to continue

.vimrcを見るとcall dein#addでdeol.nvimを使おうとしている。deol.nvimはneovimかterminal featureの有効化されたvimじゃないと動かないよ忠告してくれてる模様。
この部分、よく読むとdein.vimの動作に必要な行ではなさそうで、githubのrevision/branch/tagを指定できるよ、というただの例であることが分かる。なので.vimrcにある以下の行をコメントアウトして解決した。

~/.vimrc
" You can specify revision/branch/tag." call dein#add('Shougo/deol.nvim', { 'rev': '01203d4c9' })

同じ課題にぶつかってる人は結構いるみたいで、例えばここはvimのバージョンを上げることで解決してる。おそらくこのタイミングでvimのterminal featureが入ったからエラーが出なくなったんじゃないだろうか。

ちなみにdeol.nvimはGitによれば「Deol.nvim is a dark powered shell for Neovim. It is based on neovim or Vim terminal feature.」とのこと。neovimで誕生したterminal機能の改良版って感じでしょうか。terminalは多分この辺の話。

Icebergのインストール

  1. .vimrcにicebergを追記。colorschemeも設定。

    ~/.vimrc
    "dein Scripts-----------------------------if&compatible
      set nocompatible               " Be iMproved
    endif〜中略〜
    
      " Add or remove your plugins here:call dein#add('Shougo/neosnippet.vim')call dein#add('Shougo/neosnippet-snippets')call dein#add('cocopon/iceberg.vim')〜中略〜
    
    "Personal Settings------------------------colorscheme iceberg
    "End Personal Settings--------------------                                              
  2. vimを起動すると自動的にインストールされて、colorschemeもicebergになる。

.vimrcの設定

これを使わせていただきました。

~/.vimrc
" setting"文字コードをUFT-8に設定set fenc=utf-8" バックアップファイルを作らないset nobackup
" スワップファイルを作らないsetnoswapfile" 編集中のファイルが変更されたら自動で読み直すset autoread
" バッファが編集中でもその他のファイルを開けるようにset hidden
" 入力中のコマンドをステータスに表示するset showcmd


" 見た目系" 行番号を表示setnumber" 現在の行を強調表示set cursorline
" 現在の行を強調表示(縦)set cursorcolumn
" 行末の1文字先までカーソルを移動できるようにset virtualedit=onemore
" インデントはスマートインデントset smartindent
" ビープ音を可視化set visualbell
" 括弧入力時の対応する括弧を表示set showmatch
" ステータスラインを常に表示set laststatus=2" コマンドラインの補完set wildmode=list:longest
" 折り返し時に表示行単位での移動できるようにする
nnoremap j gj
nnoremap k gk


" Tab系" 不可視文字を可視化(タブが「▸-」と表示される)set list listchars=tab:\▸\-" Tab文字を半角スペースにするset expandtab
" 行頭以外のTab文字の表示幅(スペースいくつ分)set tabstop=2" 行頭でのTab文字の表示幅set shiftwidth=2" 検索系" 検索文字列が小文字の場合は大文字小文字を区別なく検索するset ignorecase
" 検索文字列に大文字が含まれている場合は区別して検索するset smartcase
" 検索文字列入力時に順次対象文字列にヒットさせるset incsearch
" 検索時に最後まで行ったら最初に戻るset wrapscan
" 検索語をハイライト表示set hlsearch
" ESC連打でハイライト解除
nmap <Esc><Esc>:nohlsearch<CR><Esc>

加えて以下を追加しています。文字コードをutf-8とし、自動判定もするようにしています。よくwindowsで作ったコードを持ってくることもあるので日本語コメントが化けるのを防止するためです。「Emacs風...」はエディットモードでemacsライクなショートカットを使えるようにするためです。

~/.vimrc
" 文字コードの自動判定:set encoding=utf-8:set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8,shift_jis,cp932,ucs-bom

" Emacs風カーソル移動キーバインド
noremap!<C-b><Left>
noremap!<C-f><Right>
noremap!<C-n><Down>
noremap!<C-p><Up>
noremap!<C-a><Home>
noremap!<C-e><End>
noremap!<C-h><Backspace>
noremap!<C-d><Delete>

クリップボードを使えるようにする

この記事を参考にさせていただきました。

Mavericksで標準インストールされているVimではクリップボード連携ができません。

ということなのでclipboardを有効化していきます。まずはclipboardの状況を確認。

% vim --version | grep"clipboard"-clipboard       +job             +path_extra      -toolbar
+ex_extra        -mouse_gpm-sun_workshop-xterm_clipboard

-clipboardという感じで-にっているので有効ではありません。brewでインストールしたvimは+になってるそうなのでインストールしてみます。

brew install vim

インストールしたvimでclipboardが+になっていることを確認します。

% /usr/local/Cellar/vim/8.1.0202/bin/vim --version | grep"clipboard"
+clipboard         +jumplist          +persistent_undo   +vertsplit
+emacs_tags        +mouse_dec         -sun_workshop-xterm_clipboard

usr/local/bin/vimを確認すると上記のbrewで入れたvimに紐づいているようで、+になっていました。

% /usr/local/bin/vim --version | grep"clipboard"
+clipboard         +jumplist          +persistent_undo   +vertsplit
+emacs_tags        +mouse_dec         -sun_workshop-xterm_clipboard

PATHを確認すると/usr/lobal/binが優先されており、vimと打てばclipboardが有効なvimが動いてくれました。

% echo$PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

% which vim
/usr/local/bin/vim

% vim --version | grep"clipboard"
+clipboard         +jumplist          +persistent_undo   +vertsplit
+emacs_tags        +mouse_dec         -sun_workshop-xterm_clipboard

.vimrcでヤンクをclipboardに入れるように設定します。

~/.vimrc
set clipboard+=unnamed

これでyでヤンクした文字列をcommand+vで他のアプリにも貼り付けられるようになりました。

しかし、ここで変なことが起きます。vimの中でbackspaceが効かないのです。beepが出ます。原因はわかっていないですが、この記事を参考に以下を追加したら治りました。最初から入っていたvimでは起きていません。謎です。

~/.vimrc
set backspace=indent,eol,start

ちなみにviはもともと入っていた標準のvimに紐づいているようで-clipboardでした。viだけでvim開きたいので.zshrcでaliasを追加しておきます。

% vi --version | grep"clipboard"-clipboard       +job             +path_extra      -toolbar
+ex_extra        -mouse_gpm-sun_workshop-xterm_clipboard

% vi .zshrc #ここで「alias vi=vim」を追加

% source .zshrc

% vi --version | grep"clipboard"
+clipboard         +jumplist          +persistent_undo   +vertsplit
+emacs_tags        +mouse_dec         -sun_workshop-xterm_clipboard

treeインストール

全然話は変わりますがtreeコマンドは要るよなと思い立ってインストールしました。

% brew install tree

こんな風にディレクトリ構造を可視化してくれるので何かと便利です。

% tree -L 2 /users
/users
├── Guest
│   ├── Desktop
│   ├── Documents
│   ├── Downloads
│   ├── Library
│   ├── Movies
│   ├── Music
│   ├── Pictures
│   └── Public
├── Shared
│   └── adi
└── hoge
    ├── Applications
    ├── Desktop
    ├── Documents
    ├── Downloads
    ├── Library
    ├── Movies
    ├── Music
    ├── Pictures
    └── Public

今後について

今度こそ基本的な設定は完了です。これから勉強用に色々入れていきます。vimが一番時間かかりました。今まで何度かMacの初期セットアップしてきましたが、メモしながらインストールすると、色々ハマってトラシューしてる間に「あれ今何やってたんだっけ?」て迷子になることを防げるので良い方法だなと思いました。


  1. 最初はgithubに書いてある手順でインストールをしていたので、2.でコメントアウトしたインストールされていないプラグインのインストールの部分が書いてなかたった。なのでvim起動後:call dein#install()でインストールしました。なので起動するだけで本当にインストールされるかは未確認です。 

Scoopを使ったWindows環境構築のススメ - Hyper!!!

$
0
0

この記事は連載物のひとつになっています。
前回扱った内容が前提になっているため(下に概要は載せていますが)一読しておくことをおすすめします。

守章: Scoopの基礎、簡単なManifestの作成
破章: バージョン管理と自動アップデート ← (今回はこれ)
離章: Scoopを用いた環境構築する際の勘所

今回はKaoriYa版Vimなどを題材に、Scoopでのバージョン管理を担うcheckver属性とautoupdate属性について解説します。
そして今回も環境構築には触れません。公式WikiよりApp Manifest Autoupdateの和訳です。

たぶんいないだろうけどKaoriYa版Vimのかんたん導入だけ知りたい人は前回の記事を読んだ上でこれを読んでください。

おさらい

前回はScoopを使うメリットと利用法を学びました。PowerShell3.0以上があれば導入も操作も簡単です。
そして下のようなJSONをGitリポジトリに登録し公開することで、誰でも自由に拡張できることも知りました。

ctrl2cap.json
{"##":"実行中にUAC昇格ポップアップが出ます。","license":{"identifier":"Freeware","url":"http://technet.microsoft.com/ja-jp/sysinternals/bb469936"},"depends":["sudo"],"version":"2.0","url":"http://download.sysinternals.com/files/Ctrl2Cap.zip","hash":"2d8c06374da140beda79ac1940ab2b06a56a9af182dba70a6338313d768a2ac2","installer":{"script":["sudo $dir\\ctrl2cap.exe /install","if ($? == $false) {","    Write-Host '===================================' -Foreground Red","    Write-Host 'ctrl2capの実行に失敗しました。' -Foreground Red","    Write-Host '===================================' -Foreground Red","}"]},"bin":"ctrl2cap.exe","shortcuts":[["ctrl2cap.exe","Ctrl2cap"]],"notes":["再設定をしたい場合は、以下の手順で行ってください。","- スタートメニューから「Ctrl2cap」で検索、管理者権限で実行","- 管理者権限のプロンプトで 'ctrl2cap /uninstall' を実行",]}

前回紹介したうち主要な属性の概要です。

属性
binパスを通したいファイル
depends依存するManifest
hashhash値 ※準必須属性
installerインストール処理
notesインストールの全処理完了後に出す文
shortcutsスタートメニューに作るショートカット
urlダウンロードするファイル ※必須属性
versionバージョン ※必須属性
##コメント

補足: architecture属性、extract_dir属性

バージョン管理について知る前に、前回紹介できなかったarchitecture属性そしてextract_dir属性について話しておきます。
以下に今回メインの題材となるKaoriYa版Vim(以降 Vim 表記)の簡単なManifestを載せておきます。

vim-kaoriya-nogvim.json
{"homepage":"https://github.com/koron/vim-kaoriya","description":"Vim + kaoriya build system, without gvim.","version":"8.1.0005.20180520","architecture":{"32bit":{"url":"https://github.com/koron/vim-kaoriya/releases/download/v8.1.0005-20180520/vim81-kaoriya-win32-8.1.0005-20180520.zip","hash":"afacd6e27304136f5ebae3edddf6e747f410880fa6a986d80be772e03ef56d36","extract_dir":"vim81-kaoriya-win32"},"64bit":{"url":"https://github.com/koron/vim-kaoriya/releases/download/v8.1.0005-20180520/vim81-kaoriya-win64-8.1.0005-20180520.zip","hash":"53e8dd08e2249ce8a54784e16469151a7bf9857ac9acf3a1b341ac4e7da26fb2","extract_dir":"vim81-kaoriya-win64"}},"bin":"vim.exe"}

url/hash/extract_dirと3つの属性がarchitecture属性内の32bitおよび64bit属性に移動しています。
architecture属性を用いることで、このようにアーキテクチャ毎にリソースが異なる場合でも分離することができます。

参考までに、architecture属性によって分割できる属性は以下の通り。

  • url
  • hash
  • bin
  • shortcuts
  • pre_install
  • post_install
  • installer
  • uninstaller
  • extract_dir

そしてextract_dir属性は、使用するディレクトリを抜き取るための属性です。擬似的にルートディレクトリを変更する属性、とも言えるでしょうか。
説明のために64bit版zipファイルを展開したときのツリービューを載せておきます。

tree
. 
└── vim81-kaoriya-win64
    ├── lua
    │   ├── ...
    ~
    ├── vim.exe
    ├── vimrc
    ├── vimrun.exe
    ├── winpty-agent.exe
    ├── winpty.dll
    └── xxd.exe

このままだとルート直下にvim81-kaoriya-win64しか存在していない状態となってしまい、もしvimにパスを通すならbin属性にvim81-kaoriya-win64\\vim.exeを渡さなければなりません。
しかしextract_dir属性に任意のディレクトリ、今回はvim81-kaoriya-win64を指定することで実質的にルートが変更され、bin属性の値がvim.exeとシンプルになるだけでなく後述するようにバージョン変更にも強くなります。

それでは気を取り直して、バージョン管理のための属性について見ていきましょう。

checkver属性

checkver属性は以下の内容に対して検索をかけることで、バージョンの取得を行うための属性です。

  • GitHubリリースページのURL
  • HTMLファイル
  • JSON

ちなみに前回解説し忘れてしまったのですが、version属性も含めてバージョンは英数字と+-._の組み合わせで構成されている必要があります。

GitHubのリリースURLから取得

一番楽なのはGitHubの最新版リリースページのURLを見る方法です。
nvmcmderがこれを採用しているので見てみましょう。

nvm.json
"homepage":"https://github.com/coreybutler/nvim-windows","checkver":"github",
cmder.json
"homepage":"https://cmder.net","checkver":{"github":"https://github.com/cmderdev/cmder"},

ご覧の通り、homepage属性にGitHubリポジトリを当てているかで表記が変わります。
当てている場合はcheckver属性にgithubを、そうでない場合はgithub属性を持ったオブジェクトを当てます。処理内容はどちらも同じでhttps://github.com/USERNAME/REPONAME/releases/latestのリダイレクト先URLにあるタグからバージョンを取得します。

ちなみにこの方法が使えるのは、

  • プレリリース版ではない
  • タグが^v?[\d.$]+$の正規表現に適合する

これら2点を満たしている場合のみです。意外と限定的。

HTMLから取得

つづいて、HTMLの中から探す方法を見てみましょう。
一番よく行われているのはダウンロードするファイル名を検索する方法です。
たとえばgitのcheckverはこんな感じになっています。

git.json
"checkver":{"url":"https://github.com/git-for-windows/git/releases/latest","re":"v(?<version>[\\d\\w.]+)/PortableGit-(?<short>[\\d.]+).*\\.exe"},

url属性に対象となるURLを指定するのですが、指定したHTMLにバージョン情報しか記載されていないことはまずないので、re属性も付け加えます。こうすることで得られるHTMLから抜き出すことができます。

この正規表現の書き方にもちょっとした拡張があり、丸括弧中の先頭に?<VAR_NAME>という接頭辞をつけることで、一致した内容に名前をつけることができます。ここでversionという名前をつけるとそれがバージョンとして認識される仕組みです。丸括弧がひとつだけなら?<version>すら不要です。

一方で、バージョンの構成要素が分散してしまっていたり、そのまま抜き出そうとすると曖昧すぎるマッチングになってしまう例もあるかと思います。このような場合はreplace属性を利用しましょう。
たとえばeclipse-platformを見てみましょう。

eclipse-platform.json
"checkver":{"url":"http://download.eclipse.org/eclipse/downloads/","re":"<a href=\"(?<drop>drops4/R-(?<release>[\\d.]+[a-z]?)-(?<date>[\\d]{12}))/\" title=\"Latest Release\">([\\d.]+)","replace":"${release}-${date}"},

このようにreplace属性内でマッチ結果をつなぎあわせることでバージョンを生成することができます。

それと、x264リリースページのように、マッチする箇所が昇順に複数並んでいるけどそのうちの一番下にあるファイル名からコードを抜き出したい場合もあったりします。
そういうときはreverse属性にtrueを指定してください。

x264.json
"checkver":{"url":"https://download.videolan.org/pub/videolan/x264/binaries/win64/","re":"x264-r(?<version>[\\d]+)-(?<commit>[a-fA-F0-9]{7}).exe","reverse":true},

またhomepage属性に指定したURLにバージョンが入っている場合は省略した記法ができます。

7zip.json
"homepage":"http://www.7-zip.org/","checkver":"Download 7-zip ([^\\ ]+)",

JSONから取得

あまり見ないですが、JSONファイルにバージョンがある場合はjp属性にJSONPathで指定することで取得できます。
以下にNuGetのcheckverを挙げておきます。

nuget.json
"checkver":{"url":"https://dist.nuget.org/index.json","jp":"$.artifacts[0].versions[0].version"},

実際にやってみる

一通り方法が分かったところで、先程のVimにcheckver属性を付けてみましょう。

このリポジトリのタグは^v?[\d.]+$の正規表現にマッチしないので、リリースページURLを利用する方法は使えません。
ここはわかりやすくリリースページのHTMLから取得する方法を採りましょう。

vim-kaoriya-nogvim.json
{"homepage":"https://github.com/koron/vim-kaoriya","description":"Vim + kaoriya build system, without gvim.","version":"8.1.0005.20180520","architecture":{"32bit":{"url":"https://github.com/koron/vim-kaoriya/releases/download/v8.1.0005-20180520/vim81-kaoriya-win32-8.1.0005-20180520.zip","hash":"afacd6e27304136f5ebae3edddf6e747f410880fa6a986d80be772e03ef56d36","extract_dir":"vim81-kaoriya-win32"},"64bit":{"url":"https://github.com/koron/vim-kaoriya/releases/download/v8.1.0005-20180520/vim81-kaoriya-win64-8.1.0005-20180520.zip","hash":"53e8dd08e2249ce8a54784e16469151a7bf9857ac9acf3a1b341ac4e7da26fb2","extract_dir":"vim81-kaoriya-win64"}},"bin":"vim.exe","checkver":{"url":"https://github.com/koron/vim-kaoriya/releases/latest","re":"vim(?<short>[\\d]+)-kaoriya-win32-(?<code>[\\d.]+)-(?<date>[\\d]{8}).zip","replace":"${code}.${date}"}}

codeに該当する部分だけでもいいのですが、個人的には更新日も知りたかったので入れてみました1
ついでにcheckver属性を編集したら現在のversion属性もこれに合致するかどうか確認しておく癖を付けておくとなおいいです。

autoupdate属性

autoupdate属性ではcheckver属性で取得したバージョンを用いて、以下の属性を更新するための雛形を定義できます。

  • url
  • hash
  • extract_dir
  • notes(バージョン情報の使用不可)

今回はurl属性を例に解説していきます。

バージョン情報を埋め込む

バージョンは$versionという文字をそのまま埋め込むだけです。

ack.json
"autoupdate":{"url":"https://beyondgrep.com/ack-$version-single-file#/ack-single-file"}

またバージョンがドット区切りであるならば各構成要素を示す特殊変数も使えます。
$versionが4つに区切られている場合は順に$majorVersion$minorVersion$patchVersion$buildVersionとなります。

flux.json
"version":"4.76","url":"https://justgetflux.com/flux-setup4-76.exe#/flux-setup.exe","autoupdate":{"url":"https://justgetflux.com/flux-setup$majorVersion-$minorVersion.exe#/flux-setup.exe"}

architecture属性でurlが分けられている場合は、autoupdate属性内にarchitecture属性をつくります。

rust.json
"autoupdate":{"architecture":{"64bit":{"url":"https://static.rust-lang.org/dist/rust-$version-x86_64-pc-windows-gnu.msi"},"32bit":{"url":"https://static.rust-lang.org/dist/rust-$version-i686-pc-windows-gnu.msi"}}}

checkver属性で使った値を利用する

checkverのre属性で変数を設定することができましたが、これをautoupdateの中でも利用することができます。
ただしreplace属性とは違って、abcという変数はmatchAbcと変数名が変わります。

先ほどのVimにはこれが使えそうですね。

vim-kaoriya-nogvim.json
"checkver":{"url":"https://github.com/koron/vim-kaoriya/releases/latest","re":"vim(?<short>[\\d]+)-kaoriya-win32-(?<code>[\\d.]+)-(?<date>[\\d]{8}).zip","replace":"${code}.${date}"},"autoupdate":{"architecture":{"32bit":{"url":"https://github.com/koron/vim-kaoriya/releases/download/v$matchCode-$matchDate/vim$matchShort-kaoriya-win32-$matchCode-$matchDate.zip"},"64bit":{"url":"https://github.com/koron/vim-kaoriya/releases/download/v$matchCode-$matchDate/vim$matchShort-kaoriya-win64-$matchCode-$matchDate.zip"}}},

hash属性を設定する

url属性の値が変われば、当然それに紐づくhash属性も変化させなければいけません。
しかしありがたいことにhash属性については指定しなくても自動でダウンロードしたファイルから算出してくれるので基本的に指定する必要はありません。

もし個別で用意してあるのであればhash属性として付け加えることができます。
指定方法や抽出方法も充実しているので、詳しくは公式Wikiをご覧ください。

実際にやってみる

url属性の書き方は既に説明したので、あとはextract_dir属性だけすが、こいつにはurl属性と同じ変数と特殊変数が使えます。
ということでVimのManifestは以下のもので完成形となります。

vim-kaoriya-nogvim.json
{"homepage":"https://github.com/koron/vim-kaoriya","description":"Vim + kaoriya build system, without gvim.","version":"8.1.0005.20180520","architecture":{"32bit":{"url":"https://github.com/koron/vim-kaoriya/releases/download/v8.1.0005-20180520/vim81-kaoriya-win32-8.1.0005-20180520.zip","hash":"afacd6e27304136f5ebae3edddf6e747f410880fa6a986d80be772e03ef56d36","extract_dir":"vim81-kaoriya-win32"},"64bit":{"url":"https://github.com/koron/vim-kaoriya/releases/download/v8.1.0005-20180520/vim81-kaoriya-win64-8.1.0005-20180520.zip","hash":"53e8dd08e2249ce8a54784e16469151a7bf9857ac9acf3a1b341ac4e7da26fb2","extract_dir":"vim81-kaoriya-win64"}},"bin":"vim.exe","checkver":{"url":"https://github.com/koron/vim-kaoriya/releases/latest","re":"vim(?<short>[\\d]+)-kaoriya-win32-(?<code>[\\d.]+)-(?<date>[\\d]{8}).zip","replace":"${versionCode}.${date}"},"autoupdate":{"architecture":{"32bit":{"url":"https://github.com/koron/vim-kaoriya/releases/download/v$matchCode-$matchDate/vim$matchShort-kaoriya-win32-$matchCode-$matchDate.zip","extract_dir":"vim$matchShort-kaoriya-win32"},"64bit":{"url":"https://github.com/koron/vim-kaoriya/releases/download/v$matchCode-$matchDate/vim$matchShort-kaoriya-win64-$matchCode-$matchDate.zip","extract_dir":"vim$matchShort-kaoriya-win64"}}}}

バージョンの自動更新を実行しよう

さて、checver属性もautoupdate属性も付けましたが、いったいどのタイミングで更新がされるのでしょうか?

利用者のscoop update実行時? いえいえ、これもManifest作成者がやらなくちゃいけないんです。

Windowsで自動更新する

Scoopにはもともとcheckver.ps1というManifest自動更新用のスクリプトが用意されており、extras Bucketなどはこれを利用するための同名スクリプトが用意されています。特に理由がない限りはextras Bucketにあるcheckver.ps1をそのまま自分のリポジトリのbinディレクトリ内に入れておきましょう。

これによって、リポジトリルートにて.\bin\checkver.ps1 MANIFESTを叩くと公式で管理されているバージョン確認処理が、-uオプションを付けることで自動更新の処理も併せて実行されるようになっています。

ただいちいちリポジトリに移動してコマンドを叩くのも面倒なので、いっそのこと関数にしてみましょう。どうせならscoop updateの際に一緒に実行できれば幸せですよね。
というわけでPowerShellスクリプトを作ってみました。

update_buckets.ps1
# globalのuser.nameとBucket所有者名が一致するものを自動更新# * リモート名は"origin"のみ対応# * sshを使うようになっていないもの(=初期状態)はスルーするので#   事前に該当リポジトリ内で"git remote set-url"を実行する必要あり# * 自動でcommitおよびpushをするので注意$my_name= git config --global user.name
$my_buckets= @()$prompt_current_dir=Get-Location$scoop_root=[environment]GetEnvironmentVariable('SCOOP', 'User')if(!$scoop_root){$scoop_root="$HOME\scoop"}Get-ChildItem$scoop_root\buckets\* | ForEach-Object {Set-Location$_$url= git remote get-url --push "origin"if($url -clike "git@*/$my_name/*"){$my_buckets +=$_}}foreach($bucketin$my_buckets){Set-Location$bucketif(Test-Path .\bin\checkver.ps1){Write-Host"Check Bucket: "$_.Name -Foreground Green
        Get-ChildItem .\*.json | ForEach-Object {$json=$_.Name
            .\bin\checkver.ps1 $json -u
            if($(git diff$json)){Write-Host"  => Update: $json" -Foreground Blue
                git commit -a -m "Update: $json"}}if($(git diff)){Write-Host"  => Push bucket..."
            git push
        }}}Set-Location$prompt_current_dir

こいつにパスを通してupdate_buckets; scoop update; scoop update *をエイリアスにしておくことで、Scoopのアップデートと同時に独自Bucketも更新がされるようになります。

Mac/Linuxで自動更新する

もしあなたが普段Unixを使っていて、なおかつBucketのメンテナーだとしたらどうでしょう?

PowerShellもバージョン6からMacおよびLinuxでも実行できるようになったのでScoopを使って同じように……と言いたいところですが、どうも私の環境ではインストールすらできないんですよね。ここにあるCalinou氏の発言を見ると動作しているように捉えられなくもないし、Linux上でのテストコードも存在しているし、おそらく自動アップデートのスクリプトなら動くはずなんだけど。

どちらにせよ前述の通りcheckver属性とautoupdate属性に従って自身の内容を更新するだけなので、やろうと思えばPythonなどでも移植はできなくもなさそうです。
もしUnix上で自動アップデートができたら、いざWindowsを使うことになってもすぐに最新版を使えるようになりますね!!

まとめ

  • checkver属性でHTMLなどからバージョンの取得方法が指定できる
  • autoupdate属性で更新内容を定義できる
    • url属性、extract_dir属性はバージョン情報とcheckverのre属性のマッチ結果も使える
    • hash属性は基本的に指定しなくてもいい
  • Scoopに用意されているcheckver.ps1を使ってバージョン確認処理が実行可能
    -uオプションをつければautoupdate属性を元に書き換えもやってくれる

あとがき

今回は自動更新にまつわる機能についての記事になりました。公式Wikiがかなり充実しているので記事にする必要もないかと思いましたが、Scoop普及のためにいろいろ頑張ってみました。
そしてこの記事を書くにあたって改めて、この自動アップデートすらも簡単に済ませられるScoopのお手軽さに感動しました。皆さんも勿論この便利さに涙を流しながら喜んでいることでしょう。私には分かってます。

あ、次回はいよいよ環境構築についての話です。ようやくです。


  1. 後述の通り、本当はビルドバージョンを入れなきゃいけない。 

Vimの設定 コピペ

$
0
0

Vimの設定毎回面倒なので
どこかのサイトからとってきたやつを使っていたのですが
割と良かったのでいつでもコピペで環境構築できるように共有しておきます。

$ vi /etc/vim/vimrc

/etc/vim/vimrc
" 一番下に追加setnumberset title
set ambiwidth=double
set tabstop=4set expandtab
set shiftwidth=4set smartindent
set list
set listchars=tab:»-,trail:-,eol:,extends:»,precedes:«,nbsp:%
set nrformats-=octal
set hidden
sethistory=50set virtualedit=block
set whichwrap=b,s,[,],<,>set backspace=indent,eol,startset wildmenu

defxをインストールしてみた。

$
0
0

初めに

Shougo様開発中のdefxをインストールして使ってみましたので現時点での簡単なまとめを載せます。

インストール

インストール方法は下記githubのページを参照。
https://github.com/Shougo/defx.nvim

起動方法

インストール後に下記コマンドで[defx]バッファが開く。ファイルタイプはdefx。

:Defx<CR>

キーマップ

キーマッピングはヘルプに記載されているものを設定ファイルに貼り付けた後、調整する。

autocmd FileType defx calls:defx_my_settings()function!s:defx_my_settings() abort
    " Define mappings
    nnoremap <silent><buffer><expr><CR>    \ defx#do_action('open')
    nnoremap <silent><buffer><expr> K
    \ defx#do_action('new_directory')
    nnoremap <silent><buffer><expr> N
    \ defx#do_action('new_file')
    nnoremap <silent><buffer><expr>h    \ defx#do_action('cd',['..'])
    nnoremap <silent><buffer><expr>~    \ defx#do_action('cd')
    nnoremap <silent><buffer><expr><Space>    \ defx#do_action('toggle_select').'j'
    nnoremap <silent><buffer><expr>j    \ line('.')== line('$') ? 'gg':'j'
    nnoremap <silent><buffer><expr>k    \ line('.')==1 ? 'G':'k'endfunction
ヘルプ記載キーマップ例コマンド名動作
Enter(Ctrl+m)defx#do_action('open')マーク行をマークをつけた順に開く。マークがなければカーソル行を開く。
Kdefx#do_action('new_directory')名前を指定してディレクトリを作成する。
Ndefx#do_action('new_file')名前を指定してファイルを作成する。
hdefx#do_action('cd', ['..'])一つ上の階層に移動する。
~defx#do_action('cd')ホームディレクトリに移動する。
Spacedefx#do_action('toggle_select') . 'j'カーソル行にマークを付ける。
jline('.') == line('$') ? 'gg' : 'j'カーソルを一つ下の行に移動する。最下段時に最上段に移動。
kline('.') == 1 ? 'G' : 'k'カーソルを一つ上の行に移動する。最上段時に最下段に移動。

気になったこと

・defxを開く際は特に分割せずにdefxバッファを開くので分割表示したい場合は自力で設定する必要がある。
・do_action('open')はファイルを開く際は単純にバッファを開くだけなので別ウインドウや別タブに表示したい場合は自力で設定する必要がある。

終わりに

以上が現時点で使ってみてわかったことになります。
今後の開発に期待しております。
最後に作者様に感謝を。

vim-plugを設定したvim用.vimrcがある状態でgvimを起動しようとしたら"E117: 未知の関数です: plug#begin"


VSCodeVim:コマンド繰り返しのキーバインディング設定

$
0
0

ブログからの転載記事です。

画面単位のスクロール(<C-u><C-d><C-b><C-f>)があまり合わないため、Vimでは Jで10行上に移動するようなキーバインドを設定している。

noremap <S-j> 10j
noremap <S-k> 10k
noremap <S-h> 10h
noremap <S-l> 10l

この設定をVisual Studio Codeに入れるにはユーザー設定に下記のように記載する。

{"vim.normalModeKeyBindings":[{"before":["H"],"after":["1","0","h"]},{"before":["J"],"after":["1","0","j"]},{"before":["K"],"after":["1","0","k"]},{"before":["L"],"after":["1","0","l"]}]}

ポイントは、コマンドの繰り返しの指定は ["10h"]でも ["10", "h"]でもなく、["1", "0", "h"]と指定する必要があること。

【vimめも】 15. Vim scriptの基本

$
0
0

変数

宣言とスコープ

" 変数の定義let foo =4" 変数の削除
unlet foo

変数にはスコープがあり、変数名の前にl:などを付けて指定する

省略した場合は、関数内であればl:、それ以外であればg:となる

  • b
    現在のバッファにローカル
  • w
    現在のウィンドウにローカル
  • t
    現在のタブページにローカル
  • g
    グローバル
  • l
    関数にローカル
  • s
    :sourceされたVim scriptにローカル
  • a
    関数の引数(関数内のみ)
    let時には指定できない
  • v
    グローバル、Vimがあらかじめ定義

変数を作成の際だけでなく代入の際もletをつける

letl:foo =1" 代入letl:foo =3

コンソール出力

let foo =1
echo foo
"=> 1

数値

" 数値let foo =1"=> 1" 加算let foo +=2"=> 3" 減算let foo -=1"=> 2

文字列

" 文字列let foo ='a'let foo ="a"" 文字列の連結let bar = foo .'bc'

リスト

" リストlet foo =['a','b']let bar =['c','d']"=> ['a', 'b']" 連結( + )
foo + bar
"=> ['a', 'b', 'c', 'd']let foo += bar
"=> ['a', 'b', 'c', 'd']" 取り出し
foo[2]"=> 'c'" 最後の要素を取り出し
foo[-1]"=> 'd'" 部分リスト" 2番目から最後までlet endlist = foo[2:]"=> ['c', 'd', 'e']" 1個の要素からなるリスト: [3]let shortlist = foo[2:2]"=> ['c']" リストのコピーを作るlet otherlist = foo[:]"=> ['a', 'b', 'c', 'd', 'e']" 変更let foo[4]='f'"=> ['a', 'b', 'c', 'd', 'f']

辞書

改行する際は、次行の行頭に \をつける

" 辞書let dict ={'foo':23,'bar':4}" 辞書let person ={\'name':'ryo',\'height':176,\'weight':64,\'like':{\'drink':'japan-sake'\},\'birthday':[1993,12,29]}

person["name"]"=> 'ryo'
person.name
"=> 'ryo'

条件

trueやfalse型はない1

真理値には数値が使われる。0は偽を意味し、非0は真を表す

if1" 通るelse" 通らないendifif0" 通らないelse" 通るendifif0" 通らないelseif1" 通るendif

ループ

リストを使用

let list =[3,4,6,1]for item in list
  echo item
endfor"=> 3"=> 4"=> 6"=> 1let index =0while index < len(list)
  echo list[index]let index +=1endwhilefor item in list
  if item ==4" 次に進む"
    continue
  endifif item ==6" ループを抜けるbreakendif

  echo item
endfor

エラー制御

try
  sleep 10" 例外を投げるthrow"error"catch/^Vim:Interrupt$/
  echo 'Ctrl + c でキャンセルされました'catch/^error$/
  echo "errorを検知"catch" 例外すべて補足
  echo '例外発生'finally" 必ず実行
  echo is_wait ? '成功':'失敗'endtry

  • 三項演算子
empty(list) ? 'a':'b'
  • OR
exist('list')|| empty?(list)
  • AND
exist('list')&& empty?(list)
  • 比較演算
" 等しいa==b" 等しくないa!=b" より大きいa>b" 大きいか等しいa>=b" より小さいa<b" 小さいか等しいa<=b" 正規表現にマッチするa=~b" 正規表現にマッチしないa!~b
  • 演算
" 足し算a+b" 引き算a-b" 文字列連結a.b" 掛け算a * b" 割り算a / b" 割った余りa % b
  • その他
" 論理否定!a

関数

関数を実行のみの場合はcallを前につける

それ以外の場合はcallは付けない

let list =[1,2,3]call add(list,4)
echo list
"=> [1, 2, 3, 4]

全般で使用する関数

" コピー(浅い)letl:bar = copy(list)" コピー(深い)letl:bar = deepcopy(list)" 変数が定義されているかif exists('foo')endif" 機能がサポートされているかif has('mac')endif

文字列でよく使用する関数

" 文字列が空かif empty(str)endif" 文字列を評価if eval("a == ". prefix ."_value")endif

リストでよく使用する関数

" 先頭に追加call insert(list,'a')" 末尾に追加call add(list,'z')" 削除(3番目の要素を削除)call remove(list,2)" 削除(3番目から最後までを削除)call remove(list,2,-1)" 並び替えlet sorted_list =sort(list)" 反転let reversed_list = reverse(list)" 重複削除let uniq_list = uniq(list)" 数let length = len(list)" 最大値let max_value = max(list)" 最小値let min_value = min(list)let str =join(list,',')if empty(list)endif

辞書でよく使用する関数

" 要素の追加(変更)let dict['age']=24let dict.age =24" 要素の削除call remove(dict,'name')
unlet dict['name']
unlet dict.name

echo keys(dict)
echo values(dict)

前回: 【vimめも】 14. grep

私が使う Vim プラグインまとめ

$
0
0

はじめに

Neovim の設定を一年以上サボっていたので、久しぶりに整理しました。
入れているのに全く使っていなかったプラグインや、上手く活用できていなかったプラグインがあることに気づき、改めてプラグインの使い方をおさらいしてみました。

※ 前回書いた記事の続きとなっておりますので、そちらもご覧ください。
=> Neovim の設定を綺麗に整理してみた

やったこと

  • Vim プラグインの使用方法の調査
  • キーマッピング

環境

  • macOS Sierra: v10.12.6
  • Neovim: v0.3.0
  • Python2: v2.7.10
  • Python3: v3.7.0
  • Ruby: v2.4.4p296
  • Node.js: v10.6.0

プラグイン紹介

tpope/vim-endwise

do ブロック や def、 if 文などを作成するときに end を自動で入力してくれるプラグインです。

デモンストレーション

vim-endwise.gif

Townk/vim-autoclose

括弧の自動で補完してくれるプラグインです。
" を打つと "" に自動補完してくれますし、 ( を打つと () に自走補完してくれます。

デモンストレーション

vim-autoclose.gif

joshdick/onedark.vim

説明

Atom の One Dark というカラースキームにインスパイアされて作られた Vim / Neovim のカラースキームです。
目に優しい感じが好きで愛用しています。

w0rp/ale

説明

非同期で syntax チェックを行うプラグインです。
Neovim や Vim8 で非同期な操作が可能になったことで、このプラグインがよく使われるようになったそうです。

airblade/vim-gitgutter

説明

Gitで管理しているファイルを編集する際に、差分を表現する記号を左端に表示してくれるプラグインです。
~が変更があった行、+が追加行、-が削除された行であることを示しています。

それだけではなく、差分がある行にすぐに移動できたり、差分を元に戻すこともできます。

デモンストレーション

vim-gitgutter.gif

設定ファイル

~/.config/nvim/plugins/gitgutter.vim
set signcolumn=yes
set updatetime=1000

nnoremap [gitgutter]<Nop>
nmap <C-h>[gitgutter]
nmap [gitgutter]j<Plug>GitGutterNextHunk
nmap [gitgutter]k<Plug>GitGutterPrevHunk
nmap [gitgutter]u<Plug>GitGutterUndoHunk

tpope/vim-fugitive

説明

vim から git を呼べるようにするラッパープラグインです。
fugitive を使うと git を操作するためにいちいち vim から抜けなくてよくなります。

中でも私は Gblame を愛用しています。
Gblame で開いたウィンドウ内で O を打つと、コミットの内容まで表示してくれます。

デモンストレーション

git-fugitive.gif

設定ファイル

~/.config/nvim/plugins/fugitive.vim
command Gst :Gstatus
command Gdf :Gdiff
command Gbl :Gblame

Shougo/denite.nvim

説明

vim 用の統合ユーザインターフェースを実現してくれるプラグインです。
様々なデータを同じインタフェースで操作することができるようになります。

例えば、ファイルをファイル名で絞り込んで検索できたり、文字を grep して検索することもできます。また検索したファイルを同じインターフェースで開いたりすることもできます。

デモンストレーション

denite.gif

設定ファイル

~/.config/nvim/plugins/denite.vim
nnoremap [denite]<Nop>
nmap <C-d>[denite]
nnoremap <silent>[denite]g:<C-u>Denite grep-buffer-name=search-buffer-denite<CR>
nnoremap <silent>[denite]r:<C-u>Denite -resume -buffer-name=search-buffer-denite<CR>
nnoremap <silent>[denite]p:<C-u>Denite file_rec<CR>call denite#custom#option('default','prompt','>')call denite#custom#option('_','highlight_matched_range','None')call denite#custom#option('_','highlight_matched_char','None')call denite#custom#map('insert',"<Tab>",'<denite:move_to_next_line>')call denite#custom#map('insert',"<S-Tab>",'<denite:move_to_previous_line>')call denite#custom#map('insert',"<C-t>",'<denite:do_action:tabopen>')call denite#custom#map('insert',"<C-v>",'<denite:do_action:vsplit>')call denite#custom#map('normal',"v",'<denite:do_action:vsplit>')call denite#custom#var('grep','command',['pt','--follow','--nogroup','--nocolor','--hidden'])call denite#custom#var('grep','default_opts',[])call denite#custom#var('grep','recursive_opts',[])call denite#custom#var('file_rec','command',['pt','--follow','--nocolor','--nogroup','--hidden','-g',''])

補足

私は高速 grep ツールとして the_platinum_searcherを採用しています。
理由は the_silver_searcherhighwayよりも速いという記事をよく見かけるからです。

osyo-manga/vim-anzu

説明

検索時にマッチした個数とそれが何番目であるかの情報を表示してくれるプラグインです。
今までマッチした個数や何番目であるかが分からず、 n を押しっぱなしで迷子になっていたので、非常に助かってます。

デモンストレーション

anzu.gif

設定ファイル

~/.config/nvim/plugins/anzu.vim
nmap n<Plug>(anzu-n-with-echo)
nmap N <Plug>(anzu-N-with-echo)
nmap * <Plug>(anzu-star)
nmap # <Plug>(anzu-sharp)

Shougo/deoplete.nvim

説明

deoplete は拡張可能で非同期の補完フレームワークを提供してくれる Vim プラグインです。
別途補完ソース用のプラグインを追加することで、補完機能を強化することもできます。

デモンストレーション

deoplete.gif

設定ファイル

~/.config/nvim/plugins/deoplete.vim
letg:deoplete#enable_at_startup =1
inoremap <expr><Tab> pumvisible() ? "\<DOWN>":"\<Tab>"
inoremap <expr><S-Tab> pumvisible() ? "\<UP>":"\<S-Tab>"

CentOS7に最新のgitとvimとtmuxをインストールする

$
0
0

健忘録です。

CentOS7のデフォルトで入っているvimやgitは古かったりするため、最新のものを自分でコンパイルして使います。gitからtarball落としたりタグをチェックあうとしたり一貫性がないのは参考サイトからコピったからです。

環境

$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

ローカルのフォルダの作成と環境変数の設定

$ mkdir-plocal/src
$ vim ~/.bashrc

export LANG=ja_JP.UTF-8

$ source ~/.bashrc

最新のGitのインストール

$ sudo yum update -y$ sudo yum -y remove git
$ sudo yum -yinstall curl-devel expat-devel gettext-devel openssl-devel perl-devel zlib-devel autoconf asciidoc xmlto docbook2X make gcc
$ sudo ln-s /usr/bin/db2x_docbook2texi /usr/bin/docbook2x-texi
$ cd$HOME/local/src
$ wget https://github.com/git/git/archive/v2.18.0.tar.gz
$ tar-zxf v2.18.0.tar.gz
$ cd git-2.18.0
$ make configure
$ ./configure --prefix=/usr/local
$ make all doc info
$ sudo make install install-doc install-html install-info
$ git --version

最新のVimのインストール

$ sudo yum -y remove vim
$ sudo yum install-y git gcc ncurses-devel
$ cd$HOME/local/src
$ git clone https://github.com/vim/vim.git
$ cd vim
$ ./configure --prefix=/usr/local --with-features=huge --enable-multibyte--enable-cscope--enable-fail-if-missing$ make
$ sudo make install$ vim --version

最新のtmuxのインストール

$ sudo yum install automake libevent-devel ncurses-devel xsel
$ cd$HOME/local/src
$ git clone https://github.com/tmux/tmux.git
$ cd tmux
$ git checkout 2.7
$ ./autogen.sh
$ ./configure --prefix=/usr/local
$ make
$ sudo make install$ tmux --version

参考:
https://qiita.com/noraworld/items/8546c44d1ec6d739493f
http://stupiddog.jp/note/archives/1147
https://qiita.com/koara-local/items/7e8391b837fb6f834cb9

Fish ShellでNeovim導入指南

$
0
0

DjangoやPythonを普段書くのでfishの良さとか、Django使う人にNeoVimを活用していく人が増えればいいですねっと。。

Mac上でインストールの方法

shellで

brew tap neovim/neovim

完了したら

brew install --HEAD neovim

~/.config/nvim/ を作成

mkdir ~/.config/nvim/

~/.config/nvim/init.vimが設定ファイルになるので作成。

vim ~/.config/nvim/init.vim

Python3の設定

brew install pyenv
pyenv install python 3.7.0
## Fish Shellの設定
```~/.config/fish/config.fish
# Path to Oh My Fish install.
set -gx OMF_PATH $HOME/.local/share/omf


" (中略)

" ↓ -xがないとエクスポートできないので注意。
set -x XDG_CONFIG_HOME ~/.config/ XDG_CONFIG_HOME
export $XDG_CONFIG_HOME

" 一番最後はこれになっている
source $OMF_PATH/init.fish

プラグインを書き込むファイルの事前作成

~/.config/nvim/ 上に下記ファイルを作成しておく。
・dein.toml
・dein_lazy.toml

ここから設定に入る。

let g:python3_host_prog = expand('~/.pyenv/versions/neovim3/bin/python')を入れることで
python3の設定ができるのでdeoplete.vimなどpython3が必要なものが入る。

~/.config/nvim/init.vim
" 行数setnumbersetnoswapfile" insertモードから抜ける
inoremap <silent> jj <ESC>
inoremap <silent><C-j>j
inoremap <silent> kk <ESC>
inoremap <silent><C-k>k
noremap wb
noremap bw" vを二回で行末まで選択
vnoremap v $h
noremap j gj
noremap k gk
" ft+hで左端まで移動
noremap <S-h> ^
"shift+lで右端まで移動
noremap <S-l> $


filetype indent on" ファイルタイプ別のプラグイン/インデントを有効にするfiletype plugin indent onset expandtab
set hlsearch            " 検索マッチテキストをハイライト
set ignorecase          " 大文字小文字を区別しない
set incsearch           " インクリメンタルサーチ
set matchtime=3         " 対応括弧のハイライト表示を3秒にする
set tabstop=2set scrolloff=5set smartcase           " 検索文字に大文字がある場合は大文字小文字を区別
set smarttab
set showmatch           " 対応する括弧などをハイライト表示する
set shiftwidth=2set softtabstop=4set expandtab
set foldcolumn=4set foldmethod=indent "(インデントで折りたたみを自動作成してくれる)set list                " 不可視文字の可視化
" ESCを二回押すことでハイライトを消す
nmap <silent><Esc><Esc>:nohlsearch<CR>" プラグインがインストールされるディレクトリlets:dein_dir= expand('~/.cache/dein')" dein.vim 本体lets:dein_repo_dir=s:dein_dir.'/repos/github.com/Shougo/dein.vim'" dein.vim がなければ github から落としてくるif&runtimepath !~# '/dein.vim'if!isdirectory(s:dein_repo_dir)
    execute '!git clone https://github.com/Shougo/dein.vim's:dein_repo_direndif
  execute 'set runtimepath^='. fnamemodify(s:dein_repo_dir,':p')endif" 設定開始if dein#load_state(s:dein_dir)call dein#begin(s:dein_dir)" プラグインリストを収めた TOML ファイル" 予め TOML ファイルを用意しておくletg:rc_dir= expand("~/.config/nvim/")lets:toml=g:rc_dir.'/dein.toml'lets:lazy_toml=g:rc_dir.'/dein_lazy.toml'" TOML を読み込み、キャッシュしておくcall dein#load_toml(s:toml,{'lazy':0})call dein#load_toml(s:lazy_toml,{'lazy':1})" 設定終了call dein#end()call dein#save_state()endif" もし、未インストールものものがあったらインストールif dein#check_install()call dein#install()endif

あとはお好みでプラグインを足す。

~/.config/nvim/dein.vim
[[plugins]]
repo ='Shougo/dein.vim'[[plugins]] # toml syntax
repo ='cespare/vim-toml'
on_ft ='toml'[[plugins]] # カラースキーマ
repo ='w0ng/vim-hybrid'
hook_add ='''
  set background=dark'''

[[plugins]] # NerdTree
repo ='scrooloose/nerdtree'[[plugins]] # NerdTree
repo ='jistr/vim-nerdtree-tabs'
hook_add ='map <silent><C-e> <plug>NERDTreeTabsToggle<CR>'[[plugins]] # ステータスバー改造プラグイン
repo ='vim-airline/vim-airline'
hook_add ='''

letg:airline_mode_map={    \'__':'-',    \'n':'N',    \'i':'I',    \'R':'R',    \'c':'C',    \'v':'V',    \'V':'V',    \'':'V',    \'s':'S',    \'S':'S',    \}" パワーラインでかっこよくletg:airline_powerline_fonts=1" カラーテーマ指定してかっこよくletg:airline_theme='badwolf'" タブバーをかっこよくletg:airline#extensions#tabline#enabled =1" 選択行列の表示をカスタム(デフォルトだと長くて横幅を圧迫するので最小限に)letg:airline_section_z= airline#section#create(['windowswap','%3p%% ','linenr',':%3v'])" virtulenvを認識しているか確認用に、現在activateされているvirtualenvを表示(vim-virtualenvの拡張)letg:airline#extensions#virtualenv#enabled =1" gitのHEADから変更した行の+-を非表示(vim-gitgutterの拡張)letg:airline#extensions#hunks#enabled =0" Lintツールによるエラー、警告を表示(ALEの拡張)letg:airline#extensions#ale#enabled =1letg:airline#extensions#ale#error_symbol ='E:'letg:airline#extensions#ale#warning_symbol ='W:''''

[[plugins]] # vimから離れないでGitが使える
repo ='tpope/vim-fugitive'
hook_add ='''
nmap [figitive]<Nop>
map <Leader>g[figitive]
nmap <silent>[figitive]s :<C-u>Gstatus<CR>
nmap <silent>[figitive]d:<C-u>Gdiff<CR>
nmap <silent>[figitive]b:<C-u>Gblame<CR>
nmap <silent>[figitive]l:<C-u>Glog<CR>'''

[[plugins]] # vimから離れないでGitが使える
repo ='airblade/vim-gitgutter'[[plugins]] # liner実行プラグイン
repo ='w0rp/ale'
hook_add ='''
" エラー行に表示するマークletg:ale_sign_error='⨉'letg:ale_sign_warning='⚠'" エラー行にカーソルをあわせた際に表示されるメッセージフォーマットletg:ale_echo_msg_format='[%linter%] %s [%severity%]'" エラー表示の列を常時表示letg:ale_sign_column_always=1" ファイルを開いたときにlint実行letg:ale_lint_on_enter=1" ファイルを保存したときにlint実行letg:ale_lint_on_save=1" 編集中のlintはしないletg:ale_lint_on_text_changed='never'" lint結果をロケーションリストとQuickFixには表示しない" 出てると結構うざいしQuickFixを書き換えられるのは困るletg:ale_set_loclist=0letg:ale_set_quickfix=0letg:ale_open_list=0letg:ale_keep_list_window_open=0" 有効にするlinterletg:ale_linters={\'python':['flake8'],\}" ALE用プレフィックス
nmap [ale]<Nop>
map <C-k>[ale]" エラー行にジャンプ
nmap <silent>[ale]<C-P><Plug>(ale_previous)
nmap <silent>[ale]<C-N><Plug>(ale_next)'''

[[plugins]] # pep8準拠のインデントにしてくれる。
repo ='Vimjas/vim-python-pep8-indent'[[plugins]] # コメントアウトが楽になる
repo ='tomtom/tcomment_vim'
add_hook ='let g:tcommentMapLeader1 = <C-=>'[[plugins]] # 囲える。
repo ='tpope/vim-surround'[[plugins]] # HTMLタグの生成
repo ='mattn/emmet-vim'[[plugins]] # python等の言語の文法チェックを自動的にやってくれる
repo ='scrooloose/syntastic'[[plugins]] # カッコを自動で閉じる
repo ='Townk/vim-autoclose'[[plugins]] # ifとかの終了宣言を自動で挿入してくれる
repo ='tpope/vim-endwise'
add_hook ='''
{'autoload':{'insert':1,}}'''

[[plugins]] # 行末の半角空行を可視化
repo ='bronson/vim-trailing-whitespace'[[plugins]] # ログに色付け
repo ='vim-scripts/AnsiEsc.vim'[[plugins]] # フォントズーム
repo   ='thinca/vim-fontzoom'
on_cmd =['Fontzoom']
on_map =['<Plug>(fontzoom-']gui=1[[plugins]]
repo ='davidhalter/jedi-vim'
on_ft ='python'[[plugins]]
repo ='tell-k/vim-autopep8'
add_hook ='''
{'for':'python'}letg:autopep8_max_line_length=99letg:autopep8_disable_show_diff=1
autocmd FileType python map <buffer><F8>:call Autopep8()<CR>'''

[[plugins]] # css3のシンタックス
repo ='hail2u/vim-css3-syntax'[[plugins]] # html5のシンタックス
repo ='taichouchou2/html5.vim'[[plugins]] # jsシンタックス
repo ='billyvg/tigris.nvim'
on_ft =['javascript','javascript.jsx']
hook_post_update ='''
letg:dein#plugin.build ='./install.sh'letg:tigris#enabled =1letg:tigris#on_the_fly_enabled =1letg:tigris#delay =300'''

[[plugins]]
repo ='Shougo/denite.nvim'[[plugins]]
repo ='Shougo/deoplete.nvim'
add_hook ='let g:deoplete#enable_at_startup = 1'[[plugins]]
repo ='Shougo/neosnippet-snippets'

dein_lazy.toml(こっちは遅延ロードのもの。)

~/.config/nvim/dein_lazy.vim
[[plugins]]
repo ='Shougo/deoplete.nvim'
hook_source ='''
  letg:deoplete#enable_at_startup =1
  inoremap <expr><tab> pumvisible() ? "\<C-n>":        \ neosnippet#expandable_or_jumpable() ?
        \"\<Plug>(neosnippet_expand_or_jump)":"\<tab>"'''
on_i =1[[plugins]]
repo ='Shougo/neosnippet'
hook_source ='''
  imap <C-k><Plug>(neosnippet_expand_or_jump)smap<C-k><Plug>(neosnippet_expand_or_jump)
  xmap <C-k><Plug>(neosnippet_expand_target)if has('conceal')set conceallevel=2 concealcursor=niv
  endif'''
on_i  =1
on_ft =['snippet']
depends =['neosnippet-snippets']# dein_lazy.toml

[[plugins]]
repo ='Shougo/deoplete.nvim'
hook_source ='''
  letg:deoplete#enable_at_startup =1
  inoremap <expr><tab> pumvisible() ? "\<C-n>":        \ neosnippet#expandable_or_jumpable() ?
        \"\<Plug>(neosnippet_expand_or_jump)":"\<tab>"'''
on_i =1[[plugins]]
repo ='Shougo/neosnippet'
hook_source ='''
  imap <C-k><Plug>(neosnippet_expand_or_jump)smap<C-k><Plug>(neosnippet_expand_or_jump)
  xmap <C-k><Plug>(neosnippet_expand_target)if has('conceal')set conceallevel=2 concealcursor=niv
  endif'''
on_i  =1
on_ft =['snippet']
depends =['neosnippet-snippets']

neovimを起動して:echo has('python3')で1が返ってきた場合、python3の設定はできてる。

参考になったサイト

NeovimでモダンなPython環境を構築する

Mac で Neovim を Python の開発環境にする。

[個人的NeoVim環境(Python編) - Diary over Finite Fields]

(https://blog.515hikaru.net/entry/2017/06/25/043035)

[今度こそVimを攻略したい:neovimをインストールして最高のdev UXを手に入れるまで(その1) - Studio Andy]

(http://studio-andy.hatenablog.com/entry/2018/02/04/120259)

[Neovimはじめました & 2016年vimrc大掃除]

(https://muunyblue.github.io/c95d62c68196b2d0c1c1de8c7eeb6d50.html)

Viewing all 5757 articles
Browse latest View live


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