2019年9月17日火曜日

Emacs の hydra で、ちょっとした変更

Emacs の設定に、 hydra を使っていて、物覚えの悪い頭の補助をしてもらっている。

justbur/emacs-which-key も入っているが、メニューというより、確認という位置付けかと。

下が自分の基本パターン?になるかも。

(defhydra hyd-flyck (:hint nil :exit nil)
  "Flycheck"
  ("M" flycheck-manual "Manual" :column "flycheck")
  ("v" flycheck-verify-setup "verify setup")
  ;;
  ("p" flycheck-previous-error "prev" :column "Errors")
  ("n" flycheck-next-error "next")
  ("c" flycheck-buffer "check buf")
  ("l" flycheck-list-errors "list")
  ;;
  ("?" flycheck-describe-checker "describe" :column "Checker")
  ("d" flycheck-disable-checker "disable")
  ("m" flycheck-mode "mode")
  ("s" flycheck-select-checker "select")
  ;;
  ("q" nil "Exit" :exit t :column "Quit")
  ("." nil "cancel" :exit t)
  )

で、あまり見掛けないけど、結構いいかも、という設定に出あったりする。 まあ、ドキュメントに記載されているはずだが、コピペメインの私が読んでいるはずもない。

  • ショートカットキーを2文字以上にする

    自分は、勝手にワンキーだと思い込んでいた。他のhydraに飛ばなくても、階層化っぽくなる。

    セカンドキー以降は、ミニバッファ下にメニュが表示されるので、不細工ではあるが、キー不足対策や、カテゴライズに重宝かも。

    例えば、ブックマークについて、以下のようにしてみている。主にバッファ内利用をメインにしている、 joodland/bm を使っているが、サブ的に標準のbookmarkを追加してみた。

    あと、削除関連は複数キーにして、打ち間違い対策としてみた。

    あと、デフォルトでキーバインドされてるのは、それをイメージできるようにしておけば、いずれ hydra には不要になるかも、と思ったりする。

    (defhydra hydra-bkmk (:color pink :hint nil)
      "BookMark(bm/buildin)"
      ("m" bm-toggle "toggle" :column "marked")
      ("N" bm-lifo-next "LIFO N")
      ("P" bm-lifo-previous "LIFO P")
      ;;
      ("n" bm-common-next "next" :column "jump")
      ("p" bm-common-previous "prev")
      ("l" bm-show-all "list o/w")
      ;;
      ("s" bm-toggle-buffer-persistence "stay(toggle)" :column "edit")
      ("rr" bm-remove-all-current-buffer "remove c.buff")
      ("rR" bm-remove-all-all-buffers "remove a.buff")
      ;;
      ("aa" bm-bookmark-annotate "annotate" :column "annotate")
      ("aA" bm-bookmark-show-annotation "show anno")
      ;;
      ("xrl" bookmark-bmenu-list "blist" :exit t :column "Standard BkMk")
      ("xrm" bookmark-set "set current" :exit t)
      ("bo" bookmark-jump-other-window "jump other" :exit t)
      ("bc" counsel-bookmark "counsel bkmk")
      ("br" counsel-mark-ring "counsel mk ring")
      ;;
      ("q" nil "quit" :color blue :column "Quit")
      ("." nil "quit" :color blue)
      ("U" org-ctrl-c-ctrl-c "org ctl cc")
      )
    
  • “:pre” とか “:post” とか

    メニュー自体、メニューの項目が起動する前後での処理を追加できる。ようだ。

    New in Hydra - :pre and :post clauses を参考に(少し古いかも) 試してみたのが以下(20190821.939)。正しいかどうか不明。動くのだが、違和感がある。

    (global-set-key
     (kbd "C-z")
     (defhydra hydra-vi
       (
        :body-pre
        (progn (set-cursor-color "#2080d0") ;; このメニュー起動時
           (message "start menu"))
        :pre
        (progn (set-cursor-color "#40e0d0") ;; 各コマンドの前
           (message "in menu"))
        :after-exit
        (progn (set-cursor-color "#ffffdd") ;; コマンドの後 ?
           (message "agter exit"))
        :post
        (progn (set-cursor-color "#ffccff")  ;; このメニュー終了時 ?
           (message-box "!! This is test menu !!\n"))
        )
       "vi like cur move key"
       ("l" forward-char)
       ("h" backward-char)
       ("j" next-line)
       ("k" previous-line)
       ("C-n" previous-line) ;; これが有効になる
       ("q" nil "quit")
       )
     )
    
  • 単純な、羅列

    以下は4列表示。ファイルのリンクを並べたてようとした時に出会った。

    (defhydra hyd-open-tfile (:hint nil :columns 4)
      "open target file(default is orgfile)"
      ("d" (my-targetfile-open  1) "todo")
      ("m" (my-targetfile-open 12) "memos")
      ("b" (my-targetfile-open  2) "bike_memo")
      ("p" (my-targetfile-open 14) "python")
      ;;
      ("g" (my-targetfile-open  4) "diag_samp")
      ;;
      ;; (中略)
      ;;
      )
    

