Makefile の Suspicious line XXX. Save anyway を抑制する
Emacsのmakefile-modeで行頭のtabを挿入するたびに “Suspicious line XXX. Save anyway?” というポップアップ・プロンプトが出る。 この現象は、auto-save-buers との関係らしく、以下のおまじないを設定することででなくなった。
Emacsのmakefile-modeで行頭のtabを挿入するたびに “Suspicious line XXX. Save anyway?” というポップアップ・プロンプトが出る。 この現象は、auto-save-buers との関係らしく、以下のおまじないを設定することででなくなった。
100分の1秒でもemacsの起動を早くしようと試行錯誤している一方、起動のたびに真黒なScratch画面と向きあっていると気分も暗くなってくる。せめて初期画面くらいは、ホットするようなものにしたい…ということで、dashbord.elを導入してみた。
私の場合は、ThinkpadのWindows10にVirtualBoxをInstallし、Vbox上でDebianを動かしています。
$ wget http://public.p-knowledge.co.jp/gnu-mirror/emacs/emacs-25.3.tar.xz
$ unar emacs-25.3.tar.xz
$ cd emacs-25.3
$ ./configure --with-x-toolkit=gtk3 --with-sound=no --with-x --with-xwidgets
$ make
$ sudo make install
$ sudo reboot
$ emacs --version
$ GNU Emacs 25.3.1
…
Sierraには、SIP(System Integrity Protecton)というセキュリティを強化機能が追加されていて、sudoを使ってもシステム用とされる/usr等のディレクトリに変更を加えられないようになっていて、開発環境の構築になにかと不都合です。
そこでSIPを無効にすることにしました。
command + r を押したままMacを起動させます。
再起動後いつもとは違う画面となっていますが、ビックリしないでください。
画面上の選択のユーティリティーからターミナルを起動します。
立ち上げたターミナルに以下を打ち込み、enterを押す。
csrutil disable
上図のように、
Successfully disabled System Integrity Protection. Please restart the machine for the changes to take effect.
と返ってくれば成功です。Appleメニューから「再起動」を選んで再起動すると,SIPが無効化された状態で起動します。
SIPが無効の状態で行う必要な作業が終わったら、元に戻しておきましょう。
同じ手順でターミナルを立ち上げて、csrutil enable と打ち込むだけです。
ちなみに私は無効のままにしています。
macOSをSierraにバージョンアップすると、せっかく構築した開発環境にいろいろ障害が出そうなので、ずっとMarvericsで頑張っていましたが、iTunesなどのバージョンアップについていけなくなったので、やむなくSierraに移行しました。
Sierraにアップグレードした状態で、Illustrator(CS3~6)を起動させると、次のようなエラーメッセージが出ます。
原因は、Appleが、El Capitan以降でJava 6のサポートを終了する。
とのことで、Sierra(10.12)では、CSシリーズを起動することができなくなったというわけです。
エラーがでるのは、起動時に以下のJava6の2つのディレクトリの有無をチェックしているからだとのことです。
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk
/System/Library/Java/Support/Deploy.bundle
ところが実際には、Java6は使っていないそうです。 ということは、Java6の2つのディレクトリさえ存在していれば、実際にJava6がインストールされてなくても、Adobe CSシリーズは動作するということになります。
実は、Sieeraの問題点はここからです。
EI Capitan以後に採用された、System Integrity Protection(SIP)による制約のために、管理者権限をもってしても、/System/Library 下に任意のデレクトリを新規作成することができません。
そこで、一時的にSIPを無効にし、当該ディレクトリを作成した後に、再びSIPを有効にする必要があります。
上記によりSIPを無効化して再起動し、改めてターミナルを起動します。ターミナルに以下のように入力して実行します。
sudo mkdir -p /System/Library/Java/JavaVirtualMachines/1.6.0.jdk /System/Library/Java/Support/Deploy.bundle
非常に長いコマンドなので、右端の、Deploy.bundleまで確実にコピーしてください。
管理者パスワードを要求されるので入力します。
これで、Illustrator/Photoshop が起動できると思います。
私の場合、Illustrator CS4を起動したところ「プラグインの読み込みエラーです。PhotoshopImport.aip」とでます。
いろいろググって試しましたが解決せず、最終的に下記サイトにある、Yosemite.AICS4.Fix.mpkg.zip
をDownloadし、インストールすることで解決しました。
https://github.com/ralvarezt/aics4_yosemite_fix/releases
Yosemite対応のようですが、Sierra でも大丈夫でした。
運営している俳句サイトで自動句会システムを作動させている。
ユーザーが自分が詠んだ俳句をテキストフォームを使って投稿するという仕組みなのですが、キーボードからの入力ではなくて、コピー貼付け操作をされる方も多く、意図しないスペースが入ったまま投稿されるケースが多いです。そのままですとシステムが正常に処理できないことがあるので、投稿受付時に不要なスペースやタブを自動的に削除するように対策を施すことにしました。
正規表現を使って文字列$valの末尾の半角スペース&タブを削除するスクリプトは以下の通り。
$val =~ s/\s*(.*?)\s*$/$1/;
テストスクリプトで確認してみましょう。
## 文字列前後のスペース&タブ削除
$val = "This is a pen. ";
$val =~ s/\s*(.*?)\s*$/$1/;
print $val;
全角スペースの削除は、少しやっかいです。使用する文字コードによって異なるからです。
$val =~ s/\x81\x40//g; … SJIS
$val =~ s/\xa1\xa1//g; … EUC
$val =~ s/\xE3\x80\x80//g; … utf-8
UpFtpと言うのは、結城浩さんの作られたMakeWebと併せて使うためのFTP自動化ツールのことです。
これらのツールを使えば、MakeWeb記法(Markdown記法のような書式)で書いた、index.txtをMakeWebでコンパイルしてindex.htmlを生成させ、UpFtpでサーバーに送って更新する…という手順を下記のように makefileに書き、make -k
するだけで自動処理されます。
target = index.html
a.out:all
all: $(target)
.SUFFIXES: .txt .html
.txt.html:
perl ~/Dropbox/Web/GH/mw/makeweb.pl $< $@ # index.txt to index.html
perl ~/Dropbox/Web/GH/upftp/upftp.pl
Dropboxは、Windows/Linux/macOSとマルチ環境で使えるので、WEB構築の元データを複数端末で共有するのには一番適している。同期速度などの点でも他のクラウドと比較して一番早い。
ぼくの場合は、どの環境もユーザーフォルダの直下にDropboxをインストールしているので、以下のようPATH構成になる。
C:\Users/minoru/Dropbox
/home/minoru/Dropbox
/Users/minoru/Dropbox
Makefileの場合は、~/Dropboxと書くことで認識してくれるので容易に共用設定が書けるが、UpFtpの設定ファイルの場合は、以下のようにフルパスを書く必要があるので工夫が必要となる。
# Local root directory (in fullpath)
my $localrootdir = "";
# File list (in fullpath)
my $filelist = "";
フルパスを直書きするとマルチ環境で共用できないので、変数を取得してそれを共通で使えるようにします。
MacもLinuxも同じUNIXなので以下の方法でユーザーフォルダのPATHを取得できる。
$home = $ENV{"HOME"}
$home = %USERPROFILE%
私の場合は、以下のように書くことでうまく動いている。
# Get HOME directory from environment variables
my $home = $ENV{"HOME"};
# Local root directory (in fullpath)
my $localrootdir = "$home/Dropbox/Web/GH";
# File list (in fullpath)
my $filelist = "$home/Dropbox/Web/GH/upftp/filelist.txt";
ここからは確認できていないので無責任になるけれども、OSを判別する特殊変数を使って分岐させる必要がある。
ぼくはプログラマーではないけど、作業の自動化などを図るためにときどきパッチワークコードを試すことがある。 この目的のために多くの人は、open-junk-file.elを使っているみたいなので素直に見習う。
サンプルコードの場合、うまく動くことが確認できたらあとは使い捨てになるので保存場所にはさほど神経質にならなくても良いが、あとからの検索を用意にするためにぼくの場合は、howmフォルダーに置いている。検索は、helm-agでもいいのだけどhowmの一覧機能や検索機能がとても使いやすく優れているからだ。
メモのファイル名は、[timestamp.拡張子]という使い方が多いみたいだけど、ちょっと判りにくいので、ぼくの場合は、20170717.hoghoge.plという感じにしてる。
;;--------------------------------------------------------------------------------
;; open-junk-file.el last updated: 2017/07/17
;;--------------------------------------------------------------------------------
(use-package open-junk-file
:bind ("C-c j" . open-junk-file)
:config (setq open-junk-file-format "~/Dropbox/howm/junk/%Y/%Y%m%d."))
;; Automatically insert tags according to extension
(defvar open-junk-ext-tags-alist
'(("el" ";;" "ELISP")
("pl" "#" "PERL")
("py" "#" "PYTHON")
("rb" "#" "RUBY")))
(defadvice open-junk-file
(after open-junk-file-insert-howm-comment-advice activate)
"After open-junk-file, insert a tag into the opened buffer
to be searched by howm."
(let* ((ext (replace-regexp-in-string "^.*\\.\\([^\\.]+\\)$" "\\1" buffer-file-name))
(asc (assoc ext open-junk-ext-tags-alist))
(prefix (cadr asc))
(tag (caddr asc)))
(insert prefix)
(insert " %" tag)))
コードを試運転したりデバッグするときに quickrun.el を入れて併用すると最強となる。
;;-------------------------------------------------------------------------
;; 20_quicrun.el last updated: 2017/07/05
;;-------------------------------------------------------------------------
(use-package quickrun
:bind ("C-c q" . quickrun) ;; ファイルを実行する
("C-c c" . quickrun-compile-only))
Emacs24以降は、内包されたWhitespaceで全角スペースなどを明示的に表示できることは知っていたけれど、長い間使い馴染んだjaspaceのそれと同じような表示にするための設定がわからず挫折していた。
今回、emacs設定ファイルを全体的に見直すことになり、Tipsをググっていて表題のものを見つけたので試してみた。
(use-package whitespace
:diminish global-whitespace-mode
:config
(setq whitespace-style
'(face
tabs spaces newline space-mark tab-mark newline-mark))
(let ((dark (eq 'dark (frame-parameter nil 'background-mode))))
(set-face-attribute 'whitespace-space nil
:foreground (if dark "pink4" "azure3")
:background 'unspecified)
(set-face-attribute 'whitespace-tab nil
:foreground (if dark "gray20" "gray80")
:background 'unspecified
:strike-through t)
(set-face-attribute 'whitespace-newline nil
:foreground (if dark "darkcyan" "darkseagreen")))
(setq whitespace-space-regexp "\\( +\\)")
(setq whitespace-display-mappings
'((space-mark ? [?□] [?_]) ; full-width space - square
(newline-mark ?\n [?\xAB ?\n]))) ; eol - right quote mark
(setq whitespace-global-modes '(not dired-mode tar-mode))
(global-whitespace-mode 1))
メモ機能に特化したhowmの設定を紹介します。
;*************************************************************************
;; howm-memo.el last updated: 2017/06/09
;*************************************************************************
;; M-x package-install howm
;; (use-package key-chord)
;; (use-package use-package-chords
;; :config (key-chord-mode 1))
;;-----------------------------------------------------------------------
(use-package howm
:init
(setq howm-view-title-header "#"
howm-directory "~/Dropbox/howm"
howm-file-name-format "%Y/%m/%Y-%m%d-%H%M.md"
:config
(setq howm-view-split-horizontally t ;; 一覧バッファと内容バッファを横に並べる
howm-view-summary-persistent nil ;; RET でファイルを開く際一覧バッファを消す
:chords ((",," . howm-create) ;; メモを書く
("@@" . howm-list-all))) ;; メモ一覧を開く
;; 空になったファイルを尋ねずに自動削除:howm以外でも有効
(defun my:delete-file-if-no-contents ()
(when (and (buffer-file-name (current-buffer))
(= (point-min) (point-max)))
(delete-file
(buffer-file-name (current-buffer)))))
(if (not (memq 'my:delete-file-if-no-contents after-save-hook))
(setq after-save-hook
(cons 'my:delete-file-if-no-contents after-save-hook)))
;***********************************************************************
; end of file