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

AtCoder用にVim Snippetをインスコしたけど動かなかった話

$
0
0

始めに

Visual Studio Codeみたいな補完機能をVimでも使いたいなーとか前々から思ってたら、Snippetという機能がありました。ちょうどAtCoderの精進を始めた頃にSnippetの記事見つけて「お、これいいやん」となったわけです。
で、早速インスコしたわけですが、:NeoBundleInstall叩いてもVimのSnippetが機能しないんですね、何度incと叩いても#include <library>が予測変換で出ない。なぜだ。

解決法

はい、Vimテクニックバイブルこちらの記事に書いてました。NeoBundleinstallでインスコした後に.vimrcに

.vimrc
" Vim起動時にスニペットを利用可能にするletg:neocomplcache_enable_at_startup=1" Plugin key-mappings.  " <C-k>でsnippetの展開
imap <C-k><Plug>(neosnippet_expand_or_jump)smap<C-k><Plug>(neosnippet_expand_or_jump)

を入れないと使えないらしいですね。無事動きました!解散!

参考

Vimのneosnippetで自分用snippetファイルを追加したい
http://gg-hogehoge.hatenablog.com/entry/2014/04/05/230043

Vim テクニックバイブル
https://books.google.co.jp/books?id=QZSWbc83LfQC&pg=PA340&lpg=PA340&dq=vim+snippet+%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84&source=bl&ots=i6Giq0sgVS&sig=ACfU3U1FI3gdMh3QgvkAjFi3HQb0XM60DQ&hl=ja&sa=X&ved=2ahUKEwjJxKyZ7YDoAhUoBKYKHYyBDXI4ChDoATACegQIChAB#v=onepage&q=vim%20snippet%20%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84&f=false

【競プロ】AtCoder早解きテクニック10選 (灰 ~ 緑コーダー向け)
https://qiita.com/xryuseix/items/7e9b4c6f12d001a0c0db


Golangで作成されたVimプラグインの配布方法について調べた

$
0
0

まえがき

Golangのクロスコンパイルは非常に魅力的だと思うのですが、Vimのプラグインとして配布する場合に少し悩んだので、調査した内容を残しておきます。

配布方法1: ユーザーにビルドしてもらうパターン

ユーザーにGoのビルドをしてもらうケース。

基本的にREADME.mdのInstallationの項目に

$ cd /ビルド可能なパス && go get -d&& go build

と書いておけばすむので、用意する側はかなり気楽です。

ユーザーにgo buildしてもらえれば必ずその環境にあったバイナリが出来上がるのでこの点はメリットになりうるのですが、ユーザー側にGoの環境がなければいけないため、もしGoの環境がなければ使う側は少しハードルが高くなるかもしれません。

参考: Go で Vim プラグインを書く - http://haya14busa.com/vim-go-client/

配布方法2: バイナリを配布するパターン

バイナリ配布したいですよね。でも、インストール周りどうしましょう?

ここで個人的に大好きなfzf先生(Golang製)を参考にしてみました。
fzfにはインストールスクリプトがあり、shell scriptでアーキテクチャを判定してバイナリをダウンロードしているようです。

fzfのインストールスクリプトの実際のアーキテクチャを判定している箇所はこちらになります。

# Try to download binary executablearchi=$(uname-sm)binary_available=1
binary_error=""case"$archi"in
  Darwin\ *64)   download fzf-$version-darwin_${binary_arch:-amd64}.tgz  ;;
  Darwin\ *86)   download fzf-$version-darwin_${binary_arch:-386}.tgz    ;;
  Linux\ armv5*) download fzf-$version-linux_${binary_arch:-arm5}.tgz    ;;
  Linux\ armv6*) download fzf-$version-linux_${binary_arch:-arm6}.tgz    ;;
  Linux\ armv7*) download fzf-$version-linux_${binary_arch:-arm7}.tgz    ;;
  Linux\ armv8*) download fzf-$version-linux_${binary_arch:-arm8}.tgz    ;;
  Linux\ aarch64*) download fzf-$version-linux_${binary_arch:-arm8}.tgz  ;;
  Linux\ *64)    download fzf-$version-linux_${binary_arch:-amd64}.tgz   ;;
  Linux\ *86)    download fzf-$version-linux_${binary_arch:-386}.tgz     ;;
  FreeBSD\ *64)  download fzf-$version-freebsd_${binary_arch:-amd64}.tgz ;;
  FreeBSD\ *86)  download fzf-$version-freebsd_${binary_arch:-386}.tgz   ;;
  OpenBSD\ *64)  download fzf-$version-openbsd_${binary_arch:-amd64}.tgz ;;
  OpenBSD\ *86)  download fzf-$version-openbsd_${binary_arch:-386}.tgz   ;;
  CYGWIN*\ *64)  download fzf-$version-windows_${binary_arch:-amd64}.zip ;;
  MINGW*\ *86)   download fzf-$version-windows_${binary_arch:-386}.zip   ;;
  MINGW*\ *64)   download fzf-$version-windows_${binary_arch:-amd64}.zip ;;
  MSYS*\ *86)    download fzf-$version-windows_${binary_arch:-386}.zip   ;;
  MSYS*\ *64)    download fzf-$version-windows_${binary_arch:-amd64}.zip ;;
  Windows*\ *86) download fzf-$version-windows_${binary_arch:-386}.zip   ;;
  Windows*\ *64) download fzf-$version-windows_${binary_arch:-amd64}.zip ;;*)binary_available=0 binary_error=1 ;;esac

https://github.com/junegunn/fzf/blob/373c6d8d55066251dc7af58598de6af4ff4570cf/install#L176-L202

download fzf-$version ~~~となっている箇所はバイナリをダウンロードするスクリプト内の関数を呼び出しています。
こんなイメージで、初回起動時やプラグインマネージャでインストールスクリプトを叩いてあげれば、適切なバイナリを落としてくることができるようになりそうです。

配布方法3: 少し横着な方法

2つ目の方法で少し横着するとすれば、バイナリサイズが小さいうちはVimプラグインリポジトリにアーキテクチャごとのバイナリファイルをpushして、実行時に適切なバイナリが選ばれるようにすることもできるかと思います。
(無駄にファイルをダウンロードすることになるので怒られそうな気もしなくもないですが...)

Vim script側

lets:go_bin_path=v:null

" windowsで極力外部コマンドを実行したくないのでここで判定できればここでif has('win32')lets:go_bin_path='win-386'elseif has('win64')lets:go_bin_path='win-amd64'else" 正しいパスが得られているかチェックはしたほうが良いかもlets:go_bin_path= trim(system('path/to/archi_info.sh'))endififl:go_bin_path !=v:null
    lets:result= system('"path/to/plugin/'.s:go_bin_path.'/goで実行するバイナリファイル"')endif

アーキテクチャ判定スクリプト

archi_info.sh
#!/usr/bin/env bashset-u# Echo binary path executable to stdout.archi=$(uname-sm)case"$archi"in
  Darwin\ *64)echo darwin-amd64  ;;
  Darwin\ *86)echo darwin-386    ;;
  Linux\ armv5*)echo linux-arm5    ;;
  Linux\ armv6*)echo linux-arm6    ;;
  Linux\ armv7*)echo linux-arm7    ;;
  Linux\ armv8*)echo linux-amd64   ;;
  Linux\ aarch64*)echo linux-amd64   ;;
  Linux\ *64)echo linux-amd64   ;;
  Linux\ *86)echo linux-386     ;;
  FreeBSD\ *64)echo freebsd-amd64 ;;
  FreeBSD\ *86)echo freebsd-386   ;;
  OpenBSD\ *64)echo openbsd-amd64 ;;
  OpenBSD\ *86)echo openbsd-386   ;;
  CYGWIN*\ *64)echo windows-amd64 ;;
  MINGW*\ *86)echo windows-386   ;;
  MINGW*\ *64)echo windows-amd64 ;;
  MSYS*\ *86)echo windows-386   ;;
  MSYS*\ *64)echo windows-amd64 ;;
  Windows*\ *86)echo windows-386   ;;
  Windows*\ *64)echo windows-amd64 ;;*);;esac

