salin dan tempel tab di antara jendela terminal di X11

11

Ketika saya menyalin dan menempelkan teks menggunakan pilihan mouse X11 antara dua jendela terminal, tab sering, tetapi tidak selalu, dikonversi ke spasi. Ini tampaknya tergantung pada aplikasi terminal yang terlibat dan program yang berjalan di dalamnya.

Inilah yang saya temukan melalui eksperimen:

  • Itu hanya tergantung pada apa yang berjalan di sisi sumber (copy). Sisi target (tempel) akan menempelkan tab tidak peduli apa yang sedang berjalan, jika sumber melestarikannya.
  • Hanya gnome-terminaldi sisi sumber yang mempertahankan tab. xtermdan konsoletidak.
  • Tab hanya dipertahankan jika file tersebut telah menggunakan output cat. Aplikasi lain seperti less, vim, emacs, atau nanotidak melestarikan tab.

Apa penjelasan untuk ini? Apakah bug ini ada di konsoledan xterm, atau bisakah mereka dikonfigurasi secara berbeda? Bisakah lessdan semacamnya dikonfigurasikan untuk mempertahankan tab di output?

Peter Eisentraut
sumber

Jawaban:

3

Ya, pengamatan Anda benar. Apa yang terjadi ketika Anda menyalin-menempel adalah bahwa target memperoleh data dari sumber. Saat menampilkan tab Anda, xterm(dan konsole), tampaknya, menerjemahkannya ke spasi sendiri (jika aplikasi yang berjalan di dalam terminal belum melakukannya). Jadi, ketika permintaan datang untuk teks yang dipilih, yang mereka tawarkan hanyalah spasi.

Saya bahkan samar-samar ingat respon dari xterm-maintainer tahun lalu, mengklaim itu akan sangat sulit untuk diperbaiki ...

Saya tidak yakin, bagaimana gnome-terminal melakukan hal yang benar, tapi saya senang mereka melakukannya :) Alternatif lain adalah menggunakan gvim(versi grafis vim) - daripada menjalankan vimdi dalam aplikasi terminal - Anda dapat dengan aman menyalin-menempel dari gvim , tanpa kehilangan tab.

Mikhail T.
sumber
0

Ini kadang-kadang bisa menjadi masalah, terutama Makefilesyang membutuhkan tab. Sayangnya, masalah dengan program yang berbeda tidak terkait. Masing-masing mungkin akan memiliki solusi yang sangat berbeda.

Untuk vim, Anda harus membentuk sebelumnya :set noexpandtabatau menempatkan set noexpandtabdalam ~/.vimrcfile Anda . Jika Anda hanya menginginkan tipe file tertentu yang telah noexpandtabditetapkan maka Anda dapat melakukan autocommand di Anda, ~/.vimrcsaya memiliki yang berikut di tambang:

"indenting defaults: 4 spaces for an indent
set shiftwidth=4
set softtabstop=4
set expandtab

"exceptions to indenting for specific languages and files--------
"for shell scripts: 2 spaces for an indent
autocmd filetype sh setlocal shiftwidth=2
autocmd filetype sh setlocal softtabstop=2

"for Makefiles: use tabs for indents
autocmd filetype make setlocal tabstop=8
autocmd filetype make setlocal noexpandtab

Ini akan menetapkan default 4 spasi untuk tab vimdan membuat pengecualian untuk skrip shell dan Makefiles.

Untuk program lain seperti less, coba lihat halaman manual di sana. Mereka mungkin memiliki file konfigurasi, variabel lingkungan, atau opsi baris perintah untuk apa yang Anda butuhkan. Melihat halaman manual yang lebih sedikit:

-xn,... or --tabs=n,...
       Sets tab stops.  If only one n is specified, tab stops  are  set
       at  multiples  of n.  If multiple values separated by commas are
       specified, tab stops are set at those positions, and  then  con-
       tinue  with  the  same  spacing  as  the last two.  For example,
       -x9,17 will set tabs at positions  9,  17,  25,  33,  etc.   The
       default for n is 8.

Apa yang Anda perhatikan bukanlah bug. "Ini fitur." Satu-satunya masalah adalah Anda perlu tahu cara mematikannya.

Sudo Bash
sumber
2
less -xnmengkonfigurasinya untuk menggunakan n spasi daripada karakter tab. -Umenjadikannya tampilan tab sebagai ^I. Saya belum menemukan cara untuk membuatnya memancarkan karakter tab literal sehingga menyalin teks akan menempelkan karakter tab, tapi saya ingin tahu caranya.
Matt McClure
Perlu dicatat bahwa di Roff ( troff& nroff), tabstop dapat diatur secara independen satu sama lain, seperti toolbar "penggaris" dalam pengolah kata modern (OpenOffice, Microsoft Word, et al). Namun, halaman manual jarang menggunakan penghentian tab kustom.
mandoc(1)juga memungkinkan pengguna untuk mengganti lebar lekukan default dari baris perintah, menggunakan -O indent=N(default ke 5 kolom).