他にも色々ありそう。しかし、設定ばかりに手間かけると、 他が疎かになてしまう。反省。

2019年9月13日金曜日

Emacs の replace を見直してみた

今まで、replaceは正直、それほど使ってなかった。ましてや一括置換なんて怖くて。

なので、color-moccur で検索して、moccur-edit で周辺を確認しながら編集だった。 さすがに数が多いとたまらないので、少しは使えるようになればと思った次第。

いつものようにコピペ主体の設定。 参考にさせて頂いたサイトは、

で、使ってみようとしているのは以下。 これまでは、color-moccur のみ設定していた。

  • 標準の query-replace を emacs-anzu で。 migemo 対応。 一番簡単なコマンドだけ使ってみる。

    (use-package anzu :ensure t
      :config
      (setq anzu-use-migemo t)
      (setq anzu-minimum-input-length 2)
      (setq anzu-search-threshold 1000)
      (global-anzu-mode +1)
      )
    
  • 今迄と同じ color-moccur。遅いけど、これも migemo に対応している。

    (use-package color-moccur :ensure nil
      :demand
      :commands (isearch-moccur isearch-all)
      :init
      (setq isearch-lazy-highlight t) ;; original t
      :config
      (setq *moccur-buffer-name-exclusion-list*
        '(".+TAGS.+" "*Completions*" "*Messages*"
          ".bbdb" "\\.mypy_cache"))
      (setq moccur-split-word t) ;; original nil
      (setq dmoccur-use-list t)
      (setq dmoccur-use-project t)
      (setq moccur-use-migemo t)
      )
    

    どうも、私の稚拙な設定では、imenu-anywhere とバッティングするようで、用途が広そうな、color-moccur を優先し、 imenu-anywhere を無効化している。org だけなら、counsel-org-goto-all だが。

  • あったけど、使ってなかった swiper-query-replace。 swiper で絞り込んだ状態にして `M-q` で query-replace する。

    特に新しい設定はしてない。単に知らなかっただけ。

新しいやつらは3つ。

  • anzu-query-replace
  • vr/replace
  • vr/query-replace

これに、moccur を加えて hydraの検索関係メニューに追加した。
ivy と併せて replace を意識してみる。

さて、どうなることか。

2019年9月8日日曜日

Emacs lisp で始めての自分なり(ではなかったrefileの)カスタマイズ?

Emacs lisp で、自分なり機能追加、みたいな真似事をやってみた。

自分で学んでやったことは、ほんの僅か。インターフェースとかを組み合わただけだが、なんと時間のかかったかこと。

きっかけは、 org-refile の初回起動が遅くて、イラッとするので、少しぐらい改善できたら、と思ったから。

パソコンが遅いのもあるが、 refile先を細かく分けたからだと思う。ちなみに、NAS へ置いてあるファイルを加えると、たまらなく遅い。

[20191015] 例えば、ここなど、かなり よさそう。最初に読んでいれば、違った方法をやったかも。

やったこと。やろうとしていること。

  • refile に使うファイルはたいがい決ってるので、事前登録しておく。
  • このファイルを指定して、 `other-window` で開く。
  • プレビュとかで移動先を確認する。
  • カーソルを元に戻して、リファイル(avy-org-refile-as-childを使ってみる)。