Vim scriptからアーキテクチャ判定用のshell scriptを実行し、結果をもとにVim scriptから適切なGoのバイナリを実行します。
メリットとしてはVimプラグインのバージョンに対して正しいバイナリが落とされているか気にする必要がないため、用意する側も少し気が楽になりそうです。

まとめ

Golangで作成されたVim プラグインの配布方法の3つをまとめました。

実際に自分もVimプラグインでGoのバイナリを配布する必要があったのですが、現在は3つ目の方法で暫定的に用意しています。

ちなみに、今回作ったプラグインはこちらです。
Qiita: Neovimでpopup-menuを実装できるプラグイン
Github: https://github.com/kamykn/popup-menu.nvim
(もしも、需要が高まれば2つ目の方の方法に移行する、というのも考えられるかと思います。)

色々方法はありましたが、そのプロジェクトに応じて適切な方法を選択できればいいかなと思いました👍

今日のスクリプト: (Vim) Windowサイズと位置の調整

$
0
0

はじめに

 今日はvimscriptとmapを使って,gvimウィンドウを調整する話です.

 Vimを使っていて,一時的に行数をディスプレイいっぱいにしたいことがあります.

 Windowsなら,ウィンドウの上端をダブルクリックで上下いっぱいになります.
また,ショートカット"Win + ←/→/↑/↓ "で画面が左半分/右半分/最大化/最小化.
これはこれで便利です.でも「幅はそのままで行だけ縦に一杯」にはできません.

 が,そもそもVimんちゅは
「文字入力編集中にキーボードから指を離してマウス動かすのはどうなんよ」
という発想の持ち主ですから.

単純なウィンドウの調整くらいvimscriptで,ということでやってみました1

とにかくホームボジションから指が離れることがイヤだという貴兄に.

以下,いわゆるGUIのみの設定です.動作確認はWindowsのみですあしからず.
← あ,行数や行幅はCUIのコンソールやターミナルでも一応可能です.が,純粋なコンソールは基本全画面なのであまり意味がありませんし,ターミナルエミュレータではウィンドウの大きさが対応して変わってくれるかどうかはわかりません2

1.ウィンドウサイズ

Gvimはvimの行数(lines)と桁数(columns)に合わせてウィンドウサイズを変えてくれます.ありがたや.
なので,直前の行数/桁数をメモっておいて,最大行・最大桁に変更する関数を別々に作りました.

a.まず行数です.

SetLines()
""" (Toggle)Set win lines Full <-> previousfunction! SetLines()if!exists("g:oline")letg:oline=&lines
    let&lines=999elselet&lines =g:oline
    unlet g:olineendifendfunction

これはトグルになっていて,最大行← → 直前の行数が繰り返されます.シンプルでしょ?
好きなキーバインドにmapします.スクリプトの細かいことは後述しますね.

map <Leader>j:call SetLines()<cr>
map <C-j>:call SetLines()<cr>
map ,wj :call SetLines()<cr>

b.次に行幅です.

これも同じ要領でトグルにしました.

SetWidth()
"""""" (Toggle)Set win width Full <-> previousfunction! SetWidth()if!exists("g:owide")letg:owide=&columns
    let&columns=999elselet&columns =g:owide
    unlet g:owideendifendfunction
;;
;;;; mapping
;;
map <Leader>l:call SetWidth()<cr>
map <C-@>:call SetWidth()<cr>
map ,wl :call SetWidth()<cr>

 ※おいらのmapのお話:"Ctrl-j"で縦長,"Ctrl-@"で横長にしています.横長はviキーバインドだと"Ctrl-l(エル)"が妥当だと思うんですが.いかんせん"Ctrl-l"は結構使う「再描画」なんで,あんまり変更したくない.
しょうがないんで"l"の隣の";"を,と思ったら,"<C-;>"はGUIでは有効にはならないみたいなんです3(;_;)で,しょうがなくx2の,"Ctrl+@"にしました.

2.ウィンドウのポジション

そしてポジション.これはGUI限定ですね.winopsというguit限定のコマンドを利用しています.

  • 引数をx,yの2つにしているので,自分のディスプレイ環境に合わせてプリセット的に設定できます.
    • プリセットの数値を決めるには,行き先までウィンドウを移動させといて,":winpos"です.
  • これもトグル動作なので,変なポジションを指定しても再実行で戻せます.えっへん.
SetWinpos(posx,posy)
"""""" (Toggle)Set win Position to x,y <-> previousfunction! SetWinpos(posx, posy)if!exists("g:oposx")letg:oposx= getwinposx()letg:oposy= getwinposy()
    echo "winpos "a:posx." ".a:posy
    execute "winpos "a:posx." ".a:posyelse
    echo "winpos "g:oposx."\  ".g:oposy
    execute "winpos "g:oposx." ".g:oposy
    unlet g:oposxg:oposyendifendfunction"""" mapping: set winpos to Left and Top
map <Leader>1:call SetWinpos(20,20)<cr>
map ,w1 :call SetWinpos(20,20)<cr>""          set winpos to 2nd Display
map <Leader>w:call SetWinpos(-1700,-2400)<cr>
map ,ww :call SetWinpos(-1700,-2400)<cr>

どのポジションがいいかは本当にお好みで.mapでいくつでも設定できます.
※おいらの2ndディスプレイが縦長でメインディスプレイの左側なので,数値が大きな負になってます.

3.vimscript: 分かったこと/分かりにくかったこと

vimscriptの日本語ヘルプは「Vim本家のhelp」にまとめてあります.が,これだけではちゃんと作れなのがプログラムです.
いろいろと困ったことにぶつかり,その度にネットの神様のお告げを参考にしました.
意外とまとまっていない,細かいけど結構困ったことをまとめてみました.
Vimんちゅなら当たり前,なレベルのこともあるでしょうが,何の参考になれば.

  • 関数は"function! 関数名()"で始め,"endfunction"で終わる.C言語みたいに"{}"で挟まない.Pascalっぽい.
  • ifも同様で,"if 条件式"の次から,"endif"までは改行または";"で区切れば何行でもそのブロックになる.
  • exists関数の引数は""で囲む:""がないとエラーに.(ex) if !exists("g:oposx")
  • 変数への代入は"let"で.
  • スクリプトのなかでvimのオプション(上の例だとlinesとかcolumns)を設定するのは let &XXXX = hoge
    • これをset XXXX=hogeとするのは可能だが,変数がうまく展開できずエラーに
  • 関数定義について書いた記事にはよく"command ! -nargs=なんちゃら~"というのがあるが今回は不要
    • これはコロンコマンドとして実行したい場合.キーバインドで呼び出すなら不要.← "command!"の役割がわかってなかった……
  • 一旦保存しておくのは,(関数内の)ローカル変数ではだめで,グローバル変数でないと.これは変数の頭に"g:"をつける(ローカル変数は"s:").ただし,vimのコロンコマンドで参照する際には"g:"は不要.

    • スクリプト: let g:oline = &lines  → g:olineに格納されたオプションlinesの値をvimで確かめるには
    • vim: :echo oline
  • 変数の接頭語その2: 関数に指定された引数は,関数内では"a:"をつけて参照される.

    • (ex) function! SetWinpos(posx, posy)の引数posx,posyを使うには,"a:"をつけて,"a:posx""a:posy"

