HomeAboutPostsTagsProjectsRSS

Updated
Words329
TagsRead1 minute

different height for Org mode headings

modify only the height of headings in Org mode without affecting other attributes like color

Instead of using custom-theme-set-faces which replaces the whole face definition (and could unintentionally override theme-specific settings like color), use set-face-attribute

doom-emacs config example

(after! org
  ;; Adjust the height of org headings upon org-mode startup
  (add-hook 'org-mode-hook (lambda ()
    (dolist (face '((org-level-1 . 1.75)
                    (org-level-2 . 1.5)
                    (org-level-3 . 1.25)
                    (org-level-4 . 1.1)
                    (org-level-5 . 1.05)
                    (org-level-6 . 1.0)
                    (org-level-7 . 0.95)
                    (org-level-8 . 0.9)))
      (set-face-attribute (car face) nil :height (cdr face)))))

Updated
Words485
TagsRead1 minute

Emacs-obsidian

might be too overkill for me , just opening note in Emacs for intensive editing is enough.

from [[Emacs]]: quickly open Obsidian note

use Deft Mode

from [[Obsidian]]: open current file in Emacs

open file and go to line command for emacsclient to open a.txt at line 4 column 3

emacsclient +4:3 a.txt

use obsidian open current file in emacs

emacsclient -c -s work +{{caret_position}} {{file_path:absolute}}

Use shell-command plugin to create a obsidian command to run the shell command

Updated
Words65
TagsRead1 minute

Posting a markdown document directly to Telegram will display formatting like code blocks and bold text in the message. However, the content received by the Telegram bot differs from what is initially sent, particularly with the removal of backticks.

To send the message content as plain text without formatting, I first paste it into Apple Note on iOS and then share it with the Telegram bot.

Updated
Words482
TagsRead1 minute

Modern Emacs: all those new tools that make Emacs better and faster - YouTube

Optimization

  • Lexical Binding: Before Emacs 24 emacs-lisp is dynamic binding. lexical binding is introduced in Emacs 24, enabling compile-time optimizations.
  • Native Compilation: Introduced in Emacs 28, native compilation used the GCC JIT compile to convert Emacs Lisp code to native machine code, dramatically improving execution speed.

Package Management

  • Lazy loading with use-package: use-package is now build into Emacs 29
  • Straight Package Manager : works with use-package to handle package installations and version control.

Syntax Highlighting and Parsing

  • Tree-sitter Integration: Emacs 29 includes support for Tree-sitter, a parser generator that improves syntax highlighting and code navigation by using precise parse trees instead of regular expressions. This results in more accurate and faster syntax highlighting.
  • tree-sitter mode: new major modes that utilize tree-sitter for enhanced code parsing and highlighting, for example, use python-ts-mode to replace traditional python-mode.

Completion Frameworks

  • Historical Context: Initially, Emacs used ido for interactive file and buffer navigation, followed by heavier frameworks like helm and ivy for more advanced completions.
  • Modern Solutions: vertico consult orderless marginalia embark

Language Server Protocol (LSP)

  • eglot: Emacs’ build-in LSP client

I personally use lsp-bridge for completion and LSP

Updated
Words409
TagsRead1 minute

Found a hacked way to use local submodule directory as nix package source, so that I might separate different configuration using different git repos.

in flake.nix add local submodule as input

# flake.nix
inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
    darwin.url = "github:lnl7/nix-darwin";
    darwin.inputs.nixpkgs.follows = "nixpkgs";
    home-manager.url = "github:nix-community/home-manager";
    home-manager.inputs.nixpkgs.follows = "nixpkgs";
    # submodule directory
    config-sketchybar-src = {
      url = "git+file:./config-sketchybar";
      flake = false;
    };
};

config-sketchybar is a local git submodule, we can define a package using it as source.

pkg-sketchybar-config.nix

{ inputs, pkgs, ... }:

