• 締切済み

emacs lispで別のバッファを制御する方法

emacs lispのプログラミングをしていて、現在のバッファにあるファイル名と行番号を取得して別のwindowにそのファイルのその行を表示させたいのですが、以下の様にしてファイルのオープンは出来るのですが行の移動が出来ません。どの様にしたら良いのでしょうか? ------------------------ (defun elx-display-source () (interactive) (elx-link-to-source) ; <--この関数でfile-nameとline-noに値がセットされる (setq log-buffer (current-buffer)) <-- 今のバッファ ( if file-name (progn (setq rtl-buffer (find-file-noselect file-name)) <-- 新しいファイルを開く(OK) (display-buffer rtl-buffer) ; (switch-to-buffer rtl-buffer) ; (goto-line line-no) ; <-- ここで行をジャンプさせたいがしない。。。 (switch-to-buffer log-buffer))) ) ---------------------

みんなの回答

  • notnot
  • ベストアンサー率47% (4845/10255)
回答No.2

goto-lineの後に(sit-for 5)とか入れると移動自体はうまく行っているのがわかると思います。 (display-buffer rtl-buffer) を削除するか、(switch-to-buffer log-buffer)の後に移すと多分希望の動作になると思います。 他の方法として、(goto-line line-no)の後に何か書けばいいのかもしれませんがわかりません。 display-buffer によってこのバッファのウィンドウが作られ、次の switch-to-buffer によって同じバッファのウィンドウがまた別に作られます。goto-lineでは後から作られたウィンドウでポインタが移動しますが、最初に作られたウィンドウ上ではポインタは開かれた時点から動いていません。最後のswitch-to-bufferで後から作られたウィンドウが消えるのでポイント移動がなかったことになります。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

emacsの組み込みlisp関数の動作は知らないのですが、lisp自体は分かるので、若干のアドバイスです。 line-noに確実に行番号が入っていることは確認済みでしょうか。また、その場所でgoto-lineを使用して間違いなくジャンプすることは確認済みでしょうか。 念のため、 (goto-line line-no) のかわりに (goto-line 5) とか (goto-line 10) とかを実行して、指定したファイルの5行目/10行目に飛ぶかどうか試してみてはいかがでしょうか。 これで5行目/10行目に飛ぶようであればline-noに行番号が入っていない可能性が高いですし、5行目/10行目に飛ばないようであれば、この関数呼び出しのシーケンスではgoto-lineを使用してジャンプすることができないという判断ができます。