困ったのは「winposというコマンドに関数引数を渡して実行させる」こと.簡単なようですが……

  • winposというのはオプションではなくコロンコマンド.しかも空白で別れた引数が2つ.スクリプトの中では"execute"を使って実行する.← コロンコマンドを直実行も可能だが,変数を展開して引数として渡せない("let &XXX"と同じ)
  • 2つの変数を「空白でつなぐ」:これは"."と" "(ダブルクォートで挟んだ空白)でつなぎ合わせる4というルール.

    • (ex) winposに a:posx,a:posyを空白付きで渡して実行: execute "winpos " . a:posx . " " . a:posy

こういう「単純なルール記述の組み合わせは意外と面倒」だという,いい例ですな.


  1. はじめはmap一行,つまりコロンコマンドの範囲だったんですが,vimscriptなら場合分けできるじゃん,となって,簡単なスクリプトを書いてしまうことに.調べながらなんで結構手間暇かかりましたが…… 

  2. xterm互換であればいけるかも? 

  3. 参照 → Is it possible to map to : in vim? - Stack Overflow 

  4. 参照 → vimスクリプトで文字列を扱う - neovim/vim入門*  

vimで高速コーディングする方法

$
0
0

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

Vimといえば高速でコーディングできるという印象を持っている方が多いのではないでしょうか?
今日は、Postfix Code Completion という手法をつかって早くコーディングする方法紹介します。

この方法を使えば次のgifのように、さくっとJSONを返すHTTPサーバーを立てられます。

sonictemplate-vim-sample.gif

Postfix Code Completionとは

後置補完という補完手法です。
例えば、(a == b)に対してifを使いたい場合は(a == b).ifと入力して展開するとif (a == b) { }というふうに補完してくれます。

後ろのコードifが前のコード(a == b)に作用するという考え方です。
これを積極的に使用していくとより高速にコーディングできるようになります。

僕の場合は、割と後置補完だけではなくスニペットのように使っています。

VimでPostfix Code Completionを使う方法

Vimではsonictemplate.vimというプラグインがサポートしています。
デフォルトではPostfixのパターンファイルが用意されています。<C-y><C-b>でパターンを展開できます。
もちろん自分でパターンファイルを用意することもできます。

まず、自前のテンプレートディレクトリを設定します。僕の場合は~/.vim/sonictemplateしています。

letg:sonictemplate_vim_template_dir= expand('~/.vim/sonictemplate')

次に、言語のディレクトリを作成します。ディレクトリ名はファイルタイプ名と同じにする必要があります。
jsならjavascriptというディレクトリを作成します。本記事ではGo言語のテンプレートを作っていきます。

$ mkdir ~/.vim/sonictemplate/go

次に、Postfixのパターンファイルを作ります。こちらもファイル名はファイルタイプと同じです。

$ vim ~/.vim/sonictemplate/go.stpl

このgo.stplにパターンを追記していきます。

パターンの記述方法

次のように、1行目にパターンを2行目以降に展開後のコードを記述します。2行目以降はタブが必要です。

\(\S\+\)\.var$
    var {{$1}} = {{_cursor_}}

複数のパターンは空白行で区切られています。

\(\S\+\)\.var$
    var {{$1}} = {{_cursor_}}

\(\S\+\)\.iferr$
    if {{$1}} != nil {
        return {{$1}}
    }
    {{_cursor_}}

パターンは正規表現を使用する事ができます。そして展開したコードでは{{}}で囲ったプラグイン独自の構文を使用できます。
上記の例では{{$1}}は後方参照(\(\S\+\)の部分)しています。{{_cursor_}}は展開後カーソルの位置を指定しています。
{{}}を使った構文は他にもあります。ヘルプを参照してください。

パターンの例

ぼくが使っているパターンをいくつか紹介します。

dbを開く

  • パターン
db.open\.\(".*"\)\.\(".*"\)$
    db, err := sql.Open({{$1}}, {{$2}})
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    {{_cursor_}}
  • コード
// 展開前db.open."sqlite3"."test.db"// 展開後db,err:=sql.Open("sqlite3","test.db")iferr!=nil{log.Fatal(err)}deferdb.Close()

クエリを発行

  • パターン
db\.query\.\(.*\)$
    rows, err := db.Query({{$1}})
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    {{_cursor_}}
  • コード
// 展開前db.query."select * from todos"// 展開後rows,err:=db.Query("select * from todos")iferr!=nil{log.Fatal(err)}deferrows.Close()

JSONのエンコード

json\.encode\.\(\S\+\)\.\(\S\+\)$
    if err := json.NewEncoder({{$1}}).Encode({{$2}}); err != nil {
        {{_cursor_}}
    }
// 展開前json.encode.writer.&gorilla// 展開後iferr:=json.NewEncoder(writer).Encode(&gorilla);err!=nil{}

JSONのデコード

  • パターン
json\.decode\.\(\S\+\)\.\(\S\+\)$
    if err := json.NewDecoder({{$1}}).Decode({{$2}}); err != nil {
        {{_cursor_}}
    }
  • コード
// 展開前json.decode.reader.&gorilla// 展開後iferr:=json.NewDecoder(reader).Decode(&gorilla);err!=nil{}

append

  • パターン
\(\S\+\)\.append\.\(\S\+\)$
    {{$1}} = append({{$1}}, {{$2}})
    {{_cursor_}}
  • コード
// 展開前gorillas.append.gorilla// 展開後gorillas=append(gorillas,gorilla)

HTTPサーバー

  • パターン
http\.server\.\(\S\+\)$
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        {{_cursor_}}
    })
    log.Println("start http server :{{$1}}")
    log.Fatal(http.ListenAndServe(":{{$1}}", nil))
  • コード
// 展開前http.server.8080// 展開後http.HandleFunc("/",func(whttp.ResponseWriter,r*http.Request){})log.Println("start http server :8080")log.Fatal(http.ListenAndServe(":8080",nil))

main

  • パターン
^main$
    package main

    func main() {
        {{_cursor_}}
    }
  • コード
// 展開前main// 展開後packagemainfuncmain(){}

最後に

いかがですか?
この記事を見て少しでも早くコーディングできるようになったら嬉しいです。

では良いコーディングライフを〜

vimの便利なコマンド

$
0
0



vimについて学習したので、復習を兼ねてまとめます。

vimとは

Unix系のエディタ。通常のエディタと違い、いくつかのモードがある。
● ノーマルモード:カーソルの移動やテキストの削除、コピー、ペーストなどの簡単な指示を行う。
● 入力モード:実際にテキストを入力する。(『i』を打つとなり、『ESCキー』を打つと(ノーマルモードに戻る。)
● コマンドモード」:ファイルを開いたり、検索や置換などの様々な指示を行う。(『:』を打つとなり、『ESCキー』を押すとノーマルモードに戻る。)
● ビジュアルモード」:テキストを選択するだけのモード。(『v』を打つとなり、『ESCキー』でノーマルモードに戻る。)

ファイルの保存、読み込み

キー動作
:q終了
:w保存
:wq保存して終了
:w 新しいファイル名名前をつけて保存
:q!変更点を無視して強制的に終了
:e 開きたいファイル名他のファイルを開く

移動

キー動作
ggファイル先頭に行く
Gファイル末尾に行く
control+f一画面下に移動
control+b一画面上に移動
w単語単位で移動
b単語単位で戻る
^行頭へ移動
$行末へ移動

範囲選択

キー動作
v文字単位で選択
V行単位で選択
control+v矩形選択
gg+V+Gテキスト全体選択

カット、コピー、貼り付け

キー動作
x一文字単位で削除
dd行単位で削除
消したい行数の値dd入力した値の行数分削除
pカットしたものを貼り付ける
yyコピー

検索

キー動作
/検索語検索語のところへ移動
(検索語が複数ある場合)n下方向に検索
検索語が複数ある場合)N上方向に検索
*カーソルがある位置の単語を下方向に検索
#カーソルがある位置の単語を上方向に検索

