なぜか、うまく動かなかったので、修正!!!!!!!!!
= @タグジャンプ作成
日本語でタグジャンプができるようにする(最新版)
1. tagファイル作成
~/myprg/tags.pl
#!/bin/sh
find . -name "*.*" -print -exec grep -E -o -dskip '\*[^*]{1,20}\*' {} + | ~/myprg/
#grepまでの出力結果は以下となる
#アスタリスクがある場合はダブルクオーテーションで囲う必要がある
#f#ind . -name "*.txt" -print -exec grep -E -o -dskip '\*[^*]{1,20}\*' {} +
#./tmp.txt:*standard-output*
~/myprg/tags.sh
#!/usr/bin/perl
use utf8;
use warnings;
binmode STDOUT, ":utf8";
binmode STDIN, ":utf8";
#tags.shのgrepまでの出力は、以下のようなパターンの行が複数ならんでいる
#./tmp.txt:*standard-output*
# それをこのtags.plで キーワードに一致する行を取り出し 書く特殊変数
# に代入して、以下のパターンが並ぶ複数行のtagsファイルを作成するいく
# standard-output ./tmp /*standard-output*
# 最終的に tags_jump.vim tags_jump.pl で
# vim ./tmp -c /*standard-output* が実行され、
# ファイル./tmp のstandard-outputがある行にジャンプする
while ($line = <>) {
#if をいれないとUse of uninitialized value $2 in concatenation
#と怒られる
if ($line =~ /^(.*):\*(.*)\*/){
#$lineは bbb ./tmp5.txt /*bbb* のように出力される
#以下で **で囲まれた文字列で空白文字があれば削除
# * aaa* など
if (!($2 =~ /\s/)){
print "$2\t$1\t/*$2*\n";
}
}
}
2. ファイル上で日本語を選択ヤンクして、C-kでタグジャンプする。
戻るときは:qでファイルを閉じて後、リターン
~/myprg/tags_jump.vim
split /home/moto/myprg/yank_file.txt
normal ggdG"0p
set fileencoding=utf-8
set fileformat=unix
wq
!/home/moto/myprg/tags_jump.pl
"ジャンプしたい文字列を選択ヤンク後C-kでジャンプ。
"戻るときは:q後リターン。
~/myprg/tags_jump.pl
#!/usr/bin/perl
package pkg1;
use strict;
use warnings;
#カレントディレクトリを求める
use Cwd 'getcwd';
my $cur_dir = getcwd;
#参考サイト
#http://www.nct9.ne.jp/m_hiroi/linux/perl04.html
#1
#use utf8;を設定すると、
#プログラム中の文字列は内部形式の文字列として扱われます。
#プログラム中の日本語、例えば「あいうえお」を5文字と認識するようになる。
#use utf8;を設定しないと15文字と認識する(length関数の結果)
#
#正規表現で日本語を使う場合
#通常、Perl は文字列をバイト単位で取り扱います。これを「バイト文字列」と呼
#ぶことにしましょう。一般に、日本語の 1 文字は複数のバイトを使って表されて
#います。正規表現を使うとき、このままでは文字単位で照合することができませ
#ん。Perl の場合、内部では文字列をユニコードで表しています。バイト文字列を
#内部形式の文字列に変換すると、正規表現でも日本語を使うことができるように
#なります。
#まず、プログラムに書かれている文字列ですが、何も指定しなければ「バイト文
#字列」として扱われます。ファイルの先頭で use utf8; を設定すると、プログラ
#ム中の文字列は内部形式の文字列として扱われます。なお、プログラムを UTF-8
#で記述したとしても、use utf8; を指定しないかぎり、文字列はバイト文字列と
#して扱われます。
#2
#ただし、use utf8; で内部形式の文字列になるのはプログラム中に記述された
#文字列だけです。外部 (ファイルハンドルやコマンドライン引数など) からの
#入力された文字列は「バイト文字列」として扱われます。
#3 入力で内部形式の文字列を受け取る
#ファイルをリードオープンするとき、open の第 2 引数に
#:utf8 を指定すると、内部形式に変換された文字列を受け取る
#open に渡すファイル名はosのバイト文字列して渡す。
#open my $in, "<:utf8", encode('utf-8', $file);
#openやunlinkなどの関数にファイル名を指定するときは、OSのバイト文字列に
#変換して指定する必要があります。
#4 出力で内部形式からバイト文字に変換してしないとダメ
#日本語を正規表現で扱う場合 内部文字列にしないとだめ
#ただし内部文字をそのままprintで出力するとワーニングが表示されます。
#それで encodeでバイト文字に変換する
#すでにオープンされているファイルハンドルの場合、関数 binmode で :utf8
#を指定すると、内部形式の文字列からバイト文字列の変換を行うことができる
#つまりprint文だけで表示できる
#binmode STDIN, ":utf8";
#binmode STDOUT, ":utf8";
use utf8;
#だし、use utf8; で内部形式の文字列になるのはプログラム中に記述された文字
#列だけです。外部 (ファイルハンドルやコマンドライン引数など) からの入力さ
#れた文字列は「バイト文字列」として扱われます。
#ファイルをリードオープンするとき、open の第 2 引数に :utf8 を指定すると、
#内部形式に変換された文字列を受け取ることができます
#open my $in, "<:utf8", $filename;
#すでにオープンされているファイルハンドルの場合、関数 binmode で :utf8 を
#指定すると、内部形式の文字列とバイト文字列の変換を行うことができます。
#binmode STDIN, ":utf8";
#binmode STDOUT, ":utf8";
#binmode で STDOUT に :utf8 を設定すると、内部形式の文字列をバイト文字列
#(OS の文字コード) に変換して出力します。
binmode STDOUT, ":utf8";
binmode STDIN , ":utf8";
my $word;
my $line;
my $file = "";
my $kensaku = "";
#検索文字列取得をyank_file.txtから取得
## 下一行書くことによりEncode::decode ではなくdecodeとかける
use Encode;
my $inputfile = "/home/moto/myprg/yank_file.txt";
open my $in1, "<:utf8", Encode::encode('utf-8', $inputfile) or die "$!";
#open my $in1, "<:utf8", $inputfile or die "$!";
while (<$in1>){
$word = $_;
#print $word;
}
close $in1;
#print "\n";
#文字列最後の改行を削除
chomp($word);
#print $word;
#print "\n";
#if ( 文字列 =~ /パターン/) もし「文字列」の中に「パターン」
#が含まれていれば (パターンマッチすれば真
#tagsから検索文字列(word)のある行を取得
#$lint = 'word ./filename /*word*'となる
#\s 空白文字(スペース、タブ、改行) /S 空白文字以外
#()でグループ化して$2,$3の変数で受け取る
#$word = "ポインタ";
#$word = "struct";
my $tags = "/tags";
#文字列の結合 tagsファイルのフルパスを取得
my $tags_path = "$cur_dir$tags";
#print $tags_path;
#print "\n";
# tagsファイルは 以下のパターンが並ぶ複数行のファイル
# standard-output ./tmp /*standard-output*
# それを$2に./tmp を代入 $3に/*standard-output* を代入している
#
my $count = 0;
open ( my $in2, "<:utf8", encode('utf-8', $tags_path) ) or die "$!";
while (my $line = <$in2>){
#print $line;
# iオプション 小文字 大文字を無視する
if ( $line =~ /^($word)\s(\S+)\s(\S+)/i ){
#$file = "$cur_dir.substr($2, 1)";
$file = substr($2, 1);
$file = "$cur_dir$file";
$kensaku = $3;
$count ++;
#print "if";
#print "\n";
#print $line;
#print "\n";
#print $file;
#print "\n";
#print $word;
#print "\n";
#print $kensaku;
#print "\n";
}
}
#print $word;
#print "\n";
close $in2;
#以下エラーでる時がある
#VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Oct 13 2020 16:04:38)
#引数がありません: "-c"
#検索文字列のあるファイルを開き検索文字列を検索
my $vim = 'vim.nox-py2';
#...vimでfileを開くと同時に$kensakuを実行
#$vim $fileとスペースをいれる
# eq 文字列の完全一致
if ($count == 1){
my $cmd = "$vim $file -c $kensaku";
#...コマンド実行
system ($cmd);
}elsif ($count >= 2){
print "複数定義されています";
}else{
print "一致する文字列がありません\n";
}
~/.vimrc設定
"tagsジャンプ
"日本語でタグジャンプ
nnoremap <C-k> :so /home/moto/myprg/tags_jump.vim<CR>
":q リターン で元に戻る
[2013-08-16 15:06]
0 件のコメント:
コメントを投稿