関連するQ&A

  • Emacs Lisp: 関数に引数が渡せない?

    お世話になります。 ----------------------------------------- ; -*- lisp-interaction -*- ; このファイルはtest.elisというファイル名で、そのファイルを開いたバッファで実行 (buffer-name) ;;; ミニバッファに以下のように表示される ;;; "test.elis" (buffer-name "test.elis") ;;; ★引数を与えるとそのバッファ名を返すはず ;;; エラーになる ;;; Debugger entered--Lisp error: (wrong-type-argument bufferp "test.elis") (get-buffer "test.elis") ;;; ミニバッファに以下のように表示される ;;; #<buffer test.elis> (buffer-file-name) ;;; ミニバッファに以下のように表示される ;;; "/home/userName/test.elis" (buffer-file-name "test.elis") ;;; ★引数を与えるとそのバッファのファイル名を返すはず ;;; エラーになる ;;; Debugger entered--Lisp error: (wrong-type-argument bufferp "test.elis") ----------------------------------------- Emacs Lispの勉強として、上のようなファイルを開いて、各関数の括弧綴じ)の後ろでC-x C-eとタイプして実行し、挙動を調べています。 ★をつけたbuffer-nameおよびbuffer-file-name関数は、それぞれ引数を渡したバッファ名、および、そのバッファのファイル名が返ると思われるのですが、実際には上記のようにエラーになります。 これはどうしてでしょうか。 Emacsは23.4.1を使っています。 よろしくお願いします。

  • CGI.pmでファイルアップロードする際のバッファのサイズの制限はありますか?

    CGI.pmを使用してファイルのアップロードを行う際に、 while(read($file_name, $buffer, 1024)){ $file .=$buffer; } のような形で「1024」バイトずつファイルを読み込みますが、 この「1024」に入る数字に制限はあるのでしょうか? たとえば「20480」バイトずつ読み込む場合など・・・ このバッファサイズにより何か影響がでるようなことがあるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • CGI
  • PHP初心者です。

    xamppを使用して勉強してます。 htmlでファイルをアップロードするソースを作り、phpで <meta http-equiv="Content-Type" content="text/html"; charset="UTF-8" /> <?php $file=$_FILES['my_img']; $filePath="./user_img/".$file['name']; move_uploaded_file($file['tmp_name'],$filePath); というコードを書いて実行したところ、 Warning: move_uploaded_file(./user_img/021.jpg): failed to open stream: No such file or directory in  このphpファイルの名前 on line 〇〇行目 Warning: move_uploaded_file(): Unable to move 'C:\xampp\tmp\php6207.tmp' to './user_img/021.jpg' in このphpファイルの名前 on line 〇〇行目 とエラーになってしまいました。 なぜでしょうか?

    • 締切済み
    • PHP
  • サーバー上で.gzと.tarファイルの解凍方法

    Wordpressを6.3へアップデートしたところ、 “このサイトで重大なエラーが発生しました。”のメッセージで ログイン画面へアクセスできなくなり、プラグインを無効化してみたり、テーマを無効化してみたのですが問題が解決せず、 一度wp-contentファイルを全て削除して、再インストール→バックアップデータをFilezillaからアップロードしているのですが、 なかなか終わらず、途中で切れてしまいます。。。 その為、Lolipop へ問い合わせ、データベースを.gzファイル、データベースを.tarファイルでFTP上にアップロードしてくださったのですが、 そこからファイルの解凍方法が分かりません。。 ネットで探してサンプルコードを見つけたのですが、 上手くいかず、、、どこを直したら良いか教えてください。 【.gzファイル解凍のサンプルコード1↓】 //This input should be from somewhere else, hard-coded in this example $file_name = '解凍したいファイル名.gz'; // Raising this value may increase performance $buffer_size = 4096; // read 4kb at a time $out_file_name = str_replace('.gz', '', $file_name); // Open our files (in binary mode) $file = gzopen($file_name, 'rb'); $out_file = fopen($out_file_name, 'wb'); // Keep repeating until the end of the input file while (!gzeof($file)) { // Read buffer-size bytes // Both fwrite and gzread and binary-safe fwrite($out_file, gzread($file, $buffer_size)); } // Files are done, close files fclose($out_file); gzclose($file); 【.gzファイル解凍のサンプルコード2↓】 $file_name = 解凍したいファイル名.gz'; $buffer_size = 4096; // The number of bytes that needs to be read at a specific time, 4KB here $out_file_name = str_replace('.gz', '', $file_name); $file = gzopen($file_name, 'rb'); //Opening the file in binary mode $out_file = fopen($out_file_name, 'wb'); // Keep repeating until the end of the input file while (!gzeof($file)) { fwrite($out_file, gzread($file, $buffer_size)); //Read buffer-size bytes. } fclose($out_file); //Close the files once they are done with gzclose($file);

  • File::Tailでファイル名変更に追従するには

     あるログファイルをリアルタイムにトレースして流量を測る ツールを作ろうとしています。  mailstats.plを参考にいろいろと試しているのですが、監視 しようとしているログが日付つきのファイル名で作られていて 日次でファイル名が変わってしまうのです。  File::Tailはデフォルトだとdieしてしまいますが、errmode でハンドラを試してみたり、name_changesを試してみたり していますがうまくいきません。  ログをはいているプロセスに、ファイル名が変わるタイミン グで何かをキックしてもらうか、とも考えたのですがあまりス マートではないような気がしています。  良い方法はあるでしょうか。詳しい方教えてください。  よろしくお願いいたします。  以下errmode,name_changes等を試す前のスクリプトです。 === #!/usr/bin/perl use File::Tail ; $debug = 0; $mail_log = './log' ; my $logref=tie(*LOG,"File::Tail",(name=>$mail_log,debug=>$debug)); while (<LOG>) { print; } ; ===  ファイルがmvされると、 Error opening ./log: No such file or directory at ./tail.pl line xx  となります。  このエラーをフックして、再オープンできれば良いのですが。。

  • CSVデータを読み込み、ファイルにカテゴリを分けて書きこむ

    CSVファイル例 01,0101,○○○,○○○□□,010101, 01,0102,○○○,○○○■□,010102, 02,0201,○○○,○○○□□,020101, ・・・・・ というファイルがあったとすると、 1番目の「01」「02」と、分けて別のファイルに保存がしたいです。 書き込み自体は出来るようなのですが、なぜかループが、番号ごとに1回しかされずに、 log/01.cgi 01<>0101<>○○○<>○○○□□<>010101 log/01.cgi 02<>0201<>○○○<>○○○□□<>020101 となってしまい、全ての生成したファイルには1行しか格納されていません。 ちなみに、csvファイルは1万行近くあります。 ソースはこのような感じです。 $log = "△△△.csv"; # ログ名 $lines = file("$log"); foreach ($lines as $l) { $line = explode(",",$l); $push_line = $line[0]."<>".$line[1]."<>".$line[2]."<>".$line[3]."<>".$line[4]."<>\n"; $LOG[$line[0]] .= $push_line; $cate = $line[0].",,".$line[1]; # サブカテゴリ用 $LOG[$cate] .= $push_line; # カテゴリ用ログを保存 } なお、csvファイルは、 01・・・ 02・・・ 01・・・ 03・・・ のようになっているため、全ての行を読み込むことはしていると思います。 しかし、ログファイルにはなぜか1行分しか書き込まれていません。書き込みの文は以下になります。 foreach($LOG as $key => $value){ $explode = explode(",,",$key); if($explode[0]){ $logfile = "./log/".urlencode($explode[0]).".cgi"; } $file = fopen("$logfile", 'w'); flock($file,LOCK_EX); fwrite($file, $value); flock($file,LOCK_UN); fclose($file); 解決法が分かる方、回答のほどよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • エクセルで編集したCSVファイルを読み込むときに

    よろしくお願い致します。 エクセルで編集したCSVファイルを読み込み、HTMLとして表示するCGIがあります。 エクセルでCSVファイルを編集すると最後の項目の後にカンマ(,)が付かないのですが、 使用しているCGIでは、カンマがないと行が改行されたとみなされません。 行の最後にカンマがなくても行を改行させるには、どのようなコードを追加すればよいのでしょうか? CGIのCSVファイルの読み込みする部分のコードは以下のようになっています。 # ログファイル読み込み my $LOG_FILE = 'log.csv'; my $io = IO::File->new($LOG_FILE, 'r') or die $!; flock($io, 1); while(my $line = $io->getline) { push @ids, (split(/,/, $line))[0]; push @new_checks, (split(/,/, $line))[1]; push @dates, (split(/,/, $line))[2]; push @contents, (split(/,/, $line))[3]; push @contents2, (split(/,/, $line))[4]; push @contents3, (split(/,/, $line))[5]; push @contents4, (split(/,/, $line))[6]; push @contents5, (split(/,/, $line))[7]; push @contents6, (split(/,/, $line))[8]; } 分かりにくい説明で申し訳ありません。 補足説明も致しますので、どうぞよろしくお願い致します。

    • ベストアンサー
    • CGI
  • getパラメータでメルアド削除

    URLパラメータでたとえば http://www.hoge.hoge.delphp?del_mail=hoge01@hoge.hoge と送信したときにログファイルから削除し再書き込みしたいのですが、うまくいきません。 *ログファイルには重複したファイルもありますので重複ファイルも同時に削除できればいいのですが・・・ 下記コードに対するアドバイス下さい。 mail.log------------- hoge01@hoge.hoge hoge02@hoge.hoge hoge03@hoge.hoge hoge04@hoge.hoge hoge01@hoge.hoge hoge02@hoge.hoge 上記のようなメールアドレスだけのログがあります。 del.php------------------------------------- $array_file = file("./list.db"); $name = htmlspecialchars($_GET['del_mail'], ENT_QUOTES); unset($array_file[$name]); foreach ($array_file as $line) { $file_new .= $line; } file_put_contents("./list.db" , $file_new , LOCK_EX );

    • 締切済み
    • PHP
  • ログファイルと受信データを比べたい。

    フォームを使用して送られてきたデータをlogを比べて同じものがあったら、同じものがあるということを表示したいのです。 前にも同じようなことをしてできたはずなのですが、なぜかできなくて…。 もうずーっとやっていて頭がボーッとしてきてしまいました。。。。 #フォームで受信したデータ read(STDIN,$buffer,$ENV{'content_length'}); $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #ログファイルオープン open FILE,"naisen.log"; @FILES =<FILE>; close FILE; $i=0; $n=0; $gyou = @FILES; #文末の改行を削除 $buffer =~ s/\n$//; $FILES[$i] =~ s/\n$//; foreach(@FILES){ @log = split(/&/,$FILES[$i]); ($keys,$values) = split(/=/,$log[$_]); $FORMS{$keys} = $values; } for ($i=0; $i<=$gyou-1;$i++){ if ($buffer eq $FILES[$i]){ print "$i行目<BR>\n"; } else{ print "$i行目。これはありません。<BR>\n"; print "$FILES[$i]<BR>\n"; print "$buffer<BR>\n"; } } ログの1行目と同じものとときだけ、きちんとした結果がでます。 上記のほかにもいろいろやりましたができませんでした。

    • ベストアンサー
    • CGI
  • Perlでのファイル入出力、処理方法

    メモ帳で以下のようなプログラムを書きました。(file_1.plで保存しました) #!/usr/bin/perl $file="data.csv"; $cityfile="name.txt"; $outfile="data_out.csv"; open (IN, $file) or die "$!"; open (FILE, $file) or die "$!"; open (OUT, ">$outfile") or die "$!"; @city = <FILE>; ・ ・ ・ これをCygwinコマンド上で、 perl file_1.pl と入力し、Enterを押すと「No such file or directory at file_1.pl line 9.」と表示されます。 line9はopen (FILE, $file) or die "$!";という文です。 どこが間違えで、どのように修正すればよいのでしょうか。 よろしくお願いします。

専門家に質問してみよう