置換

キー動作
:s/元の単語/変更後の単語/一文字だけ変更(カーソルがある行に有効)
:s/元の文字/変更後の文字/g複数の文字を変更(カーソルがある行に有効)
:%s/元の文字/変更後の文字/g複数の文字を変更(ファイル全体に有効)
:%s/元の文字/変更後の文字/gc複数の文字を変更(ファイル全体に有効)の前に確認コメントが表示される

操作の取り消し

キー動作
u行った操作を取り消す(何度でも戻れる)
control+ruの動作のやり直し

ウィンドウの分割

キー動作
:spウィンドウを縦方向に分割
:vsウィンドウを横方向に分割
control+w+w次のウィンドウに移動
control+w+p前のウィンドウに移動
:closeウィンドウを閉じる

タブを使う

キー動作
:tabnew新しいタブを開く
:tabe 開きたいタブ名指定したタブを開く
:gtタブの移動
:tabcloseタブを閉じる
(vimを起動時)vim -pタブを全て開く
:tabdo %s/元の単語/変更後の単語/g開いている全てのタグにおいて置換をする

直前の操作を繰り返す

キー動作
.直前の操作を繰り返す

インデント

キー動作
=カーソルのある行をインデントする
全選択後(gg+V+G)=全ての行をインデントする

補完機能

キー動作
control+n関数をもう一回使う

コマンドモードで使える便利な設定

キー動作
:set number行番号を表示
:set nonaumber行番号を消す
:syntax onコードの色分け
:syntax off色を消す
:set tabstop=規定したい文字数タブの文字数を規定する
:set ignorecase大文字小文字の区別をせずに検索
:set noignorecase元に戻る

【Vim】コメントを入力した時、カーソルが勝手に文頭に移動してしまう

$
0
0

問題

コメントを入力しようとしたら、勝手にカーソルが移動してインデントが消えてしまう問題です。

自分の場合はRubyファイルでしたが、

controller/items_controller.rb
if@row.saveredirect_totitle_path(title_id),notice: "ITEM SAVED"elseredirect_totitle_path(title_id),notice: "SAVE FAILED"end

こういう場合、if文内にそれぞれ# 保存成功# 保存失敗を入れたくても、#を入力した瞬間にカーソルが移動してしまい、

controller/items_controller.rb
if@row.save# 保存成功redirect_totitle_path(title_id),notice: "ITEM SAVED"elseredirect_totitle_path(title_id),notice: "SAVE FAILED"end

とズレてしまいました。
ああああああああああ!!!!!!!!!!!!!!!

原因

Vimの設定でfiletype plugin indent offになっていたからでした。

確認方法

Vimファイルを開いて
:filetype
で確認出来ます。

filetype detection:ON plugin:ON indent:ON

この3つすべてがONが良いみたいですね。

自分の場合は、3つ目のindentがOFFになっていました。

設定方法

読み込んでいる.vimrcで、(最後あたりに書く?)

.vimrc
filetype plugin indent on

これで解決しました。

雑記

最初はvim74/syntax/ruby.vimのあたりに原因があると思って、コメントを判別する行を消したりしてみました。
ただこのシンタックスは「このファイル形式だったら、こういうコードはこういう意味ですよ」という判別をしてくれてるファイルみたいですね。

問題はそのシンタックスの定義にもちゃんとインデント幅があり、それをちゃんと認識してなかったという事でした。

「vim ruby indent コメント」とかで検索しても、「コメント行の次の行までコメントアウトされてしまう!」問題ばかりがヒットして地味に見つけるのが大変だったのでまとめておきます。

以上です

私的VSCodeでのVim設定

$
0
0

長い間VimでオレオレKeybindingを使い続けているせいで
デフォルトのVSCode+Vim設定が使いにくい...ので備忘として投稿しました。

多分Vimmerからしても微妙な使い方になるのでオススメはしないので、
複数行移動のサンプル程度で

Vimプラグインの導入

何はともあれVSCodeにVimプラグインを入れることから
https://marketplace.visualstudio.com/items?itemName=vscodevim.vim

VSCodeのKeyBinding改造

VSCodeのキーバインディング設定
Ctrl+Shift+Pでコマンドパレットを表示し以下のいずれかで編集
操作性が変わるだけで結果は変わらない

  • Open Keyboard ShortCuts: リストから編集
  • Open Keyboard ShortCuts(JSON): keybindings.jsonを直接編集

Ctrl系をもとに戻す or 上書き

Ctrl+Fは普通の検索に使いたい

[Ctrl+F]をvimを上書きされてしまっているのでこれを普通の検索に戻す。

keybindings.json
{"key":"ctrl+f","command":"-extension.vim_ctrl+f","when":"editorTextFocus && vim.active && vim.use<C-f> && !inDebugRepl && vim.mode != 'Insert'"}

or Keyboard Shortcuts からextension.vim_ctrl+fの項目を削除する

Ctrl+JをEscに使いたい

keybindings.json
{"key":"ctrl+j","command":"extension.vim_escape","when":"editorTextFocus && vim.active && !inDebugRepl"},{"key":"ctrl+j","command":"-extension.vim_ctrl+j","when":"editorTextFocus && vim.active && vim.use<C-j> && !inDebugRepl"}

Ctrl+Cをコピーに使いたい

keybindings.json
{"key":"ctrl+c","command":"-extension.vim_ctrl+c","when":"editorTextFocus && vim.active && vim.overrideCtrlC && vim.use<C-c> && !inDebugRepl"}

Shift + hjklでサクサク移動したい

Shift+[hl]で前後のワードに移動したい

※下記だとvisualモード自反映されない問題が有るので良案あれば...

keybindings.json
{"key":"shift+h","command":"cursorWordAccessibilityLeft","when":"textInputFocus && vim.mode != 'Insert'"},{"key":"shift+l","command":"cursorWordAccessibilityRight","when":"textInputFocus && vim.mode != 'Insert'"}

Shift+[jk]で複数行移動したい

複数コマンド実行は Plugin: multi-commandを導入していないとできない気がするので導入

コマンドパレットからOpen Settings(JSON)とかでsettings.jsonを開き複数コマンド実行するコマンドを定義する

settings.json
"multiCommand.commands":[{"command":"multiCommand.down4TextLines","sequence":["extension.vim_down","extension.vim_down","extension.vim_down","extension.vim_down",]},{"command":"multiCommand.down4ListLines","sequence":["list.focusDown","list.focusDown","list.focusDown","list.focusDown"]},{"command":"multiCommand.up4TextLines","sequence":["extension.vim_up","extension.vim_up","extension.vim_up","extension.vim_up",]},{"command":"multiCommand.up4ListLines","sequence":["list.focusUp","list.focusUp","list.focusUp","list.focusUp"]},],