NAS上のファイルへのアクセスも選択的になる。当然、全部は無理なので、 avy-org-refile-as-child までの操作を hydra との組み合わせでやってみた。 bookmark をうまく使えばいいじゃない、という思いもあったが一度やってみてもと思った。

プレビュで、 owdrive で other-window 操作しようと思ったが、ターゲットのorgファイルがfoldで開く設定にしているので止めた。その替りに、hydra メニューに outline-minor-mode の項目を追加してみた。

取り敢えず動いたという感じ。

本当にこんなのが必要なのかは、使ってみてからなのだが、今のところ、 `boolmark-jump-other-window` と `avy-org-refile-as-child` を組合せるだけで十分だったかも。ただ、ショートカットでファイル選択は、いいかも、という印象。できれば、 開き直しに対応させたいが、ハードル高そう。

hydra を含めた全体は以下。実際のターゲットファイルは18個と多い。絞り込めるか。

  (setq tflist '("captured.org"       ;; 0
                 "todo.org"           ;; 1
                 "bike_memo.org"      ;; 2
                 "cuekoma.org"        ;; 3
                 "emacs_memo.org"     ;; 4
                 "linux_memo.org"     ;; 5
                 "python.org"         ;; 6
                 "memos.org"          ;; 7
                 "raspi_memo.org"     ;; 8
                 ))
  ;;
  (defun my-targetfile-open (n)
    "open target file other windows"
    (interactive)
    (setq targetfile
          (concat "~/Documents/ownCloud/" (nth n tflist)))
    (find-file-other-window targetfile)
    ;; (other-window -1) ;; 直前に戻る
    (message "open target file : %s" targetfile)
    )
  ;;
  (defhydra hyd-opentartget (:pre (progn
                                    (bm-toggle)
                                    (hl-line-mode 1)
                                    )
                             :post (progn
                                     (bm-toggle)
                                     (hl-line-mode -1)
                                     (other-window -1)
                                     )
                             :hint nil)
    "open target file"
    ("t" (my-targetfile-open  1) "todo.org" :column "agenda" :exit t)
    ("m" (my-targetfile-open  7) "memos.org" :exit t)
    ("b" (my-targetfile-open  2) "bike_memo.org" :exit t)
    ("p" (my-targetfile-open  6) "python.org" :exit t)
    ;;
    ("e" (my-targetfile-open  4) "emacs_memo.org" :column "regular")
    ("r" (my-targetfile-open  8) "raspi_memo.org" :exit t)
    ("l" (my-targetfile-open  5) "linux_memo.org" :exit t)
    ;;
    ("J" (forward-line 1)    "next line" :column "OL move cursor")
    ("K" (forward-line -1)   "previous" )
    ("U" (scroll-up 5)       "sc up 5" )
    ("D" (scroll-down 5)     "sc dn 5" )
    ;;
    ("N" outline-next-visible-heading "next head")  ;; Next
    ("P" outline-previous-visible-heading "prev head") ;; Previous
    ;; ("}" outline-forward-same-level "f same")   ;; Forward - same level
    ;; ("{" outline-backward-same-level "b same")  ;; Backward - same level
    ("T" (beginning-of-buffer 0)   "top" )
    ("G" (end-of-buffer 0)         "bottom" )
    ;;
    ("M" outline-show-all "show all" :column "ol show")
    ("T" outline-show-entry "show this")
    ("S" outline-show-subtree "show below all")
    ("X" outline-show-children "show child")
    ;;
    ("Z" outline-hide-subtree "hide below" :column "ol hide")
    ("F" outline-hide-body "hide body")
    ("C" outline-hide-entry "hide this")
    ("O" outline-hide-other "hide others")
    ("H" outline-hide-leaves "hide bellow body")
    ;;
    ("q" nil "Exit" :exit t :column "Quit")
    ("." nil "cancel" :color blue)
    )

Emacs の lsp の設定、なう(202310)

前回さらしてから、さらに1年。そう、3年めになる。 が、今回は一段と自信がない。 環境は、 Debian GNU/Linux 12 (bookworm) + emacs(29.1)。consult + company。 embark は未だに使ってない。 用途は、メモ と ...