pkgs.stdenv.mkDerivation {
  name = "sketchybar-config";

  dontConfigure = true;
  dontUnpack = true;
  src = inputs.config-sketchybar-src;

  installPhase = ''
    mkdir -p $out
    cp -r $src/config/sketchybar/* $out

    # Find all .sh files and substitute 'jq' with the full path to the jq binary
    find $out -type f -name "*.sh" | while read script; do
      substituteInPlace "$script" \
        --replace 'jq' '${pkgs.jq}/bin/jq'
    done

    chmod -R +x $out
  '';
}

and pkg-sketchybar-config can be included in home.nix as regular package.

#nix-darwin

Updated
Words295
TagsRead1 minute
# Function to download and process subtitles
download_and_process_subtitles() {
    local video_url="$1"
    local base_filename="$2"

    # Download subtitles using yt-dlp
    yt-dlp --write-auto-subs --sub-format "vtt" --skip-download -o "${base_filename}.%(lang)s.%(ext)s" "$video_url"

    # Find the downloaded subtitle file
    local subtitle_file=$(ls ${base_filename}.*.vtt | head -1)

    # Check if the subtitle file exists
    if [ -f "$subtitle_file" ]; then
        # Process the subtitle file to remove tags, timestamps and duplicate lines
        perl -ne 'print unless /<.*>/ or /^\s*$/ or /-->/' "$subtitle_file" | awk '!seen[$0]++' > "${base_filename}.txt"
        echo "Processed subtitle saved as ${base_filename}.txt"
    else
        echo "No subtitle file found."
    fi
}

# Variables
VIDEO_URL="video url"
BASE_FILENAME="basename"

# Call the function
download_and_process_subtitles "$VIDEO_URL" "$BASE_FILENAME"

Updated
Words1132
TagsRead2 minutes

[[Obsidian]] works amazingly well on iOS, it is really satisfying to write notes on mobile with it. Along with iOS shortcuts and automation, using Obsidian streamlines your mobile note-taking experience like never before.

Use [[iOS shortcut]] to automate tasks

Obsidian Advanced URI | Obsidian Advanced URI

This plugin exposes api to Obsidian via schema URL, combing it with iOS shortcuts make it possible to perform complex automation, like creating note, appending note and reordering list (via Sort & Permutation plugin).

There is a Call Command parameter for calling command from other plugins, which is the key component to automate with iOS shortcuts.

example: add to list and reorder list alphabetically

select some text and use share menu, select the shortcut.

add to the heading TIL on daily note

use commands from various plugin to do following steps:

obtain the command id

command id can be obtain by using Advanced URI: copy URI for command on the Command Palette

Actions URL

Also look at the Actions URL I find it works more reliably and has the ability to run dataview query

same workflow on macOS

The same shortcut workflow used on iOS can be reused on macOS via services, amazing cutting the boilerplate of manually copy & pasting note taking process.

CSS for multiple fonts

Font Atkinson Hyperlegible

Download the Atkinson Hyperlegible Font | Braille Institute

Use this excellent font for low vision reading , perfect for using with Obsidian on iPhone!

Custom Font Loader

Enable Custom Font Loader plugin, enable multiple fonts.

Custom CSS of using different fonts for default and code block.

:root * {
  --font-default: Atkinson-Hyperlegible-Regular-102a;
  --default-font: Atkinson-Hyperlegible-Regular-102a;
  --font-family-editor: Atkinson-Hyperlegible-Regular-102a;
  --font-monospace-default: Atkinson-Hyperlegible-Regular-102a,
  --font-interface-override: Atkinson-Hyperlegible-Regular-102a,
  --font-text-override: Atkinson-Hyperlegible-Regular-102a,
  --font-monospace-override: Atkinson-Hyperlegible-Regular-102a, 
 }

.reading * {
font-size: 20pt !important;
}
/* reading view code */
.markdown-preview-view code {
font-family: 'Iosevka';
}
/* live preview code */
.cm-s-obsidian .HyperMD-codeblock {
font-family: 'Iosevka';
}
/* inline code */
.cm-s-obsidian span.cm-inline-code {
font-family: 'Iosevka';
}

references

How to increase Code block font?! - #2 by ariehen - Custom CSS & Theme Design - Obsidian Forum

How to update your plugins and CSS for live preview - Obsidian Hub - Obsidian Publish

Updated
Words228
TagsRead1 minute

Edward Gibson: Human Language, Psycholinguistics, Syntax, Grammar & LLMs | Lex Fridman Podcast #426 - YouTube

I learned that surprisingly, the brain areas activated during language processing and coding are not the same, nor do they overlap.

Additionally, human languages tend to minimize word dependency distance, which has provided me with valuable insight into the structure of the German language. In German, there’s a rule that places the verb at the end of a subordinate clause.

Initially, this might seem odd, but it becomes logical from the perspective of minimizing word dependency distance. Consider the sentence:

“Die neuen Richtlinien legen fest, dass die Projekte je nach ihrer ökologischen Bedeutung eingestuft werden könnten.”

In this example, the words in the latter part of the subordinate clause are closely positioned, making the sentence easier to process.

Updated
Words385
TagsRead2 minutes

The terms “imperfect” and “perfect” in grammatical tenses refer to specific aspects of actions in terms of their time frames and completeness, and these terms can be somewhat confusing because they don’t align with the everyday meanings of “perfect” and “imperfect.”

Imperfect (Präteritum)

1. Meaning in Grammar

In German, the “imperfect” tense, known as Präteritum, is primarily used in written language to describe past events, particularly in narratives. It corresponds to both the simple past and the imperfect in English.

2. Etymology and Usage

The term “imperfect” comes from Latin, where it means “not completed.” It refers to an action that was ongoing or repeated in the past. This meaning carries into English and German grammar but focuses more on the narrative style of recounting past events without specifying whether the action was completed. In German, it is used less frequently in spoken language and more in writing, as it gives a formal, literary quality to the text.

Perfect Tense

1. Meaning in Grammar

The perfect tense in German (Perfekt) is used to describe actions that were completed in the past but are relevant to the present. It is the most common way to convey past events in spoken German.

2. Etymology and Usage

The term “perfect” in grammatical usage is derived from Latin “perfectus,” which means “complete.” The perfect tense is used to indicate that an action in the past has been completed, and its effects or results may still be relevant at the present time. This is why it’s called “perfect” – it signifies that the action is fully complete or “perfected.”

Why These Terms?

  • The usage of “perfect” and “imperfect” in grammar does not relate directly to their everyday meanings. In everyday language, “perfect” suggests something flawless or ideal, while “imperfect” suggests something incomplete or flawed. In grammatical terms, however, “perfect” relates to the completion of an action, and “imperfect” to the ongoing nature of an action in the past.

Summary

  • Imperfect (Präteritum) is used for describing past actions typically in a narrative, literary context.
  • Perfect (Perfekt) is used for indicating actions that were completed in the past but have a connection to the present, commonly used in spoken German.

These terms help to categorize and teach the various ways different languages express time and aspect in verb tenses, even though they might seem counterintuitive based on their names alone.

Updated
Words411
TagsRead2 minutes

kündigen and ankündigen

kündigen: to terminate, to quit

ankündigen: to declare

“Ankündigen” is a separable verb and consists of the prefix “an-” and the base verb “kündigen,” which on its own means “to terminate” or “to quit,” usually in the context of employment or contracts. The prefix “an-” changes the meaning of the base verb to imply the start or the announcement of something.

how to understand the connection

Understanding how the prefix “an-” alters the meaning of the base verb “kündigen” in German can indeed seem challenging, especially when the meanings of the prefix and base verb appear quite distinct. Here’s a more intuitive way to comprehend this transformation:

Linguistic Analysis

  • Base Verb “kündigen”: Originally means “to terminate” or “to give notice.” This verb indicates ending something formally, such as a contract or employment.

  • Prefix “an-”: This prefix in German often signifies the beginning of an action or adds a sense of initiation to the base verb. It can also denote attachment or proximity.

Conceptual Bridge

The key to understanding “ankündigen” lies in bridging the concepts of ‘starting’ and ’ending’. When you “kündigen” (terminate), you’re essentially bringing something to an end. However, many endings naturally lead to new beginnings. Adding “an-” to “kündigen” shifts the focus from the end of one phase to the initiation of another. In essence, “ankündigen” involves initiating the process of making others aware of a new beginning or change. It’s about declaring the start of something new that follows the end of something old.

Example in Context

Consider a situation where a company decides to terminate a product line (“kündigen”). The announcement of this decision (“ankündigen”) marks the beginning of a new phase for the company, such as the introduction of a new product line or strategy. Here, “ankündigen” does not just communicate the termination but also sets the stage for what is to come next.

Memory Tips

  • Visualize a Door: Imagine closing one door (“kündigen”) and immediately turning to open another (“ankündigen”). The act of announcing is like opening that new door.

  • Think of a Sequel: When a film ends, the announcement of a sequel is akin to “ankündigen.” It signals the start of a new narrative following the conclusion of the previous one.

By visualizing the transition from ending to beginning and understanding “an-” as a marker of initiation, “ankündigen” can be seen as a natural and intuitive extension of “kündigen.” This conceptual connection helps grasp the transformation effected by the prefix and aids in memorizing the usage of these verbs in German.