keybindings.jsonからは複数コマンド定義を呼び出す形で記載する

keybindings.json
{"key":"shift+j","command":"multiCommand.down4TextLines","when":"textInputFocus && vim.mode != 'Insert'"},{"key":"shift+j","command":"multiCommand.down4ListLines","when":"listFocus"},{"key":"shift+k","command":"multiCommand.up4TextLines","when":"textInputFocus && vim.mode != 'Insert'"},{"key":"shift+k","command":"multiCommand.up4ListLines","when":"listFocus"},

その他

ココとか参考に
クリップボード,ハイライトサーチ,折りたたみ通過とか設定して終わり

settings.json
"vim.useSystemClipboard":true,"vim.hlsearch":true,"vim.foldfix":true,

設定まとめ

plugin

https://marketplace.visualstudio.com/items?itemName=vscodevim.vim
https://marketplace.visualstudio.com/items?itemName=ryuta46.multi-command

confings

settings.json

settings.json
{
"window.zoomLevel": 1,
"vim.useSystemClipboard": true,
"vim.hlsearch": true,
"vim.foldfix": true,
"multiCommand.commands": [
{
"command": "multiCommand.down4TextLines",
"sequence": [
"extension.vim_down",
"extension.vim_down",
"extension.vim_down",
"extension.vim_down",
]
},
{
"command": "multiCommand.down4ListLines",
"sequence": [
"list.focusDown",
"list.focusDown",
"list.focusDown",
"list.focusDown"
]
},
{
"command": "multiCommand.up4TextLines",
"sequence": [
"extension.vim_up",
"extension.vim_up",
"extension.vim_up",
"extension.vim_up",
]
},
{
"command": "multiCommand.up4ListLines",
"sequence": [
"list.focusUp",
"list.focusUp",
"list.focusUp",
"list.focusUp"
]
},
],
}

keybindings.json
keybindings.json
//既定値を上書きするには、このファイル内にキーバインドを挿入します[{"key":"ctrl+f","command":"-extension.vim_ctrl+f","when":"editorTextFocus && vim.active && vim.use<C-f> && !inDebugRepl && vim.mode != 'Insert'"},{"key":"ctrl+j","command":"extension.vim_escape","when":"editorTextFocus && vim.active && !inDebugRepl"},{"key":"ctrl+j","command":"-extension.vim_ctrl+j","when":"editorTextFocus && vim.active && vim.use<C-j> && !inDebugRepl"},{"key":"ctrl+c","command":"-extension.vim_ctrl+c","when":"editorTextFocus && vim.active && vim.overrideCtrlC && vim.use<C-c> && !inDebugRepl"},{"key":"shift+h","command":"cursorWordAccessibilityLeft","when":"textInputFocus && vim.mode != 'Insert'"},{"key":"shift+l","command":"cursorWordAccessibilityRight","when":"textInputFocus && vim.mode != 'Insert'"},{"key":"shift+j","command":"multiCommand.down4TextLines","when":"textInputFocus && vim.mode != 'Insert'"},{"key":"shift+j","command":"multiCommand.down4ListLines","when":"listFocus"},{"key":"shift+k","command":"multiCommand.up4TextLines","when":"textInputFocus && vim.mode != 'Insert'"},{"key":"shift+k","command":"multiCommand.up4ListLines","when":"listFocus"},]

Vimの定義元ジャンプをctagsからany-jump.vimに乗り換えた

$
0
0

概要

長らくvimの定義元ジャンプにはctagsを使っていましたが、any-jumpが良さげだったので乗り換えました

必要環境

  • vim 8.2または neovim 0.4+
  • ripgrep 11.0.0+または ag

使い方

ジャンプしたい文字の上で :AnyJumpを実行するだけ。
スクリーンショット 2020-03-15 15.03.58.png

実行するとpopupウィンドウが表示されて、定義されている場所と使用されている場所の一覧が表示されるので、ジャンプしたい場所を選択。

GitHubリポジトリ

pechorin/any-jump.vim


NvimでFlutterの開発環境を整える

$
0
0

目的

Flutterの開発環境といえばAndroid Studioなどが主流な感じがする。しかし、これらの開発環境は非常に重い。この記事はNeovim や Vimを使うことで開発環境を多少でも軽くすることを目的とする。

導入した環境

OS : Ubuntu 18.04 LTS
カーネル : 5.3.0-40-generic
Neovim : 0.3.8

準備

プラグイン管理ツールを用意

使用するプラグイン

dart-vim-plugin
vim-flutter

導入方法

deinでの導入方法はdein.tomlに当該プラグインを記述するだけ。ただし、起動時にdein.tomlを読み込むようにする必要がある。再起動すれば自動でインストールが始まる。

dein.toml
[[plugins]]repo='dart-lang/dart-vim-plugin'[[plugins]]repo='thosakwe/vim-flutter'

.vimrcもしくは.nvimrcに直接書き込むことも可能。deinのREADMEに導入方法は書いてあるので、先程貼ったリンクを参照。

これで、DartとFlutterの環境導入はおわり。dart-vim-pluginではコード解析や補完などを行ってくれる。使い方はREADMEを参照。vim-flutterではエミュレータの起動、デバックなどをvim内でできるようにしてくれる。こちらも使い方はREADMEを参照してほしい。

おわりに

vimやneovimでプラグイン管理を始めれば、新しい言語を学ぶ際も環境導入を楽にすすめることができるので、ぜひ使うことをおすすめする。

Raspberry Pi のvi編集モードで入力ができない事象の解消

$
0
0

Raspberry Pi において、viコマンドでファイル編集しようとしても、編集モードでキーボードで意図した入力ができない事象を解消します。

「vi互換モード」で動いている時に発生する事象のようなので互換モードを無効にします。

以下を参考にしています。
Vimで方向キーを押すとABCDが出る問題を直す
http://marupeke296.com/IKDADV_PI_ABCDProb.html

環境

macOS High Sierra 10.13.6
Raspberry Pi Zero WH(Rasbian)

設定ファイルの作成

macで以下のファイルを作成し、Raspberry Pi にSCPでコピーします。

$ vi .vimrc
$ cat .vimrc

set nocompatible

$ scp .vimrc pi@192.168.10.110:/home/pi/
$ ssh pi@192.168.10.110
$ ls -l .vimrc

-rw-r--r-- 1 pi pi 17 Mar 15 14:39 .vimrc

$ cat .vimrc

set nocompatible

MacVimからNeovim+iTerm2+tmuxに移行した経緯と困ったところ

$
0
0

開発環境をいじってみて、タイトル通りの環境に落ち着きました。
その経緯を書いていきます。

もともとの開発環境

  • MacVim
  • tmux
  • Terminal

言語は主にPHPを使っていて、場合によってPython, Ruby, Goなど。

Neovimの導入

以前からちょいちょい試していたのですが、GUI環境で良いのがなかったのがネックになり完全導入はできていませんでした。

Vimを使っていて特に困っていなかったのですが
今回はどうしてもDeniteでfloting windowを使いたかったので、思い切ってTerminalでNeovimを使うことにしました。

homebrewを使ってインストール

$ brew install neovim --HEAD$ nvim -v# -> NVIM v0.5.0-cb8b942

tmux

もともと使用していたので、特に変わりなく使っています。

.bash_profile
alias tmux-new='tmux new  -c ~/develop -s develop -n _vim nvim \;\
                     neww -c ~/develop -n src \;\
                     neww -c ~/develop -n docker docker exec -it hogehoge \;\
                     neww -c ~/develop -n fugafuga \;\
                '

こんな感じで、aliasを作って環境を一気に立ち上げるようにしています。
0とやるとNeovimが立ち上がるので便利です。

iTerm2

もともとTerminalを使ってNeovim+tmuxで開発をしていたのですが、
なんだかカーソルの動きがカクつくというかスムーズに動かないのが気になってきました。
悩んだ結果、iTerm2を試してみることに。

そうしたら、カーソルもスムーズに動くようになりました!
Terminalを置き換えただけで特に設定はなし。カラーテーマを「Solarized dark」に変えただけ。

ちょっと困ったところ

ファイルの変更通知がでない

MacVimでは別アプリなどでファイルが更新されたときに警告が出ます(:help W11)。
Terminalで使っているとこれが出ないようでした。下記の設定を入れることで表示されるようになりました。

.tmux.conf
set -g focus-events on
.vimrc
set noautoread
autocmd FocusGained * checktime

:terminalの設定が動かない

vimでは下記のような設定をしていました

.vimrc
command! T lcd %:p:h|bo terminal ++close bash --login

しかし、下記の問題が発生しました。

  • ++closeがないという警告がでる
  • インサートモードでスタートしない

下記のように設定を変えることで解決しました。

.vimrc
command! T lcd %:p:h|bo split term://bash --login | normal i

ただ、いままではexitでウインドウが閉じていたのですが、nvimでは閉じてくれないようでした。
これはまだ解決できていません。

まとめ

今のところ快適に使えています。
現状、iTerm2の利点は感じていないので、どうにかしてTerminalに戻れないかなと頑張ってます。

Vimで書いたスクリプトをファイル保存せずに実行する

$
0
0

Vim初心者向け.

Vimで書いたスクリプトを, ファイルに保存せずに実行したい場面がたまにあるのではと思います. ちょっとしたコードを試しに動かしてみたいときなど.

それを実現するためのプラグインもありますが, たいていのインタプリタなら――たとえばbashなら, :w !bashで行えます.

Pythonのスクリプトなら, :w !python:w !pipenv run python.
nodejsでもOK. :w !node.

実行するスクリプトによっては, カレントディレクトリを意識しないといけないケースもあります.
カレントディレクトリの確認は :pwd, 変更は :lcd path/to or :cd path/to (lcdとcdは, 影響範囲が現在のバッファだけか全てかの違いがある).

viを終了

asyncomplete で知的に英語の入力補完ができるプラグインを作った

$
0
0

以前 VSCode で英語の入力補完をするプラグインを作ったので,
今度は Vim で動く英語入力補完プラグイン asyncomplete-nextword.vimを作りました。

screenshot.gif

https://github.com/high-moctane/asyncomplete-nextword.vim

このプラグインは正しいスペルを表示するだけでなく,バッファの内容に適した単語を 頻出順で提案するので便利です。

asyncomplete.vimを使うことで簡単に入力補完プラグインを作成できると分かりました。
asyncomplete.vim を用いた入力補完プラグイン作成の情報が少なかったので,忘れないうちに書き留めておきたいと思います。

入力補完プラグインで実装する・使う関数

/<project_root>/autoload/asyncomplete/sources/<plugin_name>.vim

にて以下の関数を定義します。

  • asyncomplete#sources#<plugin_name>#get_source_options(opt)
  • asyncomplete#sources#<plugin_name>#completor(opt, ctx)

また,以下の関数を呼び出します。

  • asyncomplete#complete(name, ctx, startcol, items, ...)
  • asyncomplete#log(...)

これから 4 つの関数について解説していきます。
asyncomplete.vim のソースコードを全部は読んでいないので間違っていたらごめんなさい。

get_source_options(opt)

補完プラグイン固有の設定を受け取る関数です。

この関数は asyncomplete.vim を利用したプラグインの README.md に書いてあるとおり, ~/.vimrcで呼ばれます。
a:optはディクショナリ型で,補完プラグインの名前や,有効になる filetype などが格納されています。

asyncomplete-nextword.vim では nextwordコマンドに渡す引数のリストを受け取るために利用しています。

completor(opt, ctx)

buffer の情報 a:ctxをもとに,補完候補を返す関数です。
おそらく a:optget_source_options()で返されたものが渡されていると思います。

a:ctxの中身は asyncomplete#context()
で定義されています。

  • "bufnr"バッファの番号
  • "curpos"getcurpos()の結果
  • "changedtick"バッファの総変更回数
  • "lnum"行数(1始まり!)
  • "col"何文字目か
  • "filetipe"
  • "filepath"
  • "typed"その行の先頭からカーソルまでの文字列

これらの情報をもとに,asyncomplete#complete()に補完の候補を渡します。

asyncomplete#complete(name, ctx, startcol, items, ...)

この関数に補完結果を渡します。

nameには get_source_options(opt)a:opt['name']を, ctxには completor(opt, ctx)で得た a:ctxを渡しましょう。
よくわかっていないですが,これらの情報で補完結果が有効かどうか判断しているようです。

startcolは補完が始まった文字の位置です。この値が不正だと asyncomplete の補完入力がずれます。

itemsに補完結果を返します。itemsはリスト型で,ディクショナリ型のアイテムを持ちます。
各アイテムはキーに "word""kind"を持ちます。"word"が補完結果の文字列で,"kind"が補完結果の右に表示される説明文です。

asyncomplete#log(...)

この関数はロガーです。
g:asyncomplete_log_fileにログを吐きます。便利です。

おわりに

Vim script でまとまったものを書くのは初めてでしたが,asyncomplete.vim のソースコードが読みやすく,どうにかなりました。
LanguageSeverProtocol 以外の方法で入力補完を行う必要があるケースもあると思うので,この記事がお役に立てれば幸いです(`・ω・´)

MACのvimでコピーができるようになるまで

$
0
0

最初に

mac標準のvimで、文章を書こうとしたら、なぜかyyでコピーもできなかった。。。
ググって、下記を見つけた。
macのvimでクリップボードにコピーを使いたい!!

なるほど、homebrewでインストールすればいいのかと思い、とりあえず実行。

これだけやれば、vimでコピーはすぐ使えるようになった!

brew update
brew install vim 

以上!コピーできるようになった!良かった!

補足

情報元の方が書いた方法だと、よく考えたらアップデート対応が面倒だな〜と思い、他に方法がないか探していた。
で、下記を見つけた。
OS X に Vim を Homebrew でインストールして vi で起動する - Qiita
オプション入れたらいけるのかーと思い、トライしてみた。

brew install vim --with-override-system-vi

でも、このコマンドをやってみると、下記のエラーが出ていた。

Error: invalid option: --with-override-system-vi

なんでだろーと思い、調べてたら、下記を発見。
brew install got Invalid option error #817

まあ、みんな気になっていたみたいだけど、
結局のところ、オプションなしで入れてみて、同じような結果になることがわかった。
オプションがデフォルトになって、インストールが簡単になったのかな。
上記のコマンドの結果、最終的なvimとしては、下記のようにリンクで参照されていた。OK。

$ which vim
/usr/local/bin/vim
$ ls -la /usr/local/bin/vim 
lrwxr-xr-x  1 user  admin  30  3 18 20:19 /usr/local/bin/vim -> ../Cellar/vim/8.2.0350/bin/vim

環境

$ brew --version
Homebrew 2.2.10
Homebrew/homebrew-core (git revision d7e71; last commit 2020-03-17)
Homebrew/homebrew-cask (git revision 382de; last commit 2020-03-18)

環境変数の設定&確認方法

$
0
0

今回は、環境変数の設定とその確認方法について書いていきます!
注目すべきは、設定や確認を行う”ディレクトリ”です

環境変数を設定するときは、必ず”ホームディレクトリ”で行います

macOS Catalinaの場合

% vim ~/.zshrc

 
macOS Mojaveの場合

$ vim ~/.bashrc`

次に、環境変数にちゃんと値が渡っているか確かめるためにrails cコマンドを打ちます
この時のディレクトリは先ほどと違い、"カレントディレクトリ"で行います

それぞれ、コマンドを実行するディレクトリに注意して設定・確認していきましょう!
 

Xcode11.3でVimを使う方法

$
0
0

はじめに

XCodeでVimを入れる時にスムーズにできなかったので備忘録がてら手順を書きます。
世の中素晴らしいもので、XVim2なるものが存在します。
ありがたき幸せ。。。

環境

  • macOS Mojave
  • Xcode 11.3.1(11C504)

手順

  1. KeychainAccessで自己証明書を作成する(参考)。
  2. XVim2README.mdに従ってcloneしてmakeする。

    ....
    ....
    Touch /Users/xxxx/XVim2/build/Release/XVim2.xcplugin (in target 'XVim2' from project 'XVim2')
    cd /Users/xxxx/XVim2
    /usr/bin/touch -c /Users/xxxx/XVim2/build/Release/XVim2.xcplugin
    
    ** BUILD SUCCEEDED **
    
  3. 快適にするために~/.xvimrcを作成する。

    .xvimrc
    # ...
    inoremap jk <Esc>
    inoremap jj <Esc>
    
  4. XCodeを起動して確認してみよう!

[python] BeautifulSoupとExcelの入出力を組み合わせてハンドル名(@123456のようなもの)からtwitterのアカウント名を集める話

$
0
0

pythonでTwitterのアカウント名をスクレイピングしたい!!

上記のようなことを思ったために、少しだけそういうコードを作成してみたので共有しようと思います。
(今回はハンドル名がわかっている前提)

スクレイピングにおける注意点

スクレイピングに関しては基本的に色々と規約を守らないといけないので
こちらをお読みください

相手のサーバー負荷に繋がることもあるので実行の際はくれぐれも慎重にお願いいたします。

情報取得の流れ

エクセルの一列目にハンドル名を並べる

エクセルから情報を取得する

googleで検索する

そこから情報(アカウント名)を抜き取る

エクセルの三列目にアカウント名を並べる

このような流れでやっていこうと思います。

必要なモジュールをインストールする

使っていくモジュールは4つ
1. Urlを取得するrequests
2. エクセルファイルの操作のopenpyxl
3. サイトのhtmlから抽出するbs4
4. サーバー負荷にならないようにsleep関数導入のためのtime

自分はローカル環境のDocumentsにscraypeディレクトリ作成の元行いました。

  • scraype
    • handle_name_search.py
    • handle.xlsx

早速上記pipを用いて4つをinstallしましょう。

pip3 install requests
pip3 install openpyxl
pip3 install BeautifulSoup4
pip3 install time

そして先ほど作ったファイルにimport

handle_name-search.py
importrequestsimportopenpyxlfrombs4importBeautfulSoupasbsimporttime

ハンドル名をエクセルの一列目に並べる

スクリーンショット 2020-03-18 23.51.40.png

上記のようにセッティングをしてhandle.xlsxとして保存しscraypeフォルダに保存しましょう。

エクセルからA1列目の情報を取得する

openpyxlモジュールを使ってローカル環境のファイルをloadし、Sheet1を操作する

handle_name_search.py
wb=openpyxl.laod_workbook('/Users/{自分のローカル}/Documents/scraype/handle.xlsx')sheet1=wb['Sheet1']

これでSheet1の設定は完了なのでA1列目を全て取って行きましょう

handle_name_search.py
foriinrange(0,sheet1.max_row):print(sheet1.cell(row=i+1,column=1).value

これを実行すればエクセルからA1列目の情報が全て出力されます!
あとはこれを探す!

摘出してものをgoogleで検索する

handle_name_search.py
req=requests.get("https//www.google.com/search?q="+sheet1.cell(row=i+1,column=1).value)

BeatifulSoupを用いてアカウント名が書かれているタグを検索

handle_name_search.py
req=req.textsoup=bs(req,"html.parser")tags=soup.find_all("div",class_="ZINbbc xpd O9g5cc uUPGi")if(tags[0].find("div",class_="BNeawe vvjwJb AP7Wnd")!=None):title=tags[0].find("div",class_="BNeawe vvjwJb AP7Wnd").string

ここで苦戦した内容がgoogleの検証でみられるクラス名とbs4で取得するクラスが違うということで、soup.prettify()でBNeawe vvjwJb AP7Wndのクラスの中にgoogleの検索タイトルが入っているのを確認。

検索結果の中から邪魔なものを取り除く

handle_name_search.py
if"(@"intitle:title=title.split('(@')[0]else:if"- Twitter"intitle:title=title.split('-')[0]if"✓"intitle:title=title.split('✓')[0]

最後にエクセルに出力し保存

handle_name_searchpy
sheet1.cell(row=i+1,column=3).value=titlewb.save('/Users/{自分のローカル名}/Documents/scraype/handle.xlsx')

全容以下に載せます

handle_name_search.py
importrequestsimportopenpyxlfrombs4importBeautifulSoupasbsimporttime##ローカルにあるhandle.xlsxにアクセスする(一列目にハンドル名入力)
wb=openpyxl.load_workbook('/Users/{自分のローカル名}/Documents/scraype/handle.xlsx')sheet1=wb['Sheet1']##excelの一列目のハンドルを取得し、三列目に出力する
foriinrange(0,sheet1.max_row):time.sleep(1)print(sheet1.cell(row=i+1,column=1).value)req=requests.get("https://www.google.com/search?q="+sheet1.cell(row=i+1,column=1).value)req=req.textsoup=bs(req,"html.parser")tags=soup.find_all("div",class_="ZINbbc xpd O9g5cc uUPGi")if(tags[0].find("div",class_="BNeawe vvjwJb AP7Wnd")!=None):title=tags[0].find("div",class_="BNeawe vvjwJb AP7Wnd").stringif"(@"intitle:title=title.split('(@')[0]else:if"- Twitter"intitle:title=title.split('-')[0]if"✓"intitle:title=title.split('✓')[0]print(title)sheet1.cell(row=i+1,column=3).value=titlewb.save('/Users/{自分のローカル名}/Documents/scraype/handle.xlsx')wb.save('/Users/{自分のローカル名}/Documents/scraype/handle.xlsx')

あとはコンパイルしてみて確認してみてください。
三列目にアカウント名が出力されましたでしょうか!?

サーバー攻撃にならないように途中にsleep関数を導入していますが、スクレイピングを実行する際はくれぐれも規約に沿った行動をしてください。

以上スクレイピングでした。

neovimの基本設定(備忘録・macOS)

$
0
0

macOSを使っています
ターミナルソフトはAlacrittyかiterm シェルはzsh
以前vimを使っていたがほとんど忘れてしまったからまた一からやり直したい
以前の設定ファイル・プラグインは全て削除した

1,最低限のinit.vim

1, init.vimとは

neovimの設定ファイル
vimで言う.vimrc
vimscriptで書かれている

2, init.vimの場所

~/.config/nvim/init.vim
なかったら作る(↓作り方)

terminal
$mkdir .config/nvim
$cd .config/nvim
$nvim init.vim

3, init.vimのスクリプト

誰かが作ってるやつを必要そうなやつだけ少しずつパクらさせていただいています

init.vim
set encoding=utf-8  "文字コード
setnumber  "行番号を表示    
set title  "ファイル名を表示
set splitbelow  "新しいウィンドウを下に開く
set splitright  "新しいウィンドウを右に開く
set noequalalways   "ウィンドウサイズの自動調整を無効に
set wildmenu    "wildmenuオプションを有効
set hls   "検索結果をハイライト
set ruler   "カーソルの位置表示を行う
set clipboard=unnamed  "ヤンクでクリップボードにコピー
set showmatch   "対応する括弧を強調表示
set nrformats=  "すべての数を10進数として扱う

set expandtab   "入力モードでTabキー押下時に半角スペースを挿入
set tabstop=4   "タブ文字の表示幅
set shiftwidth=2    "インデント幅

2, dein.vimの基本設定

1, dein.vimとは?

暗黒美無王Shougoさんが作っているvimのpluginを管理するためのplugin
https://github.com/Shougo/dein.vim

2, dein.vimのインストール

https://github.com/Shougo/dein.vimに書いてあるようにするだけでいい
ターミナルで

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

次に、init.vimに

init.vim
"dein.vim settingif&compatible
  set nocompatible
endif" Add the dein installation directory into runtimepathset runtimepath+=~/.cache/dein/repos/github.com/Shougo/dein.vimif dein#load_state('~/.cache/dein')call dein#begin('~/.cache/dein')"Load TOMLcall dein#load_toml('~/.config/nvim/dein.toml',{'lazy':0})call dein#load_toml('~/.config/nvim/dein_lazy.toml',{'lazy':1})call dein#end()call dein#save_state()endifif dein#check_install()call dein#install()endiffiletype plugin indent on
syntax on

と書いてvimを再起動

3, dein.vimのpluginをtomlを使って管理

tomlを使うとvimの起動時に起動するpluginと遅延して起動するpluginを分けて設定することができる

terminal
~/.config/nvim $nvim dein.toml

とdein.tomlを作成

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

とする

terminal
~/.config/nvim $nvim dein_lazy.toml

dein_lazy.tomlという名前の空ファイルを作って保存しておく

これでpluginのインストールは楽になる

3, colorschemeの設定

デフォルトは見づらいからcolorschemeだけ設定する
プラグインとカラースキームとかは https://vimawesome.comから検索できる
なかなか便利
今回はmaterialを使う
dein.tomlに

dein.toml
[[plugins]]repo='jdkanani/vim-material-theme'

をつけたす

init.vimの最後に

init.vim
set termguicolors   "重要!!
set background=darkcolorscheme material-theme

これでcolorschemeのインストールは完了

次回はコマンドかな?

Vim 原理主義者である私の最強にして究極の ~/.vimrc を公開する

$
0
0

この文章のターゲット

この記事は、Vim 原理主義者の ~/.vimrcを公開するものです。何か特定のプラグインやキーバインドを紹介するものではありませんので、そこはご注意ください。

原理主義

原理主義とは

コンピュータ界隈には、時に畏れ敬われ、時にあざ笑われような"原理主義者"と呼ばれる人々が存在します。

この語について述べる前に、真逆のものをイメージしてみてください。みなさんの周りには、このような人はいませんか。

  • Caps Lock と Ctrl を入れ替える
  • Mac ユーザなのに HHKB を使う
  • ~/.bashrcalias vim='emacs'という記述がある

このような設定をしている人々は、原理主義者ではありません。原理主義者というのは、Emacs を使用していてどれほど左小指が痛くなろうと、包み込まれるような打鍵感の誘惑に負けそうになろうと、また Emacs 急先鋒であろうと、マシンではなくあくまで自分を適応させようとする人々のことです。

すべてにおいて原理主義者である人は非常に少なく、誰かが原理主義者であるとするならば大抵は、「〇〇原理主義者」と呼ばれるのが一般的です。たとえば、上に挙げた3つのようなことに強い嫌悪感を示し、あくまで Apple が設定したデフォルトを愛し使い続けようとする人々は

Mac 原理主義者

であるとされます。

なぜ人々は原理主義者になるのか

コンピュータを愛するギークや、こだわりの強い人々は、自分の愛するものが

"洗練"されており
何らかの"対称性"をもち
"一貫性"がある

ことを求めます。

それらの3つの必要条件を"最強の進化"や"最強の変態"によって達成する人がいれば、"必要かつ十分な装備"や"速度と機能度の両立"によって満たす人もいます。

その一方で、"何も変更しない"や"初期状態"こそが最強であると考える人もいます。それが原理主義者なのですが、彼らはこう考えています。

  • "デフォルト"とは至高の洗練、対称性、一貫性である
  • カスタマイズとはそれらの美しさを"汚す"行為である
  • 世界中の何万台ものマシンが自分の環境と完全に同一の状態にある

Ctrl ボタンは左最下部(だけど最左端じゃない)にあるよりも、a ボタンの左にあったほうが良いです。一生で小指への負担がどれほど減るのか、考えただけで眠れなくなります。

しかし、かといってキーバインドの設定を実際にやってしまうというのは、愛する Mac を否定することであり、葛藤しながら Caps Lock と Ctrl の配置をこのように決定した Apple のエンジニアへの冒涜にほかなりません。こうして私は、Mac 原理主義者であり続けるのです。

そして世界中のエンジニアも原理主義者であり続けるのです。

私の ~/.vimrc

様々な人々が、自分の自慢の ~/.vimrcを公開しています。私もその例にもれず、自分の ~/.vimrcを愛しているし、誇りを持っています。自分が長い時間と苦労をかけて辿り着いた極地を公開するのは恥ずかしい気持ちですが、

これが、私の ~/.vimrcです。

~/.vimrc

究極の ~/.vimrcに至るまで

エディタ戦争における Vim

Editor War と呼ばれる聖戦で、Vim 側の人間の主張は、最終的にはこれに落ち着くとされています。Vi と Vim は今同一サイドにいるわけですが、

Ubiquitous. Essentially all Unix and Unix-like systems come with vi (or a variant) built-in. Vi (and ex, but not vim) is specified in the POSIX standard.

要するに

「デフォルトで入ってる!」

これが Vim の最強の武器です。Vim 信者を支える唯一の真実でもあります。「デフォルトの OS で Emacs はないけれど Vi はある」、これが Vim こそが UNIX および Linux において公式であり公認の唯一のエディタであるという証明です。

それが Vim はデフォルトであるべきだという Vim 原理主義者たちの教義になっています。

Vim と Emacs の立ち位置

Vim 原理主義者によると、Vim と Emacs の立ち位置は以下のようになっています。

  • Vim はデフォルトのエディタ。デフォルトの状態こそが最も洗練されていて、対称性があり、一貫性がある
  • Emacs は改造に改造を重ねて手に馴染ませた状態こそが最強

Emacs は、使うほどに色艶が増す漆器のようなものです。使って初めて完成する、汚して初めてエディタとなるエディタです。それこそが Emacs の洗練であり、対称性であり、一貫性なのです。

一方で Vim に関しては

「デフォルトの Vim こそが究極の Vim である」

というのが、Vim 原理主義者たちの思いです。

結論

Vim の存在意義を考えたとき、Vim 原理主義者たちが至った結論はこうでした。

デフォルトの Vim こそが究極の Vim である

それこそが Vim 原理主義者である私が、この ~/.vimrcに辿り着いた理由です。

さいごに

ちなみに、僕はどっちかというと Emacs 派です!

Viewing all 5725 articles
Browse latest View live


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